odoo.define('hr.Many2OneAvatarEmployeeTests', function (require) {
"use strict";
const {
afterEach,
afterNextRender,
beforeEach,
start,
} = require('mail/static/src/utils/test_utils.js');
const FormView = require('web.FormView');
const KanbanView = require('web.KanbanView');
const ListView = require('web.ListView');
const { Many2OneAvatarEmployee } = require('hr.Many2OneAvatarEmployee');
const { dom, mock } = require('web.test_utils');
QUnit.module('hr', {}, function () {
QUnit.module('Many2OneAvatarEmployee', {
beforeEach() {
beforeEach(this);
// reset the cache before each test
Many2OneAvatarEmployee.prototype.partnerIds = {};
Object.assign(this.data, {
'foo': {
fields: {
employee_id: { string: "Employee", type: 'many2one', relation: 'hr.employee.public' },
},
records: [
{ id: 1, employee_id: 11 },
{ id: 2, employee_id: 7 },
{ id: 3, employee_id: 11 },
{ id: 4, employee_id: 23 },
],
},
});
this.data['hr.employee.public'].records.push(
{ id: 11, name: "Mario", user_id: 11, user_partner_id: 11 },
{ id: 7, name: "Luigi", user_id: 12, user_partner_id: 12 },
{ id: 23, name: "Yoshi", user_id: 13, user_partner_id: 13 }
);
this.data['res.users'].records.push(
{ id: 11, partner_id: 11 },
{ id: 12, partner_id: 12 },
{ id: 13, partner_id: 13 }
);
this.data['res.partner'].records.push(
{ id: 11, display_name: "Mario" },
{ id: 12, display_name: "Luigi" },
{ id: 13, display_name: "Yoshi" }
);
},
afterEach() {
afterEach(this);
},
});
QUnit.test('many2one_avatar_employee widget in list view', async function (assert) {
assert.expect(11);
const { widget: list } = await start({
hasChatWindow: true,
hasView: true,
View: ListView,
model: 'foo',
data: this.data,
arch: '',
mockRPC(route, args) {
if (args.method === 'read') {
assert.step(`read ${args.model} ${args.args[0]}`);
}
return this._super(...arguments);
},
});
assert.strictEqual(list.$('.o_data_cell span').text(), 'MarioLuigiMarioYoshi');
// click on first employee
await afterNextRender(() =>
dom.click(list.$('.o_data_cell:nth(0) .o_m2o_avatar'))
);
assert.verifySteps(
['read hr.employee.public 11'],
"first employee should have been read to find its partner"
);
assert.containsOnce(
document.body,
'.o_ChatWindowHeader_name',
'should have opened chat window'
);
assert.strictEqual(
document.querySelector('.o_ChatWindowHeader_name').textContent,
"Mario",
'chat window should be with clicked employee'
);
// click on second employee
await afterNextRender(() =>
dom.click(list.$('.o_data_cell:nth(1) .o_m2o_avatar')
));
assert.verifySteps(
['read hr.employee.public 7'],
"second employee should have been read to find its partner"
);
assert.containsN(
document.body,
'.o_ChatWindowHeader_name',
2,
'should have opened second chat window'
);
assert.strictEqual(
document.querySelectorAll('.o_ChatWindowHeader_name')[1].textContent,
"Luigi",
'chat window should be with clicked employee'
);
// click on third employee (same as first)
await afterNextRender(() =>
dom.click(list.$('.o_data_cell:nth(2) .o_m2o_avatar'))
);
assert.verifySteps(
[],
"employee should not have been read again because we already know its partner"
);
assert.containsN(
document.body,
'.o_ChatWindowHeader_name',
2,
"should still have only 2 chat windows because third is the same partner as first"
);
list.destroy();
});
QUnit.test('many2one_avatar_employee widget in kanban view', async function (assert) {
assert.expect(6);
const { widget: kanban } = await start({
hasView: true,
View: KanbanView,
model: 'foo',
data: this.data,
arch: `
`,
});
assert.strictEqual(kanban.$('.o_kanban_record').text().trim(), '');
assert.containsN(kanban, '.o_m2o_avatar', 4);
assert.strictEqual(kanban.$('.o_m2o_avatar:nth(0)').data('src'), '/web/image/hr.employee.public/11/image_128');
assert.strictEqual(kanban.$('.o_m2o_avatar:nth(1)').data('src'), '/web/image/hr.employee.public/7/image_128');
assert.strictEqual(kanban.$('.o_m2o_avatar:nth(2)').data('src'), '/web/image/hr.employee.public/11/image_128');
assert.strictEqual(kanban.$('.o_m2o_avatar:nth(3)').data('src'), '/web/image/hr.employee.public/23/image_128');
kanban.destroy();
});
QUnit.test('many2one_avatar_employee: click on an employee not associated with a user', async function (assert) {
assert.expect(6);
this.data['hr.employee.public'].records[0].user_id = false;
this.data['hr.employee.public'].records[0].user_partner_id = false;
const { widget: form } = await start({
hasView: true,
View: FormView,
model: 'foo',
data: this.data,
arch: '
',
mockRPC(route, args) {
if (args.method === 'read') {
assert.step(`read ${args.model} ${args.args[0]}`);
}
return this._super(...arguments);
},
res_id: 1,
});
mock.intercept(form, 'call_service', (ev) => {
if (ev.data.service === 'notification') {
assert.step(`display notification "${ev.data.args[0].message}"`);
}
}, true);
assert.strictEqual(form.$('.o_field_widget[name=employee_id]').text().trim(), 'Mario');
await dom.click(form.$('.o_m2o_avatar'));
assert.verifySteps([
'read foo 1',
'read hr.employee.public 11',
]);
assert.containsOnce(
document.body,
'.toast .o_notification_content',
"should display a toast notification after failing to open chat"
);
assert.strictEqual(
document.querySelector('.o_notification_content').textContent,
"You can only chat with employees that have a dedicated user.",
"should display the correct information in the notification"
);
form.destroy();
});
});
});