odoo.define('mail.chatter_tests', function (require) {
"use strict";
const { afterEach, beforeEach, start } = require('mail/static/src/utils/test_utils.js');
var FormView = require('web.FormView');
var ListView = require('web.ListView');
var testUtils = require('web.test_utils');
QUnit.module('mail', {}, function () {
QUnit.module('Chatter', {
beforeEach: function () {
beforeEach(this);
this.data['res.partner'].records.push({ id: 11, im_status: 'online' });
this.data['mail.activity.type'].records.push(
{ id: 1, name: "Type 1" },
{ id: 2, name: "Type 2" },
{ id: 3, name: "Type 3", category: 'upload_file' },
{ id: 4, name: "Exception", decoration_type: "warning", icon: "fa-warning" }
);
this.data['ir.attachment'].records.push(
{
id: 1,
mimetype: 'image/png',
name: 'filename.jpg',
res_id: 7,
res_model: 'res.users',
type: 'url',
},
{
id: 2,
mimetype: "application/x-msdos-program",
name: "file2.txt",
res_id: 7,
res_model: 'res.users',
type: 'binary',
},
{
id: 3,
mimetype: "application/x-msdos-program",
name: "file3.txt",
res_id: 5,
res_model: 'res.users',
type: 'binary',
},
);
Object.assign(this.data['res.users'].fields, {
activity_exception_decoration: {
string: 'Decoration',
type: 'selection',
selection: [['warning', 'Alert'], ['danger', 'Error']],
},
activity_exception_icon: {
string: 'icon',
type: 'char',
},
activity_ids: {
string: 'Activities',
type: 'one2many',
relation: 'mail.activity',
relation_field: 'res_id',
},
activity_state: {
string: 'State',
type: 'selection',
selection: [['overdue', 'Overdue'], ['today', 'Today'], ['planned', 'Planned']],
},
activity_summary: {
string: "Next Activity Summary",
type: 'char',
},
activity_type_icon: {
string: "Activity Type Icon",
type: 'char',
},
activity_type_id: {
string: "Activity type",
type: "many2one",
relation: "mail.activity.type",
},
foo: { string: "Foo", type: "char", default: "My little Foo Value" },
message_attachment_count: {
string: 'Attachment count',
type: 'integer',
},
message_follower_ids: {
string: "Followers",
type: "one2many",
relation: 'mail.followers',
relation_field: "res_id",
},
message_ids: {
string: "messages",
type: "one2many",
relation: 'mail.message',
relation_field: "res_id",
},
});
},
afterEach() {
afterEach(this);
},
});
QUnit.test('list activity widget with no activity', async function (assert) {
assert.expect(5);
const { widget: list } = await start({
hasView: true,
View: ListView,
model: 'res.users',
data: this.data,
arch: '
',
mockRPC: function (route) {
assert.step(route);
return this._super(...arguments);
},
session: { uid: 2 },
});
assert.containsOnce(list, '.o_mail_activity .o_activity_color_default');
assert.strictEqual(list.$('.o_activity_summary').text(), '');
assert.verifySteps([
'/web/dataset/search_read',
'/mail/init_messaging',
]);
list.destroy();
});
QUnit.test('list activity widget with activities', async function (assert) {
assert.expect(7);
const currentUser = this.data['res.users'].records.find(user =>
user.id === this.data.currentUserId
);
Object.assign(currentUser, {
activity_ids: [1, 4],
activity_state: 'today',
activity_summary: 'Call with Al',
activity_type_id: 3,
activity_type_icon: 'fa-phone',
});
this.data['res.users'].records.push({
id: 44,
activity_ids: [2],
activity_state: 'planned',
activity_summary: false,
activity_type_id: 2,
});
const { widget: list } = await start({
hasView: true,
View: ListView,
model: 'res.users',
data: this.data,
arch: '
',
mockRPC: function (route) {
assert.step(route);
return this._super(...arguments);
},
});
const $firstRow = list.$('.o_data_row:first');
assert.containsOnce($firstRow, '.o_mail_activity .o_activity_color_today.fa-phone');
assert.strictEqual($firstRow.find('.o_activity_summary').text(), 'Call with Al');
const $secondRow = list.$('.o_data_row:nth(1)');
assert.containsOnce($secondRow, '.o_mail_activity .o_activity_color_planned.fa-clock-o');
assert.strictEqual($secondRow.find('.o_activity_summary').text(), 'Type 2');
assert.verifySteps([
'/web/dataset/search_read',
'/mail/init_messaging',
]);
list.destroy();
});
QUnit.test('list activity widget with exception', async function (assert) {
assert.expect(5);
const currentUser = this.data['res.users'].records.find(user =>
user.id === this.data.currentUserId
);
Object.assign(currentUser, {
activity_ids: [1],
activity_state: 'today',
activity_summary: 'Call with Al',
activity_type_id: 3,
activity_exception_decoration: 'warning',
activity_exception_icon: 'fa-warning',
});
const { widget: list } = await start({
hasView: true,
View: ListView,
model: 'res.users',
data: this.data,
arch: '
',
mockRPC: function (route) {
assert.step(route);
return this._super(...arguments);
},
});
assert.containsOnce(list, '.o_activity_color_today.text-warning.fa-warning');
assert.strictEqual(list.$('.o_activity_summary').text(), 'Warning');
assert.verifySteps([
'/web/dataset/search_read',
'/mail/init_messaging',
]);
list.destroy();
});
QUnit.test('list activity widget: open dropdown', async function (assert) {
assert.expect(10);
const currentUser = this.data['res.users'].records.find(user =>
user.id === this.data.currentUserId
);
Object.assign(currentUser, {
activity_ids: [1, 4],
activity_state: 'today',
activity_summary: 'Call with Al',
activity_type_id: 3,
});
this.data['mail.activity'].records.push(
{
id: 1,
display_name: "Call with Al",
date_deadline: moment().format("YYYY-MM-DD"), // now
can_write: true,
state: "today",
user_id: this.data.currentUserId,
create_uid: this.data.currentUserId,
activity_type_id: 3,
},
{
id: 4,
display_name: "Meet FP",
date_deadline: moment().add(1, 'day').format("YYYY-MM-DD"), // tomorrow
can_write: true,
state: "planned",
user_id: this.data.currentUserId,
create_uid: this.data.currentUserId,
activity_type_id: 1,
}
);
const { env, widget: list } = await start({
hasView: true,
View: ListView,
model: 'res.users',
data: this.data,
arch: `
`,
mockRPC: function (route, args) {
assert.step(args.method || route);
if (args.method === 'action_feedback') {
const currentUser = this.data['res.users'].records.find(user =>
user.id === env.messaging.currentUser.id
);
Object.assign(currentUser, {
activity_ids: [4],
activity_state: 'planned',
activity_summary: 'Meet FP',
activity_type_id: 1,
});
return Promise.resolve();
}
return this._super(route, args);
},
intercepts: {
switch_view: () => assert.step('switch_view'),
},
});
assert.strictEqual(list.$('.o_activity_summary').text(), 'Call with Al');
// click on the first record to open it, to ensure that the 'switch_view'
// assertion is relevant (it won't be opened as there is no action manager,
// but we'll log the 'switch_view' event)
await testUtils.dom.click(list.$('.o_data_cell:first'));
// from this point, no 'switch_view' event should be triggered, as we
// interact with the activity widget
assert.step('open dropdown');
await testUtils.dom.click(list.$('.o_activity_btn span')); // open the popover
await testUtils.dom.click(list.$('.o_mark_as_done:first')); // mark the first activity as done
await testUtils.dom.click(list.$('.o_activity_popover_done')); // confirm
assert.strictEqual(list.$('.o_activity_summary').text(), 'Meet FP');
assert.verifySteps([
'/web/dataset/search_read',
'/mail/init_messaging',
'switch_view',
'open dropdown',
'activity_format',
'action_feedback',
'read',
]);
list.destroy();
});
QUnit.test('list activity exception widget with activity', async function (assert) {
assert.expect(3);
const currentUser = this.data['res.users'].records.find(user =>
user.id === this.data.currentUserId
);
currentUser.activity_ids = [1];
this.data['res.users'].records.push({
id: 13,
message_attachment_count: 3,
display_name: "second partner",
foo: "Tommy",
message_follower_ids: [],
message_ids: [],
activity_ids: [2],
activity_exception_decoration: 'warning',
activity_exception_icon: 'fa-warning',
});
this.data['mail.activity'].records.push(
{
id: 1,
display_name: "An activity",
date_deadline: moment().format("YYYY-MM-DD"), // now
can_write: true,
state: "today",
user_id: 2,
create_uid: 2,
activity_type_id: 1,
},
{
id: 2,
display_name: "An exception activity",
date_deadline: moment().format("YYYY-MM-DD"), // now
can_write: true,
state: "today",
user_id: 2,
create_uid: 2,
activity_type_id: 4,
}
);
const { widget: list } = await start({
hasView: true,
View: ListView,
model: 'res.users',
data: this.data,
arch: '