1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
odoo.define('mail/static/src/components/thread_icon/thread_icon_tests.js', function (require) {
'use strict';
const components = {
ThreadIcon: require('mail/static/src/components/thread_icon/thread_icon.js'),
};
const {
afterEach,
afterNextRender,
beforeEach,
createRootComponent,
start,
} = require('mail/static/src/utils/test_utils.js');
QUnit.module('mail', {}, function () {
QUnit.module('components', {}, function () {
QUnit.module('thread_icon', {}, function () {
QUnit.module('thread_icon_tests.js', {
beforeEach() {
beforeEach(this);
this.createThreadIcon = async thread => {
await createRootComponent(this, components.ThreadIcon, {
props: { threadLocalId: thread.localId },
target: this.widget.el
});
};
this.start = async params => {
const { env, widget } = await start(Object.assign({}, params, {
data: this.data,
}));
this.env = env;
this.widget = widget;
};
},
afterEach() {
afterEach(this);
},
});
QUnit.test('chat: correspondent is typing', async function (assert) {
assert.expect(5);
this.data['res.partner'].records.push({
id: 17,
im_status: 'online',
name: 'Demo',
});
this.data['mail.channel'].records.push({
channel_type: 'chat',
id: 20,
members: [this.data.currentPartnerId, 17],
});
await this.start();
const thread = this.env.models['mail.thread'].findFromIdentifyingData({
id: 20,
model: 'mail.channel',
});
await this.createThreadIcon(thread);
assert.containsOnce(
document.body,
'.o_ThreadIcon',
"should have thread icon"
);
assert.containsOnce(
document.body,
'.o_ThreadIcon_online',
"should have thread icon with partner im status icon 'online'"
);
// simulate receive typing notification from demo "is typing"
await afterNextRender(() => {
const typingData = {
info: 'typing_status',
is_typing: true,
partner_id: 17,
partner_name: "Demo",
};
const notification = [[false, 'mail.channel', 20], typingData];
this.widget.call('bus_service', 'trigger', 'notification', [notification]);
});
assert.containsOnce(
document.body,
'.o_ThreadIcon_typing',
"should have thread icon with partner currently typing"
);
assert.strictEqual(
document.querySelector('.o_ThreadIcon_typing').title,
"Demo is typing...",
"title of icon should tell demo is currently typing"
);
// simulate receive typing notification from demo "no longer is typing"
await afterNextRender(() => {
const typingData = {
info: 'typing_status',
is_typing: false,
partner_id: 17,
partner_name: "Demo",
};
const notification = [[false, 'mail.channel', 20], typingData];
this.widget.call('bus_service', 'trigger', 'notification', [notification]);
});
assert.containsOnce(
document.body,
'.o_ThreadIcon_online',
"should have thread icon with partner im status icon 'online' (no longer typing)"
);
});
});
});
});
});
|