mirror of
https://github.com/bringout/oca-ocb-security.git
synced 2026-04-22 16:32:09 +02:00
19.0 vanilla
This commit is contained in:
parent
20ddc1b4a3
commit
c0efcc53f5
1162 changed files with 125577 additions and 105287 deletions
|
|
@ -0,0 +1,175 @@
|
|||
import { defineMailModels } from "@mail/../tests/mail_test_helpers";
|
||||
import { beforeEach, expect, test } from "@odoo/hoot";
|
||||
import { animationFrame, mockDate } from "@odoo/hoot-mock";
|
||||
import { changeScale, toggleSectionFilter } from "@web/../tests/views/calendar/calendar_test_helpers";
|
||||
import { contains, defineActions, defineModels, fields, getService, models, mountView, mountWebClient, onRpc, serverState, switchView } from "@web/../tests/web_test_helpers";
|
||||
|
||||
class CalendarEvent extends models.Model {
|
||||
_name = "calendar.event";
|
||||
_records = [
|
||||
{
|
||||
id: 5,
|
||||
user_id: serverState.userId,
|
||||
partner_id: 4,
|
||||
name: "event 1",
|
||||
start: "2016-12-13 15:55:05",
|
||||
stop: "2016-12-15 18:55:05",
|
||||
allday: false,
|
||||
partner_ids: [4],
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
user_id: serverState.userId,
|
||||
partner_id: 5,
|
||||
name: "event 2",
|
||||
start: "2016-12-18 08:00:00",
|
||||
stop: "2016-12-18 09:00:00",
|
||||
allday: false,
|
||||
partner_ids: [4],
|
||||
},
|
||||
];
|
||||
_views = {
|
||||
calendar: `
|
||||
<calendar js_class="attendee_calendar" date_start="start" date_stop="stop">
|
||||
<field name="name"/>
|
||||
<field name="partner_ids" write_model="calendar.filter" write_field="partner_id"/>
|
||||
</calendar>
|
||||
`,
|
||||
list: `<list sample="1"/>`
|
||||
};
|
||||
|
||||
user_id = fields.Many2one({ relation: "users" });
|
||||
partner_id = fields.Many2one({ relation: "partner" });
|
||||
name = fields.Char();
|
||||
start = fields.Datetime();
|
||||
stop = fields.Datetime();
|
||||
allday = fields.Boolean();
|
||||
partner_ids = fields.One2many({ relation: "partner" });
|
||||
}
|
||||
|
||||
class CalendarFilter extends models.Model {
|
||||
_records = [
|
||||
{ id: 3, user_id: serverState.userId, partner_id: 4, partner_checked: true },
|
||||
];
|
||||
|
||||
user_id = fields.Many2one({ relation: "users" });
|
||||
partner_id = fields.Many2one({ relation: "partner" });
|
||||
partner_checked = fields.Boolean();
|
||||
}
|
||||
|
||||
class Partner extends models.Model {
|
||||
_records = [
|
||||
{ id: 4, name: "Partner 4", image_1920: "DDD" },
|
||||
{ id: 5, name: "Partner 5", image_1920: "DDD" },
|
||||
];
|
||||
|
||||
name = fields.Char();
|
||||
image_1920 = fields.Binary();
|
||||
}
|
||||
|
||||
class Users extends models.Model {
|
||||
_records = [
|
||||
{ id: serverState.userId, name: "User 4", partner_id: 4 },
|
||||
];
|
||||
|
||||
name = fields.Char();
|
||||
partner_id = fields.Many2one({ relation: "partner" });
|
||||
image_1920 = fields.Binary();
|
||||
}
|
||||
|
||||
defineModels([CalendarEvent, CalendarFilter, Partner, Users]);
|
||||
defineMailModels();
|
||||
|
||||
onRpc("/calendar/check_credentials", async () => ({ google_calendar: true }));
|
||||
onRpc("/google_calendar/sync_data", () => ({ status: "no_new_event_from_google" }));
|
||||
onRpc("check_synchronization_status", async () => ({ google_calendar: "sync_active" }));
|
||||
onRpc("get_attendee_detail", () => []);
|
||||
onRpc("get_default_duration", () => 3.25);
|
||||
|
||||
beforeEach(() => {
|
||||
mockDate("2016-12-12 08:00:00");
|
||||
});
|
||||
|
||||
test.tags("desktop");
|
||||
test(`sync google calendar`, async () => {
|
||||
onRpc("/google_calendar/sync_data", async function () {
|
||||
expect.step("sync_data");
|
||||
this.env["calendar.event"].create({
|
||||
user_id: serverState.userId,
|
||||
partner_id: 4,
|
||||
name: "event from google",
|
||||
start: "2016-12-28 15:55:05",
|
||||
stop: "2016-12-29 18:55:05",
|
||||
allday: false,
|
||||
partner_ids: [4],
|
||||
});
|
||||
return { status: "need_refresh" };
|
||||
});
|
||||
onRpc("calendar.event", "search_read", ({ method }) => {
|
||||
expect.step(method);
|
||||
});
|
||||
|
||||
await mountView({
|
||||
type: "calendar",
|
||||
resModel: 'calendar.event',
|
||||
arch: `
|
||||
<calendar js_class="attendee_calendar" date_start="start" date_stop="stop" attendee="partner_ids" mode="month">
|
||||
<field name="name"/>
|
||||
<field name="partner_ids" write_model="calendar.filter" write_field="partner_id"/>
|
||||
</calendar>
|
||||
`,
|
||||
});
|
||||
expect.verifySteps(["sync_data", "search_read"]);
|
||||
|
||||
// select the partner filter
|
||||
await toggleSectionFilter("partner_ids");
|
||||
// sync_data was called a first time without filter, event from google calendar was created twice
|
||||
expect(`.fc-event`).toHaveCount(4, { message: "should display 4 events on the month" });
|
||||
expect.verifySteps(["sync_data", "search_read"]);
|
||||
|
||||
await contains(`.o_datetime_picker_header .o_next`).click();
|
||||
await contains(`.o_datetime_picker .o_date_item_cell`).click();
|
||||
expect.verifySteps(["sync_data", "search_read"]);
|
||||
|
||||
await changeScale("month");
|
||||
expect.verifySteps(["sync_data", "search_read"]);
|
||||
|
||||
await contains(`.o_calendar_button_today`).click();
|
||||
expect.verifySteps(["sync_data", "search_read"]);
|
||||
expect(`.fc-event`).toHaveCount(7, { message: "should now display 7 events on the month" });
|
||||
});
|
||||
|
||||
test(`component is destroyed while sync google calendar`, async () => {
|
||||
defineActions([
|
||||
{
|
||||
id: 1,
|
||||
name: "Partners",
|
||||
res_model: "calendar.event",
|
||||
type: "ir.actions.act_window",
|
||||
views: [[false, "list"], [false, "calendar"]],
|
||||
},
|
||||
]);
|
||||
|
||||
const deferred = Promise.withResolvers();
|
||||
onRpc("/google_calendar/sync_data", async function () {
|
||||
expect.step("sync_data");
|
||||
return deferred.promise;
|
||||
});
|
||||
onRpc("calendar.event", "search_read", ({ method }) => {
|
||||
expect.step(method);
|
||||
});
|
||||
|
||||
await mountWebClient();
|
||||
await getService("action").doAction(1);
|
||||
expect.verifySteps([]);
|
||||
|
||||
await switchView("calendar");
|
||||
expect.verifySteps(["sync_data"]);
|
||||
|
||||
await switchView("calendar");
|
||||
expect.verifySteps(["sync_data"]);
|
||||
|
||||
deferred.resolve();
|
||||
await animationFrame();
|
||||
expect.verifySteps(["search_read"]);
|
||||
});
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
/** @odoo-module **/
|
||||
|
||||
import { patch } from "@web/core/utils/patch";
|
||||
import { MockServer } from "@web/../tests/helpers/mock_server";
|
||||
|
||||
patch(MockServer.prototype, "google_calendar_mock_server", {
|
||||
/**
|
||||
* Simulate the creation of a custom appointment type
|
||||
* by receiving a list of slots.
|
||||
* @override
|
||||
*/
|
||||
async _performRPC(route, args) {
|
||||
if (route === '/google_calendar/sync_data') {
|
||||
return Promise.resolve({status: 'no_new_event_from_google'});
|
||||
}
|
||||
return this._super(...arguments);
|
||||
},
|
||||
});
|
||||
|
|
@ -1,216 +0,0 @@
|
|||
/** @odoo-module **/
|
||||
|
||||
import { click, getFixture, patchDate, makeDeferred, nextTick} from "@web/../tests/helpers/utils";
|
||||
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";
|
||||
import { registry } from "@web/core/registry";
|
||||
import { userService } from "@web/core/user_service";
|
||||
import { createWebClient, doAction } from "@web/../tests/webclient/helpers";
|
||||
|
||||
const serviceRegistry = registry.category("services");
|
||||
|
||||
let target;
|
||||
let serverData;
|
||||
const uid = -1;
|
||||
|
||||
QUnit.module('Google Calendar', {
|
||||
beforeEach: function () {
|
||||
patchDate(2016, 11, 12, 8, 0, 0);
|
||||
serverData = {
|
||||
models: {
|
||||
'calendar.event': {
|
||||
fields: {
|
||||
id: {string: "ID", type: "integer"},
|
||||
user_id: {string: "user", type: "many2one", relation: 'user'},
|
||||
partner_id: {string: "user", type: "many2one", relation: 'partner', related: 'user_id.partner_id'},
|
||||
name: {string: "name", type: "char"},
|
||||
start_date: {string: "start date", type: "date"},
|
||||
stop_date: {string: "stop date", type: "date"},
|
||||
start: {string: "start datetime", type: "datetime"},
|
||||
stop: {string: "stop datetime", type: "datetime"},
|
||||
allday: {string: "allday", type: "boolean"},
|
||||
partner_ids: {string: "attendees", type: "one2many", relation: 'partner'},
|
||||
type: {string: "type", type: "integer"},
|
||||
},
|
||||
records: [
|
||||
{id: 5, user_id: uid, partner_id: 4, name: "event 1", start: "2016-12-13 15:55:05", stop: "2016-12-15 18:55:05", allday: false, partner_ids: [4], type: 2},
|
||||
{id: 6, user_id: uid, partner_id: 5, name: "event 2", start: "2016-12-18 08:00:00", stop: "2016-12-18 09:00:00", allday: false, partner_ids: [4], type: 3}
|
||||
],
|
||||
check_access_rights: function () {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
},
|
||||
'appointment.type': {
|
||||
fields: {},
|
||||
records: [],
|
||||
},
|
||||
user: {
|
||||
fields: {
|
||||
id: {string: "ID", type: "integer"},
|
||||
display_name: {string: "Displayed name", type: "char"},
|
||||
partner_id: {string: "partner", type: "many2one", relation: 'partner'},
|
||||
image_1920: {string: "image", type: "integer"},
|
||||
},
|
||||
records: [
|
||||
{id: 4, display_name: "user 4", partner_id: 4},
|
||||
]
|
||||
},
|
||||
partner: {
|
||||
fields: {
|
||||
id: {string: "ID", type: "integer"},
|
||||
display_name: {string: "Displayed name", type: "char"},
|
||||
image_1920: {string: "image", type: "integer"},
|
||||
},
|
||||
records: [
|
||||
{id: 4, display_name: "partner 4", image_1920: 'DDD'},
|
||||
{id: 5, display_name: "partner 5", image_1920: 'DDD'},
|
||||
]
|
||||
},
|
||||
filter_partner: {
|
||||
fields: {
|
||||
id: {string: "ID", type: "integer"},
|
||||
user_id: {string: "user", type: "many2one", relation: 'user'},
|
||||
partner_id: {string: "partner", type: "many2one", relation: 'partner'},
|
||||
partner_checked: {string: "checked", type: "boolean"},
|
||||
},
|
||||
records: [
|
||||
{id: 3, user_id: uid, partner_id: 4, partner_checked: true}
|
||||
]
|
||||
},
|
||||
},
|
||||
views: {},
|
||||
};
|
||||
target = getFixture();
|
||||
setupViewRegistries();
|
||||
serviceRegistry.add(
|
||||
"user",
|
||||
{
|
||||
...userService,
|
||||
start() {
|
||||
const fakeUserService = userService.start(...arguments);
|
||||
Object.defineProperty(fakeUserService, "userId", {
|
||||
get: () => uid,
|
||||
});
|
||||
return fakeUserService;
|
||||
},
|
||||
},
|
||||
{ force: true }
|
||||
);
|
||||
}
|
||||
}, function () {
|
||||
|
||||
QUnit.test('sync google calendar', async function (assert) {
|
||||
assert.expect(11);
|
||||
|
||||
let id = 7;
|
||||
await makeView({
|
||||
type: "calendar",
|
||||
resModel: 'calendar.event',
|
||||
serverData,
|
||||
arch:
|
||||
'<calendar class="o_calendar_test" '+
|
||||
'js_class="attendee_calendar" '+
|
||||
'date_start="start" '+
|
||||
'date_stop="stop" '+
|
||||
'attendee="partner_ids" '+
|
||||
'mode="month">'+
|
||||
'<field name="name"/>'+
|
||||
'<field name="partner_ids" write_model="filter_partner" write_field="partner_id"/>'+
|
||||
'</calendar>',
|
||||
mockRPC: async function (route, args) {
|
||||
if (route === '/google_calendar/sync_data') {
|
||||
assert.step(route);
|
||||
serverData.models['calendar.event'].records.push(
|
||||
{id: id++, user_id: uid, partner_id: 4, name: "event from google calendar", start: "2016-12-28 15:55:05", stop: "2016-12-29 18:55:05", allday: false, partner_ids: [4], type: 4}
|
||||
);
|
||||
return Promise.resolve({status: 'need_refresh'});
|
||||
} else if (route === '/web/dataset/call_kw/calendar.event/search_read') {
|
||||
assert.step(route);
|
||||
} else if (route === '/web/dataset/call_kw/res.partner/get_attendee_detail') {
|
||||
return Promise.resolve([]);
|
||||
} else if (route === '/web/dataset/call_kw/res.users/has_group') {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
},
|
||||
});
|
||||
// select the partner filter
|
||||
await click(target.querySelector('.o_calendar_filter_item[data-value=all] input'));
|
||||
// sync_data was called a first time without filter, event from google calendar was created twice
|
||||
assert.containsN(target, '.fc-event-container', 4, "should display 4 events on the month");
|
||||
|
||||
await click(target.querySelector('.o_calendar_button_next'));
|
||||
await click(target.querySelector('.o_calendar_button_prev'));
|
||||
|
||||
assert.verifySteps([
|
||||
'/google_calendar/sync_data',
|
||||
'/web/dataset/call_kw/calendar.event/search_read',
|
||||
'/google_calendar/sync_data',
|
||||
'/web/dataset/call_kw/calendar.event/search_read',
|
||||
'/google_calendar/sync_data',
|
||||
'/web/dataset/call_kw/calendar.event/search_read',
|
||||
'/google_calendar/sync_data',
|
||||
'/web/dataset/call_kw/calendar.event/search_read',
|
||||
], 'should do a search_read before and after the call to sync_data');
|
||||
|
||||
assert.containsN(target, '.fc-event-container', 6, "should now display 6 events on the month");
|
||||
});
|
||||
|
||||
QUnit.test("component is destroyed while sync google calendar", async function (assert) {
|
||||
assert.expect(4);
|
||||
const def = makeDeferred();
|
||||
serverData.actions = {
|
||||
1: {
|
||||
id: 1,
|
||||
name: "Partners",
|
||||
res_model: "calendar.event",
|
||||
type: "ir.actions.act_window",
|
||||
views: [
|
||||
[false, "list"],
|
||||
[false, "calendar"],
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
serverData.views = {
|
||||
"calendar.event,false,calendar": `
|
||||
<calendar class="o_calendar_test" js_class="attendee_calendar" date_start="start" date_stop="stop">
|
||||
<field name="name"/>
|
||||
<field name="partner_ids" write_model="filter_partner" write_field="partner_id"/>
|
||||
</calendar>`,
|
||||
"calendar.event,false,list": `<tree sample="1"/>`,
|
||||
"calendar.event,false,search": `<search />`,
|
||||
};
|
||||
|
||||
const webClient = await createWebClient({
|
||||
serverData,
|
||||
async mockRPC(route, args) {
|
||||
if (route === '/google_calendar/sync_data') {
|
||||
assert.step(route);
|
||||
return def;
|
||||
} else if (route === '/web/dataset/call_kw/calendar.event/search_read') {
|
||||
assert.step(route);
|
||||
} else if (route === '/web/dataset/call_kw/res.partner/get_attendee_detail') {
|
||||
return Promise.resolve([]);
|
||||
} else if (route === '/web/dataset/call_kw/res.users/has_group') {
|
||||
return Promise.resolve(true);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
await doAction(webClient, 1);
|
||||
|
||||
click(target.querySelector(".o_cp_switch_buttons .o_calendar"));
|
||||
await nextTick();
|
||||
|
||||
click(target.querySelector(".o_cp_switch_buttons .o_calendar"));
|
||||
await nextTick();
|
||||
|
||||
def.resolve();
|
||||
await nextTick();
|
||||
|
||||
assert.verifySteps([
|
||||
"/google_calendar/sync_data",
|
||||
"/google_calendar/sync_data",
|
||||
"/web/dataset/call_kw/calendar.event/search_read"
|
||||
], "Correct RPC calls were made");
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue