diff options
Diffstat (limited to 'addons/mail/static/tests/thread_window/basic_thread_window_tests.js')
| -rw-r--r-- | addons/mail/static/tests/thread_window/basic_thread_window_tests.js | 856 |
1 files changed, 0 insertions, 856 deletions
diff --git a/addons/mail/static/tests/thread_window/basic_thread_window_tests.js b/addons/mail/static/tests/thread_window/basic_thread_window_tests.js deleted file mode 100644 index 61414d2aeaa..00000000000 --- a/addons/mail/static/tests/thread_window/basic_thread_window_tests.js +++ /dev/null @@ -1,856 +0,0 @@ -odoo.define('mail.basicThreadWindowTests', function (require) { -"use strict"; - -var mailTestUtils = require('mail.testUtils'); - -var FormView = require('web.FormView'); -var framework = require('web.framework'); -var testUtils = require('web.test_utils'); -var Widget = require('web.Widget'); - -QUnit.module('mail', {}, function () { -QUnit.module('Thread Window', {}, function () { -QUnit.module('Basic', { - beforeEach: function () { - var self = this; - - // define channel to link to chat window - this.data = { - 'mail.channel': { - fields: { - name: { - string: "Name", - type: "char", - required: true, - }, - channel_type: { - string: "Channel Type", - type: "selection", - }, - channel_message_ids: { - string: "Messages", - type: "many2many", - relation: 'mail.message' - }, - message_unread_counter: { - string: "Amount of Unread Messages", - type: "integer" - }, - }, - records: [], - }, - 'mail.message': { - fields: {}, - records: [], - }, - initMessaging: { - channel_slots: { - channel_channel: [{ - id: 1, - channel_type: "channel", - name: "general", - }], - }, - }, - }; - this.services = mailTestUtils.getMailServices(); - this.ORIGINAL_THREAD_WINDOW_APPENDTO = this.services.mail_service.prototype.THREAD_WINDOW_APPENDTO; - - this.createParent = async function (params) { - var widget = new Widget(); - - // in non-debug mode, append thread windows in qunit-fixture - // note that it does not hide thread window because it uses fixed - // position, and qunit-fixture uses absolute... - if (params.debug) { - self.services.mail_service.prototype.THREAD_WINDOW_APPENDTO = 'body'; - } else { - self.services.mail_service.prototype.THREAD_WINDOW_APPENDTO = '#qunit-fixture'; - } - - await testUtils.mock.addMockEnvironment(widget, params); - return widget; - }; - }, - afterEach: function () { - // reset thread window append to body - this.services.mail_service.prototype.THREAD_WINDOW_APPENDTO = 'body'; - }, -}); - -QUnit.test('basic rendering thread window', async function (assert) { - assert.expect(10); - - var parent = await this.createParent({ - data: this.data, - services: this.services, - }); - - await testUtils.nextTick(); - // detach channel 1, so that it opens corresponding thread window. - var result = parent.call('mail_service', 'getChannel', 1); - await testUtils.nextTick(); - result.detach(); - - await testUtils.nextTick(); - var $threadWindow = $('.o_thread_window'); - assert.strictEqual($threadWindow.length, 1, - "thread window should be open"); - assert.strictEqual($threadWindow.data('thread-id'), 1, - "thread window should be related to thread ID 1"); - - var $header = $threadWindow.find('.o_thread_window_header'); - assert.strictEqual($header.length, 1, - "thread window should have a header"); - - var $title = $header.find('.o_thread_window_title'); - assert.strictEqual($title.length, 1, - "thread window should have a title in the header"); - assert.strictEqual($title.text().trim(), "#general", - "should have the title of the general channel"); - - var $buttons = $header.find('.o_thread_window_buttons'); - assert.strictEqual($buttons.length, 1, - "should have buttons in the header of the thread window"); - assert.strictEqual($buttons.find('.o_thread_window_expand').length, 1, - "should have a button to expand the thread window"); - assert.strictEqual($buttons.find('.o_thread_window_close').length, 1, - "should have a button to close the thread window"); - - assert.strictEqual($threadWindow.find('.o_mail_thread').length, 1, - "should display the content of the general channel in the thread window"); - assert.strictEqual($threadWindow.find('.o_thread_composer').length, 1, - "should display a composer in the thread window"); - - parent.destroy(); -}); - -QUnit.test('close thread window using ESCAPE key', async function (assert) { - assert.expect(5); - - var parent = await this.createParent({ - data: this.data, - services: this.services, - mockRPC: function (route, args) { - if (args.method === 'channel_fold') { - assert.ok(true, "should call channel_fold"); - return Promise.resolve(); - } - return this._super.apply(this, arguments); - }, - }); - await testUtils.nextTick(); - - // get channel instance to link to thread window - var channel = parent.call('mail_service', 'getChannel', 1); - await testUtils.nextTick(); - assert.ok(channel, "there should exist a channel locally with ID 1"); - - channel.detach(); - await testUtils.nextTick(); - assert.strictEqual($('.o_thread_window').length, 1, - "there should be a thread window that is opened"); - - // focus on the thread window and press ESCAPE - await testUtils.dom.click($('.o_thread_window .o_composer_text_field')); - assert.strictEqual(document.activeElement, - $('.o_thread_window .o_composer_text_field')[0], - "thread window's input should now be focused"); - - var upKeyEvent = $.Event( "keyup", { which: 27 }); - await testUtils.dom.triggerEvents($('.o_thread_window .o_composer_text_field'), [upKeyEvent]); - - assert.strictEqual($('.o_thread_window').length, 0, - "the thread window should be closed"); - - parent.destroy(); -}); - -QUnit.test('thread window\'s input can still be focused when the UI is blocked', async function (assert) { - assert.expect(2); - - var parent = await this.createParent({ - data: this.data, - services: this.services, - }); - - var $dom = $('#qunit-fixture'); - - // get channel instance to link to thread window - await testUtils.nextTick(); - var channel = parent.call('mail_service', 'getChannel', 1); - await testUtils.nextTick(); - channel.detach(); - await testUtils.nextTick(); - var $input = $('<input/>', {type: 'text'}).appendTo($dom); - await testUtils.dom.click($input.focus()); - assert.strictEqual(document.activeElement, $input[0], - "fake input should be focused"); - - framework.blockUI(); - // cannot force focus here otherwise the test - // makes no sense, this test is just about - // making sure that the code which forces the - // focus on click is not removed - await testUtils.dom.click($('.o_thread_window .o_composer_text_field')); - assert.strictEqual(document.activeElement, - $('.o_thread_window .o_composer_text_field')[0], - "thread window's input should now be focused"); - - framework.unblockUI(); - parent.destroy(); - $input.remove(); -}); - -QUnit.test('emoji popover should open correctly in thread windows', async function (assert) { - assert.expect(1); - - var parent = await this.createParent({ - data: this.data, - services: this.services, - }); - - // get channel instance to link to thread window - await testUtils.nextTick(); - var channel = parent.call('mail_service', 'getChannel', 1); - await testUtils.nextTick(); - channel.detach(); - await testUtils.nextTick(); - var $emojiButton = $('.o_composer_button_emoji'); - await testUtils.dom.click($emojiButton.trigger('focusin').focus()); - var $popover = $('.o_mail_emoji_container'); - - assert.ok($popover.is(':visible'), "emoji popover should have stayed opened"); - parent.destroy(); -}); - -QUnit.test('do not increase unread counter when receiving message with myself as author', async function (assert) { - assert.expect(4); - - var parent = await this.createParent({ - data: this.data, - services: this.services, - session: { partner_id: 3 } - }); - - // get channel instance to link to thread window - await testUtils.nextTick(); - var channel = parent.call('mail_service', 'getChannel', 1); - await testUtils.nextTick(); - channel.detach(); - await testUtils.nextTick(); - var threadWindowHeaderText = $('.o_thread_window_header').text().replace(/\s/g, ""); - - assert.strictEqual(threadWindowHeaderText, "#general", - "thread window header text should not have any unread counter initially"); - assert.strictEqual(channel.getUnreadCounter(), 0, - "thread should have unread counter to 0 initially"); - - // simulate receiving message from myself - var messageData = { - author_id: [3, "Myself"], - body: "<p>Test message</p>", - id: 2, - model: 'mail.channel', - res_id: 1, - channel_ids: [1], - }; - var notification = [[false, 'mail.channel', 1], messageData]; - parent.call('bus_service', 'trigger', 'notification', [notification]); - - await testUtils.nextTick(); - threadWindowHeaderText = $('.o_thread_window_header').text().replace(/\s/g, ""); - - assert.strictEqual(threadWindowHeaderText, "#general", - "thread window header text should not have any unread counter after receiving my message"); - assert.strictEqual(channel.getUnreadCounter(), 0, - "thread should not have incremented its unread counter after receiving my message"); - - parent.destroy(); -}); - -QUnit.test('do not increment unread counter with focus on thread window', async function (assert) { - // 'hard' focus means that the user has clicked on the thread window in - // order to set the focus on it. - assert.expect(2); - - var parent = await this.createParent({ - data: this.data, - services: this.services, - session: { partner_id: 3 } - }); - - // get channel instance to link to thread window - await testUtils.nextTick(); - var channel = parent.call('mail_service', 'getChannel', 1); - await testUtils.nextTick(); - channel.detach(); - await testUtils.nextTick(); - - assert.strictEqual(channel.getUnreadCounter(), 0, - "thread should have unread counter to 0 initially"); - - // hard focus on thread window composer - await testUtils.dom.click($('.o_composer_text_field')); - - // simulate receiving message from someone else - var messageData = { - author_id: [5, "Someone else"], - body: "<p>Test message</p>", - id: 2, - model: 'mail.channel', - res_id: 1, - channel_ids: [1], - }; - var notification = [[false, 'mail.channel', 1], messageData]; - parent.call('bus_service', 'trigger', 'notification', [notification]); - await testUtils.nextTick(); - - assert.strictEqual(channel.getUnreadCounter(), 0, - "thread should not have incremented its unread counter after receiving the message"); - - parent.destroy(); -}); - -QUnit.test('do not mark as read the newly open thread window from received message', async function (assert) { - assert.expect(5); - - this.data['mail.channel'].records = [{ - id: 2, - name: "DM", - channel_type: "chat", - message_unread_counter: 0, - }]; - - var parent = await this.createParent({ - data: this.data, - services: this.services, - session: { partner_id: 3 }, - mockRPC: function (route, args) { - if (args.method === 'channel_join_and_get_info') { - this.data['mail.channel'].records[0].state = 'open'; - this.data['mail.channel'].records[0].is_minimized = true; - return Promise.resolve(this.data['mail.channel'].records[0]); - } - return this._super.apply(this, arguments); - }, - }); - - assert.strictEqual($('.o_thread_window').length, 0, - "no thread window should be open initially"); - - // simulate receiving message from someone else in DM - var messageData = { - author_id: [5, "Someone else"], - body: "<p>Test message</p>", - id: 2, - model: 'mail.channel', - res_id: 1, - channel_ids: [2], - }; - var notification = [[false, 'mail.channel', 1], messageData]; - // Unread counter is obtained from fetched channel data, because this is - // a new message from a new channel. - this.data['mail.channel'].records[0].message_unread_counter++; - parent.call('bus_service', 'trigger', 'notification', [notification]); - await testUtils.nextTick(); - var $threadWindow = $('.o_thread_window'); - assert.strictEqual($threadWindow.length, 1, - "a thread window should be open after receiving a new message on a new DM chat"); - assert.strictEqual($threadWindow.data('thread-id'), 2, - "open thread window should be related to DM chat"); - assert.strictEqual($threadWindow.find('.o_thread_window_title').text().replace(/\s/g, ''), '#DM(1)', - "open DM chat window should have one unread message"); - - await testUtils.dom.click($threadWindow.find('.o_thread_composer')); - assert.strictEqual($threadWindow.find('.o_thread_window_title').text().replace(/\s/g, ''), '#DM', - "open DM chat window should have message marked as read on composer focus"); - - parent.destroy(); -}); - -QUnit.test('show document link of message linked to a document', async function (assert) { - assert.expect(6); - - this.data['mail.channel'].records = [{ - id: 2, - name: "R&D Tasks", - channel_type: "channel", - }]; - this.data['mail.message'].records.push({ - author_id: [5, "Someone else"], - body: "<p>Test message</p>", - id: 40, - model: 'some.document', - record_name: 'Some Document', - res_id: 10, - channel_ids: [2], - }); - - this.data.initMessaging.channel_slots.channel_channel.push({ - id: 2, - name: "R&D Tasks", - channel_type: "public", - }); - - var parent = await this.createParent({ - data: this.data, - services: this.services, - session: { partner_id: 3 }, - }); - - assert.strictEqual($('.o_thread_window').length, 0, - "no thread window should be open initially"); - - // get channel instance to link to thread window - await testUtils.nextTick(); - var channel = parent.call('mail_service', 'getChannel', 2); - await testUtils.nextTick(); - channel.detach(); - await testUtils.nextTick(); - - var $threadWindow = $('.o_thread_window'); - assert.strictEqual($threadWindow.length, 1, - "a thread window should be open"); - assert.strictEqual($threadWindow.find('.o_thread_window_title').text().trim(), - "#R&D Tasks", - "should be thread window of correct channel"); - assert.strictEqual($threadWindow.find('.o_thread_message').length, 1, - "should contain a single message in thread window"); - assert.ok($threadWindow.find('.o_mail_info').text().replace(/\s/g, "").indexOf('Someoneelse') !== -1, - "message should be from 'Someone else' user"); - assert.ok($threadWindow.find('.o_mail_info').text().replace(/\s/g, "").indexOf('onSomeDocument') !== -1, - "message should link to 'Some Document'"); - - parent.destroy(); -}); - -QUnit.test('do not autofocus chat window on receiving new direct message', async function (assert) { - // Receiving a message doesn't make other input loose focus - assert.expect(3); - - this.data.partner = { - fields: { - display_name: { string: "Displayed name", type: "char" }, - }, - records: [{ - id: 1, - display_name: "first record", - }], - }; - - this.data['mail.channel'].records = [{ - id: 2, - name: "DM", - channel_type: "chat", - message_unread_counter: 0, - direct_partner: [{ id: 666, name: 'DemoUser1', im_status: '' }], - }]; - - var form = await testUtils.createView({ - View: FormView, - model: 'partner', - data: this.data, - arch: '<form string="Partners">' + - '<field name="display_name" />' + - '</form>', - res_id: 1, - services: mailTestUtils.getMailServices(), - viewOptions: { - mode: 'edit', - }, - mockRPC: function (route, args) { - if (args.method === 'channel_join_and_get_info') { - return Promise.resolve(this.data['mail.channel'].records[0]); - } - return this._super.apply(this, arguments); - } - }); - - var $formInput = form.$('input[name=display_name]'); - $formInput.focus(); - - assert.equal(document.activeElement, $formInput[0], - 'The form input should have the focus'); - - // simulate receiving message from someone else - var messageData = { - author_id: [5, "Someone else"], - body: "<p>Test message</p>", - id: 2, - model: 'mail.channel', - res_id: 1, - channel_ids: [2], - }; - - this.data['mail.message'].records.push(messageData); - var notification = [[false, 'mail.channel', 2], messageData]; - form.call('bus_service', 'trigger', 'notification', [notification]); - await testUtils.nextTick(); - assert.ok($('.o_thread_window.o_in_home_menu').length, - 'Chat window is opened'); - - assert.equal(document.activeElement, $formInput[0], - 'The form input should have kept the focus on message received'); - - form.destroy(); -}); - -QUnit.test('do not auto-focus chat window on receiving new message from new DM', async function (assert) { - assert.expect(10); - - var self = this; - this.data['mail.channel'].records = [{ - id: 2, - name: "DM", - channel_type: "chat", - message_unread_counter: 1, - direct_partner: [{ id: 666, name: 'DemoUser1', im_status: '' }], - is_minimized: false, - state: 'open', - }]; - - var parent = await this.createParent({ - data: this.data, - services: this.services, - session: { partner_id: 3 }, - mockRPC: function (route, args) { - if (args.method === 'channel_join_and_get_info') { - return Promise.resolve(_.extend({}, self.data['mail.channel'].records[0], { info: 'join' })); - } - if (args.method === 'channel_minimize') { - _.extend(self.data['mail.channel'].records[0], { - is_minimized: true, - state: 'open', - }); - } - if (args.method === 'channel_seen') { - throw new Error('should not mark channel as seen'); - } - return this._super.apply(this, arguments); - } - }); - - assert.strictEqual($('.o_thread_window').length, 0, - "should not have any DM window open"); - - // simulate receiving message from someone else - var messageData = { - author_id: [5, "Someone else"], - body: "<p>Test message</p>", - id: 2, - model: 'mail.channel', - res_id: 2, - channel_ids: [2], - }; - this.data['mail.message'].records.push(messageData); - var notification = [[false, 'mail.channel', 2], messageData]; - parent.call('bus_service', 'trigger', 'notification', [notification]); - await testUtils.nextTick(); - - assert.strictEqual($('.o_thread_window').length, 1, - "should have DM window open"); - assert.strictEqual($('.o_thread_window .o_input:focus').length, 0, - "thread window should not have the focus on auto-open"); - assert.ok($('.o_thread_window .o_thread_window_title').text().indexOf('(1)') !== -1, - "DM should display one unread message"); - - // simulate receiving join DM notification (cross-tab synchronization) - var dmInfo = _.extend({}, self.data['mail.channel'].records[0], { - info: 'join', - is_minimized: false, - state: 'open', - }); - notification = [[false, 'res.partner', 3], dmInfo]; - parent.call('bus_service', 'trigger', 'notification', [notification]); - await testUtils.nextTick(); - - assert.strictEqual($('.o_thread_window').length, 1, - "should still have DM window open after receiving DM info from polling"); - assert.strictEqual($('.o_thread_window .o_input:focus').length, 0, - "thread window should still not have the focus after receiving DM info from polling"); - assert.ok($('.o_thread_window .o_thread_window_title').text().indexOf('(1)') !== -1, - "DM should still display one unread message after receiving DM info from polling"); - - // simulate receiving detached DM notification (cross-tab synchronization) - notification = [[false, 'res.partner', 3], self.data['mail.channel'].records[0]]; - parent.call('bus_service', 'trigger', 'notification', [notification]); - await testUtils.nextTick(); - - assert.strictEqual($('.o_thread_window').length, 1, - "should still have DM open after receiving detached info from polling"); - assert.strictEqual($('.o_thread_window .o_input:focus').length, 0, - "thread window should still not have the focus after receiving detached info from polling"); - assert.ok($('.o_thread_window .o_thread_window_title').text().indexOf('(1)') !== -1, - "DM should not still have one unread message after receiving detached info from polling"); - - parent.destroy(); -}); - -QUnit.test('no out-of-office status in thread window', async function (assert) { - assert.expect(1); - this.data.initMessaging = { - channel_slots: { - channel_channel: [{ - id: 1, - name: "DM", - channel_type: "chat", - message_unread_counter: 0, - direct_partner: [{ id: 666, name: 'DemoUser1', im_status: 'online'}], - }], - }, - }; - var parent = await this.createParent({ - data: this.data, - services: this.services, - }); - await testUtils.nextTick(); - - // detach channel 1, so that it opens corresponding thread window. - var channel = parent.call('mail_service', 'getChannel', 1); - await testUtils.nextTick(); - channel.detach(); - await testUtils.nextTick(); - - var $threadWindow = $('.o_thread_window'); - assert.containsNone($threadWindow, '.o_out_of_office_text'); - - parent.destroy(); -}); - -QUnit.test('receive 2 new DM messages in quick succession (no chat window initially)', async function (assert) { - assert.expect(3); - - const self = this; - this.data['mail.channel'].records = [{ - channel_type: "chat", - direct_partner: [{ - id: 5, - name: 'Someone else', - im_status: 'online', - }], - id: 10, - is_minimized: false, - message_unread_counter: 1, - name: "DM", - state: 'open', - }]; - - this.data.initMessaging.channel_slots = { - channel_direct_message: [{ - channel_type: 'chat', - direct_partner: [{ - id: 5, - name: 'Someone else', - im_status: 'online', - }], - id: 10, - message_unread_counter: 0, - name: "DM", - }], - }; - - const parent = await this.createParent({ - data: this.data, - mockRPC(route, args) { - if (args.method === 'channel_minimize') { - Object.assign(self.data['mail.channel'].records[0], { - is_minimized: true, - state: 'open', - }); - } - return this._super(...arguments); - }, - services: this.services, - session: { - partner_id: 3, - }, - }); - - await testUtils.nextTick(); - assert.containsNone( - $, - '.o_thread_window', - "should not have any DM window open"); - - // simulate receiving 2 new messages from someone else in quick succession - const messageData1 = { - author_id: [5, "Someone else"], - body: "<p>Test message1</p>", - channel_ids: [10], - id: 2, - model: 'mail.channel', - res_id: 10, - }; - this.data['mail.message'].records.push(messageData1); - const notification1 = [[false, 'mail.channel', 2], messageData1]; - parent.call('bus_service', 'trigger', 'notification', [notification1]); - // simulate short delay for receiving new message - await testUtils.nextMicrotaskTick(); - const messageData2 = { - author_id: [5, "Someone else"], - body: "<p>Test message2</p>", - channel_ids: [10], - id: 3, - model: 'mail.channel', - res_id: 10, - }; - this.data['mail.message'].records.push(messageData2); - const notification2 = [[false, 'mail.channel', 2], messageData2]; - parent.call('bus_service', 'trigger', 'notification', [notification2]); - await testUtils.nextTick(); - assert.containsOnce( - $, - '.o_thread_window', - "should have DM window open"); - assert.containsN( - $('.o_thread_window'), - '.o_thread_message', - 2, - "should have 2 messages in chat window"); - - parent.destroy(); -}); - -QUnit.test('non-deletable message attachments', async function (assert) { - assert.expect(3); - - this.data['mail.channel'].records = [{ - id: 1, - name: "General", - channel_type: 'channel', - }]; - this.data['mail.message'].records = [{ - attachment_ids: [{ - filename: "text.txt", - id: 250, - mimetype: 'text/plain', - name: "text.txt", - }, { - filename: "image.png", - id: 251, - mimetype: 'image/png', - name: "image.png", - }], - author_id: [5, "Demo User"], - body: "<p>test</p>", - channel_ids: [1], - id: 100, - model: 'mail.channel', - record_name: "general", - res_id: 1, - }]; - const parent = await this.createParent({ - data: this.data, - services: this.services, - }); - await testUtils.nextTick(); - const channel = parent.call('mail_service', 'getChannel', 1); - channel.detach(); - await testUtils.nextTick(); - assert.containsOnce( - $, - '.o_thread_window', - "a thread window should be open"); - assert.containsN( - $('.o_thread_window'), - '.o_attachment', - 2, - "thread window should have 2 attachments"); - assert.containsNone( - $('.o_thread_window .o_attachment'), - 'o_attachment_delete_cross', - "attachments should not be deletable"); - - parent.destroy(); -}); - -QUnit.test('join channel from click channel mention', async function (assert) { - assert.expect(10); - - this.data['mail.channel'].records = [{ - id: 2, - name: "R&D Tasks", - channel_type: "channel", - }]; - this.data['mail.message'].records.push({ - author_id: [5, "Someone else"], - body: `<p><a href="#" class="o_mail_redirect" data-oe-id="2" data-oe-model="mail.channel">#R&D Tasks</a></p>`, - id: 10, - res_id: 1, - channel_ids: [1], - }); - - const parent = await this.createParent({ - data: this.data, - services: this.services, - session: { partner_id: 3 }, - async mockRPC(route, args) { - if (args.method === 'channel_join_and_get_info') { - const channelID = args.args[0][0]; - assert.step(`channel_join_and_get_info:${channelID}`); - return this.data['mail.channel'].records.find(channel => channel.id === channelID); - } - return this._super(...arguments); - }, - }); - await testUtils.nextTick(); - assert.containsNone( - $, - '.o_thread_window', - "no thread window should be open initially" - ); - - // get channel instance to link to thread window - const channel = parent.call('mail_service', 'getChannel', 1); - channel.detach(); - await testUtils.nextTick(); - assert.containsOnce( - $, - '.o_thread_window', - "should have one thread open in chat window" - ); - assert.strictEqual( - $('.o_thread_window .o_thread_window_title').text().trim(), - "#general", - "should have thread '#general' as open in chat window" - ); - assert.containsOnce( - $, - '.o_thread_window .o_thread_message', - "should contain a single message in chat window" - ); - assert.containsOnce( - $, - '.o_thread_window .o_thread_message a.o_mail_redirect', - "message should have a mention" - ); - assert.containsOnce( - $, - '.o_thread_window .o_thread_message a.o_mail_redirect[data-oe-id="2"][data-oe-model="mail.channel"]', - "message should have a channel mention to R&D Task" - ); - - await testUtils.dom.click($('.o_thread_window .o_thread_message a.o_mail_redirect[data-oe-id="2"][data-oe-model="mail.channel"]')); - assert.verifySteps( - ['channel_join_and_get_info:2'], - "should have joined channel #R&D Task" - ); - assert.containsN( - $, - '.o_thread_window', - 2, - "should now have 2 threads open in chat windows after cliking on channel mention" - ); - assert.strictEqual( - $('.o_thread_window .o_thread_window_title').text().replace(/\s/g, ""), - "#general#R&DTasks", - "should have threads '#general' and '#R&D Tasks' as open in chat windows" - ); - - parent.destroy(); -}); - -}); -}); -}); |
