Files
odoo_source/addons/mail/static/tests/discuss_moderation_tests.js
T
Géry Debongnie abf32b8b21 [REF] *: update js test suite to use helpers
This rev. introduces robust helpers to use in the JS tests suite to
interact with DOM and components, and starts using them (almost)
everywhere.

All the helpers are exposed though testUtils.js.

There are 2 kinds of helpers:

1. Assertions
-------------
 * assert.containsNone, containsN, containsOnce check that the DOM
   (or a specific part of the DOM) contains a `selector`. It
   generates a correct error message automatically.
    ex: assert.strictEqual(form.$('.o_form_editable'), 1, "msg");
        -> assert.containsOnce(form, '.o_form_editable');
 * assert.isVisible, isNotVisible check that the DOM has an element
   visible or not. They also check that the element is actually in
   the DOM (before most tests didn't verify this).
 * assert.hasClass, doesNotHaveClass, hasAttrVAlue, check specific
   properties of a DOM element, and also validate that it is
   applied on a single existing DOM element (before most tests
   didn't verify this).
    ex: assert.notOk(form.$('button').hasClass('btn-primary'));
       -> assert.doesNotHaveClass(form.$('button'), 'btn-primary');

2. Utilities
------------
The goal of the utilities is to centralize the definition of many
standard components and interactions, ensuring that when we
refactor the JS framework, we do not need to change all the tests.

Existing mock utilities (addMockEnvironment, intercept, path,
patchDate, unpatch and fieldsViewGet) are moved to
'testUtils.mock.*'.
Existing DOM utilities are moved to 'testUtils.dom.*'.
New dom utilities are created for opendDatePicker, click,
clickFirst and clickLast. Helper `click` verifies that there is
exactly 1 element visible in the DOM you click on, `clickFirst`
and `clickLast` verify that there are more than one element on the
DOM.
 ex: form.$('button').click();
     -> testUtils.dom.click(form.$('button'));

New Form utilities: (testUtils.form.*)
 clickEdit, clickSave, clickCreate, clickDiscard, all clicks on
 the control panel buttons of the form.
 `reload` reloads the form data.

New modal, graph, kanban and pivot utils (testUtils.pivot.*,
testUtils.kanban.*, etc.).

New fields utils: (testUtils.fields.*)
 * editInput, editSelect: allow to change the value of a field,
   using a selector to identify it. They validate that the input
   exists and trigger the change event automatically.
 * editAndTrigger: allow to modify a field and trigger specific
   events after the value change
 * many2one (testUtils.fields.many2one.*)
   clickOpenDropdown, clickHighlightedItem, clickItem,
   searchAndClickItem: use a field name instead of a selector and
   do all the complex mechanism to open, filter and highlight
   many2one fields.

Joint work with aab, dam, ged, mge, svs and vsc.
2018-11-19 11:24:28 +00:00

845 lines
33 KiB
JavaScript

odoo.define('mail.discuss_moderation_tests', function (require) {
"use strict";
var Thread = require('mail.model.Thread');
var mailTestUtils = require('mail.testUtils');
var testUtils = require('web.test_utils');
var createDiscuss = mailTestUtils.createDiscuss;
QUnit.module('mail', {}, function () {
QUnit.module('Discuss (Moderation)', {
beforeEach: function () {
// patch _.debounce and _.throttle to be fast and synchronous
this.underscoreDebounce = _.debounce;
this.underscoreThrottle = _.throttle;
_.debounce = _.identity;
_.throttle = _.identity;
this.data = {
'mail.message': {
fields: {
body: {
string: "Contents",
type: 'html',
},
author_id: {
string: "Author",
relation: 'res.partner',
},
channel_ids: {
string: "Channels",
type: 'many2many',
relation: 'mail.channel',
},
starred: {
string: "Starred",
type: 'boolean',
},
needaction: {
string: "Need Action",
type: 'boolean',
},
starred_partner_ids: {
string: "partner ids",
type: 'integer',
},
model: {
string: "Related Document model",
type: 'char',
},
res_id: {
string: "Related Document ID",
type: 'integer',
},
need_moderation: {
string: "Need moderation",
type: 'boolean',
},
moderation_status: {
string: "Moderation Status",
type: 'integer',
selection: [
['pending_moderation', 'Pending Moderation'],
['accepted', 'Accepted'],
['rejected', 'Rejected']
],
},
},
},
};
this.services = mailTestUtils.getMailServices();
},
afterEach: function () {
// unpatch _.debounce and _.throttle
_.debounce = this.underscoreDebounce;
_.throttle = this.underscoreThrottle;
}
});
QUnit.test('moderator: display moderation box', function (assert) {
assert.expect(1);
var done = assert.async();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
is_moderator: true,
};
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
})
.then(function (discuss) {
var moderationBoxSelector = '.o_mail_discuss_item' +
'[data-thread-id="mailbox_moderation"]';
assert.containsOnce(discuss, moderationBoxSelector,
"there should be a moderation mailbox");
discuss.destroy();
done();
});
});
QUnit.test('moderator: moderated channel with pending moderation message', function (assert) {
assert.expect(33);
var done = assert.async();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
is_moderator: true,
moderation_counter: 1,
moderation_channel_ids: [1],
};
this.data['mail.message'].records = [{
author_id: [2, "Someone"],
body: "<p>test</p>",
id: 100,
model: 'mail.channel',
moderation_status: 'pending_moderation',
need_moderation: true,
res_id: 1,
}];
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
})
.then(function (discuss) {
var $moderationBox = discuss.$(
'.o_mail_discuss_item' +
'[data-thread-id="mailbox_moderation"]');
var $mailboxCounter = $moderationBox.find('.o_mail_sidebar_needaction.badge');
assert.strictEqual($mailboxCounter.length, 1,
"there should be a counter next to the moderation mailbox in the sidebar");
assert.strictEqual($mailboxCounter.text().trim(), "1",
"the mailbox counter of the moderation mailbox should display '1'");
// 1. go to moderation mailbox
testUtils.dom.click($moderationBox);
var $message = discuss.$('.o_thread_message');
// check message
assert.strictEqual($message.length, 1,
"there should be one message in the moderation box");
assert.strictEqual($message.data('message-id'), 100,
"this message pending moderation should have correct ID");
assert.strictEqual($message.find('a[data-oe-id="1"]').text(), "#general",
"the message pending moderation should have correct origin as its linked document");
assert.strictEqual($message.find('.moderation_checkbox').length, 1,
"there should be a moderation checkbox next to the message");
assert.notOk($message.find('.moderation_checkbox').prop('checked'), false,
"the moderation checkbox should be unchecked by default");
// check moderation actions next to message
assert.containsN(discuss, '.o_thread_message_moderation', 5,
"there should be 5 contextual moderation decisions next to the message");
assert.containsOnce(discuss, '.o_thread_message_moderation[data-decision="accept"]',
"there should be a contextual moderation decision to accept the message");
assert.containsOnce(discuss, '.o_thread_message_moderation[data-decision="reject"]',
"there should be a contextual moderation decision to reject the message");
assert.containsOnce(discuss, '.o_thread_message_moderation[data-decision="discard"]',
"there should be a contextual moderation decision to discard the message");
assert.containsOnce(discuss, '.o_thread_message_moderation[data-decision="allow"]',
"there should be a contextual moderation decision to allow the user of the message)");
assert.containsOnce(discuss, '.o_thread_message_moderation[data-decision="ban"]',
"there should be a contextual moderation decision to ban the user of the message");
// check select all (enabled) / unselect all (disabled) buttons
assert.strictEqual($('.o_mail_discuss_button_select_all').length, 1,
"there should be a 'Select All' button in the control panel");
assert.doesNotHaveClass($('.o_mail_discuss_button_select_all'), 'disabled',
"the 'Select All' button should not be disabled");
assert.strictEqual($('.o_mail_discuss_button_unselect_all').length, 1,
"there should be a 'Unselect All' button in the control panel");
assert.hasClass($('.o_mail_discuss_button_unselect_all'),'disabled',
"the 'Unselect All' button should be disabled");
// check moderate all buttons (invisible)
var moderateAllSelector = '.o_mail_discuss_button_moderate_all';
assert.strictEqual($(moderateAllSelector).length, 3,
"there should be 3 buttons to moderate selected messages in the control panel");
assert.strictEqual($(moderateAllSelector + '[data-decision="accept"]').length, 1,
"there should one moderate button to accept messages pending moderation");
assert.hasClass($(moderateAllSelector + '[data-decision="accept"]'),'d-none',
'the moderate button "Accept" should be invisible by default');
assert.strictEqual($(moderateAllSelector + '[data-decision="reject"]').length, 1,
"there should one moderate button to reject messages pending moderation");
assert.hasClass($(moderateAllSelector + '[data-decision="reject"]'),'d-none',
'the moderate button "Reject" should be invisible by default');
assert.strictEqual($(moderateAllSelector + '[data-decision="discard"]').length, 1,
"there should one moderate button to discard messages pending moderation");
assert.hasClass($(moderateAllSelector + '[data-decision="discard"]'),'d-none',
'the moderate button "Discard" should be invisible by default');
// click on message moderation checkbox
testUtils.dom.click($message.find('.moderation_checkbox'));
assert.ok($message.find('.moderation_checkbox').prop('checked'),
"the moderation checkbox should become checked after click");
// check select all (disabled) / unselect all buttons (enabled)
assert.hasClass($('.o_mail_discuss_button_select_all'),'disabled',
"the 'Select All' button should be disabled");
assert.doesNotHaveClass($('.o_mail_discuss_button_unselect_all'), 'disabled',
"the 'Unselect All' button should not be disabled");
// check moderate all buttons updated (visible)
assert.doesNotHaveClass($(moderateAllSelector + '[data-decision="accept"]'), 'd-none',
'the moderate button "Accept" should become visible');
assert.doesNotHaveClass($(moderateAllSelector + '[data-decision="reject"]'), 'd-none',
'the moderate button "Reject" should become visible');
assert.doesNotHaveClass($(moderateAllSelector + '[data-decision="discard"]'), 'd-none',
'the moderate button "Discard" should become visible');
// 2. go to channel 'general'
testUtils.dom.click(discuss.$('.o_mail_discuss_item[data-thread-id="1"]'));
$message = discuss.$('.o_thread_message');
// check correct message
assert.strictEqual($message.length, 1,
"there should be one message in the general channel");
assert.strictEqual($message.data('message-id'), 100,
"this message should have correct ID");
assert.notOk($message.find('.moderation_checkbox').prop('checked'),
"the moderation checkbox should be unchecked by default");
// don't check moderation actions visibility, since it is similar to moderation box.
discuss.destroy();
done();
});
});
QUnit.test('moderator: accept pending moderation message', function (assert) {
assert.expect(12);
var done = assert.async();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
is_moderator: true,
moderation_counter: 1,
moderation_channel_ids: [1],
};
this.data['mail.message'].records = [{
author_id: [2, "Someone"],
body: "<p>test</p>",
channel_ids: [],
id: 100,
model: 'mail.channel',
moderation_status: 'pending_moderation',
need_moderation: true,
res_id: 1,
}];
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
mockRPC: function (route, args) {
if (args.method === 'moderate') {
assert.step('moderate');
var messageIDs = args.args[0];
var decision = args.args[1];
assert.strictEqual(messageIDs.length, 1, "should moderate one message");
assert.strictEqual(messageIDs[0], 100, "should moderate message with ID 100");
assert.strictEqual(decision, 'accept', "should accept the message");
}
return this._super.apply(this, arguments);
},
})
.then(function (discuss) {
// 1. go to moderation box
var $moderationBox = discuss.$(
'.o_mail_discuss_item' +
'[data-thread-id="mailbox_moderation"]');
testUtils.dom.click($moderationBox);
// check there is a message to moderate
var $message = discuss.$('.o_thread_message');
assert.strictEqual($message.length, 1,
"there should be one message in the moderation box");
assert.strictEqual($message.data('message-id'), 100,
"this message should have correct ID");
assert.strictEqual($message.find('.moderation_checkbox').length, 1,
"the message should have a moderation checkbox");
// accept the message pending moderation
testUtils.dom.click(discuss.$('.o_thread_message_moderation[data-decision="accept"]'));
assert.verifySteps(['moderate']);
// stop the fadeout animation and immediately remove the element
discuss.$('.o_thread_message').stop(false, true);
assert.containsNone(discuss, '.o_thread_message',
"should now have no message displayed in moderation box");
// 2. go to channel 'general'
testUtils.dom.click(discuss.$('.o_mail_discuss_item[data-thread-id="1"]'));
$message = discuss.$('.o_thread_message');
// check message is there and has no moderate checkbox
assert.strictEqual($message.length, 1,
"there should be one message in the general channel");
assert.strictEqual($message.data('message-id'), 100,
"this message should have correct ID");
assert.strictEqual($message.find('.moderation_checkbox').length, 0,
"the message should not have any moderation checkbox");
discuss.destroy();
done();
});
});
QUnit.test('moderator: reject pending moderation message (reject with explanation)', function (assert) {
assert.expect(21);
var done = assert.async();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
is_moderator: true,
moderation_counter: 1,
moderation_channel_ids: [1],
};
this.data['mail.message'].records = [{
author_id: [2, "Someone"],
body: "<p>test</p>",
channel_ids: [],
id: 100,
model: 'mail.channel',
moderation_status: 'pending_moderation',
need_moderation: true,
res_id: 1,
}];
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
mockRPC: function (route, args) {
if (args.method === 'moderate') {
assert.step('moderate');
var messageIDs = args.args[0];
var decision = args.args[1];
var kwargs = args.kwargs;
assert.strictEqual(messageIDs.length, 1, "should moderate one message");
assert.strictEqual(messageIDs[0], 100, "should moderate message with ID 100");
assert.strictEqual(decision, 'reject', "should reject the message");
assert.strictEqual(kwargs.title, "Message Rejected",
"should have correct reject message title");
assert.strictEqual(kwargs.comment, "Your message was rejected by moderator.",
"should have correct reject message body / comment");
}
return this._super.apply(this, arguments);
},
})
.then(function (discuss) {
// 1. go to moderation box
var $moderationBox = discuss.$(
'.o_mail_discuss_item' +
'[data-thread-id="mailbox_moderation"]');
testUtils.dom.click($moderationBox);
// check there is a message to moderate
var $message = discuss.$('.o_thread_message');
assert.strictEqual($message.length, 1,
"there should be one message in the moderation box");
assert.strictEqual($message.data('message-id'), 100,
"this message should have correct ID");
assert.strictEqual($message.find('.moderation_checkbox').length, 1,
"the message should have a moderation checkbox");
// reject the message pending moderation
testUtils.dom.click(discuss.$('.o_thread_message_moderation[data-decision="reject"]'));
// check reject dialog prompt
assert.strictEqual($('.modal-dialog').length, 1,
"a dialog should be prompt to the moderator on click reject");
assert.strictEqual($('.modal-title').text(), "Send explanation to author",
"dialog should have correct title");
var $messageTitle = $('.modal-body input[id="message_title"]');
assert.strictEqual($messageTitle.length, 1,
"should have a title of message for rejecting the message");
assert.hasAttrValue($messageTitle, 'placeholder', "Subject",
"message title for reject reason should have correct placeholder");
assert.strictEqual($messageTitle.val(), "Message Rejected",
"message title for reject reason should have correct default value");
var $messageBody = $('.modal-body textarea[id="reject_message"]');
assert.strictEqual($messageBody.length, 1,
"should have a body of message for rejecting the message");
assert.hasAttrValue($messageBody, 'placeholder', "Mail Body",
"message body for reject reason should have correct placeholder");
assert.strictEqual($messageBody.text(), "Your message was rejected by moderator.",
"message body for reject reason should have correct default text content");
assert.strictEqual($('.modal-footer button').text(), "Send",
"should have a send button on the reject dialog");
// send mesage
testUtils.dom.click($('.modal-footer button'));
assert.verifySteps(['moderate']);
// // stop the fadeout animation and immediately remove the element
discuss.$('.o_thread_message').stop(false, true);
assert.containsNone(discuss, '.o_thread_message',
"should now have no message displayed in moderation box");
// 2. go to channel 'general'
testUtils.dom.click(discuss.$('.o_mail_discuss_item[data-thread-id="1"]'));
assert.containsNone(discuss, '.o_thread_message')
discuss.destroy();
done();
});
});
QUnit.test('moderator: discard pending moderation message (reject without explanation)', function (assert) {
assert.expect(15);
var done = assert.async();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
is_moderator: true,
moderation_counter: 1,
moderation_channel_ids: [1],
};
this.data['mail.message'].records = [{
author_id: [2, "Someone"],
body: "<p>test</p>",
channel_ids: [],
id: 100,
model: 'mail.channel',
moderation_status: 'pending_moderation',
need_moderation: true,
res_id: 1,
}];
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
mockRPC: function (route, args) {
if (args.method === 'moderate') {
assert.step('moderate');
var messageIDs = args.args[0];
var decision = args.args[1];
assert.strictEqual(messageIDs.length, 1, "should moderate one message");
assert.strictEqual(messageIDs[0], 100, "should moderate message with ID 100");
assert.strictEqual(decision, 'discard', "should discard the message");
}
return this._super.apply(this, arguments);
},
})
.then(function (discuss) {
// 1. go to moderation box
var $moderationBox = discuss.$(
'.o_mail_discuss_item' +
'[data-thread-id="mailbox_moderation"]');
testUtils.dom.click($moderationBox);
// check there is a message to moderate
var $message = discuss.$('.o_thread_message');
assert.strictEqual($message.length, 1,
"there should be one message in the moderation box");
assert.strictEqual($message.data('message-id'), 100,
"this message should have correct ID");
assert.strictEqual($message.find('.moderation_checkbox').length, 1,
"the message should have a moderation checkbox");
// discard the message pending moderation
testUtils.dom.click(discuss.$('.o_thread_message_moderation[data-decision="discard"]'));
// check discard dialog prompt
assert.strictEqual($('.modal-dialog').length, 1,
"a dialog should be prompt to the moderator on click discard");
assert.strictEqual($('.modal-body:first').text(),
"You are going to discard 1 message. Do you confirm the action?",
"should warn the user on discard action");
assert.strictEqual($('.modal-footer button').length, 2,
"should have two buttons in the footer of the dialog");
assert.strictEqual($('.modal-footer button.btn-primary').text(), "Ok",
"should have a confirm button in the dialog for discard");
assert.strictEqual($('.modal-footer button.btn-secondary').text(), "Cancel",
"should have a cancel button in the dialog for discard");
// discard mesage
testUtils.dom.click($('.modal-footer button.btn-primary'));
assert.verifySteps(['moderate']);
// stop the fadeout animation and immediately remove the element
discuss.$('.o_thread_message').stop(false, true);
assert.containsNone(discuss, '.o_thread_message',
"should now have no message displayed in moderation box");
// 2. go to channel 'general'
testUtils.dom.click(discuss.$('.o_mail_discuss_item[data-thread-id="1"]'));
assert.containsNone(discuss, '.o_thread_message')
discuss.destroy();
done();
});
});
QUnit.test('author: send message in moderated channel', function (assert) {
assert.expect(4);
var done = assert.async();
var messagePostDef = $.Deferred();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
};
var objectDiscuss;
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
mockRPC: function (route, args) {
if (args.method === 'message_post') {
var message = {
id: 100,
author_id: [2, 'Someone'],
body: args.kwargs.body,
message_type: args.kwargs.message_type,
model: 'mail.channel',
moderation_status: 'pending_moderation',
res_id: 1,
};
var metaData = [undefined, 'res.partner'];
var notifData = {
type: 'author',
message: message,
};
var notification = [metaData, notifData];
objectDiscuss.call('bus_service', 'trigger', 'notification', [notification]);
messagePostDef.resolve();
return $.when(message.id);
}
return this._super.apply(this, arguments);
},
session: {
partner_id: 2,
},
})
.then(function (discuss) {
objectDiscuss = discuss;
// go to channel 'general'
testUtils.dom.click(discuss.$('.o_mail_discuss_item[data-thread-id="1"]'));
// post a message
discuss.$('.o_composer_input textarea').first().val("some text");
testUtils.dom.click(discuss.$('.o_composer_send button'));
messagePostDef
.then(function () {
var $message = discuss.$('.o_thread_message');
assert.strictEqual($message.length, 1,
"should have a message in the thread");
assert.strictEqual($message.data('message-id'), 100,
"message should have ID returned from 'message_post'");
assert.strictEqual($message.find('.o_thread_author').text().trim(),
"Someone", "message should have correct author displayed name");
assert.strictEqual(discuss.$('.o_thread_icons i.text-danger').text(),
"Pending moderation", "the message should be pending moderation");
discuss.destroy();
done();
});
});
});
QUnit.test('author: sent message accepted in moderated channel', function (assert) {
assert.expect(8);
var done = assert.async();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
};
this.data['mail.message'].records = [{
author_id: [2, "Someone"],
body: "<p>test</p>",
channel_ids: [],
id: 100,
model: 'mail.channel',
moderation_status: 'pending_moderation',
need_moderation: true,
res_id: 1,
}];
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
session: {
partner_id: 2,
},
})
.then(function (discuss) {
// go to channel 'general'
testUtils.dom.click(discuss.$('.o_mail_discuss_item[data-thread-id="1"]'));
// check message is pending
var $message = discuss.$('.o_thread_message');
assert.strictEqual($message.length, 1,
"should have a message in the thread");
assert.strictEqual($message.data('message-id'), 100,
"message should have ID returned from 'message_post'");
assert.strictEqual($message.find('.o_thread_author').text().trim(),
"Someone", "message should have correct author displayed name");
assert.strictEqual(discuss.$('.o_thread_icons i.text-danger').text(),
"Pending moderation", "the message should be pending moderation");
// simulate accepted message
var dbName = undefined; // useless for tests
var messageData = {
author_id: [2, "Someone"],
body: "<p>test</p>",
channel_ids: [],
id: 100,
model: 'mail.channel',
moderation_status: 'accepted'
};
var metaData = [dbName, 'mail.channel'];
var notification = [metaData, messageData];
discuss.call('bus_service', 'trigger', 'notification', [notification]);
// check message is accepted
$message = discuss.$('.o_thread_message');
assert.strictEqual($message.length, 1,
"should still have a message in the thread");
assert.strictEqual($message.data('message-id'), 100,
"message should still have ID returned from 'message_post'");
assert.strictEqual($message.find('.o_thread_author').text().trim(),
"Someone", "message should still have correct author displayed name");
assert.containsNone(discuss, '.o_thread_icons i.text-danger',
"the message should not be in pending moderation anymore");
discuss.destroy();
done();
});
});
QUnit.test('author: sent message rejected in moderated channel', function (assert) {
assert.expect(5);
var done = assert.async();
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
moderation: true,
}],
},
};
this.data['mail.message'].records = [{
author_id: [2, "Someone"],
body: "<p>test</p>",
channel_ids: [],
id: 100,
model: 'mail.channel',
moderation_status: 'pending_moderation',
need_moderation: true,
res_id: 1,
}];
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
session: {
partner_id: 2,
},
})
.then(function (discuss) {
// go to channel 'general'
testUtils.dom.click(discuss.$('.o_mail_discuss_item[data-thread-id="1"]'));
// check message is pending
var $message = discuss.$('.o_thread_message');
assert.strictEqual($message.length, 1,
"should have a message in the thread");
assert.strictEqual($message.data('message-id'), 100,
"message should have ID returned from 'message_post'");
assert.strictEqual($message.find('.o_thread_author').text().trim(),
"Someone", "message should have correct author displayed name");
assert.strictEqual(discuss.$('.o_thread_icons i.text-danger').text(),
"Pending moderation", "the message should be pending moderation");
// simulate reject from moderator
var dbName = undefined; // useless for tests
var notifData = {
type: 'deletion',
message_ids: [100],
};
var metaData = [dbName, 'res.partner'];
var notification = [metaData, notifData];
discuss.call('bus_service', 'trigger', 'notification', [notification]);
// // check no message
assert.containsNone(discuss, '.o_thread_message',
"message should be removed from channel after reject");
discuss.destroy();
done();
});
});
QUnit.test('no crash when load-more fetching "accepted" message twice', function (assert) {
// This tests requires discuss not loading more messages due to having less
// messages to fetch than available height. This justifies we simply do not
// patch FETCH_LIMIT to 1, as it would detect that more messages could fit
// the empty space (it behaviour is linked to "auto load more").
var done = assert.async();
assert.expect(2);
var FETCH_LIMIT = Thread.prototype._FETCH_LIMIT;
// FETCH LIMIT + 30 should be enough to cover the whole available space in
// the thread of discuss app.
var messageData = [];
_.each(_.range(1, FETCH_LIMIT+31), function (num) {
messageData.push({
id: num,
body: "<p>test" + num + "</p>",
author_id: [100, "Someone"],
channel_ids: [1],
model: 'mail.channel',
res_id: 1,
moderation_status: 'accepted',
}
);
});
this.data['mail.message'].records = messageData;
this.data.initMessaging = {
channel_slots: {
channel_channel: [{
id: 1,
channel_type: "channel",
name: "general",
}],
},
};
var count = 0;
createDiscuss({
id: 1,
context: {},
params: {},
data: this.data,
services: this.services,
session: { partner_id: 3 },
mockRPC: function (route, args) {
if (args.method === 'message_fetch') {
count++;
if (count === 1) {
// inbox message_fetch
return $.when([]);
}
// general message_fetch
return $.when(messageData);
}
return this._super.apply(this, arguments);
},
})
.then(function (discuss) {
var $general = discuss.$('.o_mail_discuss_sidebar')
.find('.o_mail_discuss_item[data-thread-id=1]');
assert.strictEqual($general.length, 1,
"should have the channel item with id 1");
assert.strictEqual($general.attr('title'), 'general',
"should have the title 'general'");
// click on general
$general.click();
// simulate search
discuss.trigger_up('search', {
domains: [['author_id', '=', 100]],
});
discuss.destroy();
done();
});
});
});
});