19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:28 +01:00
parent 20ddc1b4a3
commit c0efcc53f5
1162 changed files with 125577 additions and 105287 deletions

View file

@ -0,0 +1,125 @@
import { defineMailModels } from "@mail/../tests/mail_test_helpers";
import { beforeEach, expect, test } from "@odoo/hoot";
import { animationFrame, mockDate } from "@odoo/hoot-mock";
import { defineActions, defineModels, fields, getService, models, 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 () => ({ microsoft_calendar: true }));
onRpc("/microsoft_calendar/sync_data", () => ({ status: "no_new_event_from_microsoft" }));
onRpc("check_synchronization_status", async () => ({ microsoft_calendar: "sync_active" }));
onRpc("get_attendee_detail", () => []);
onRpc("get_default_duration", () => 3.25);
beforeEach(() => {
mockDate("2016-12-12 08:00:00");
});
test(`component is destroyed while sync microsoft 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("/microsoft_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"]);
});

View file

@ -1,18 +0,0 @@
/** @odoo-module **/
import { patch } from "@web/core/utils/patch";
import { MockServer } from "@web/../tests/helpers/mock_server";
patch(MockServer.prototype, "microsoft_calendar_mock_server", {
/**
* Simulate the creation of a custom appointment type
* by receiving a list of slots.
* @override
*/
async _performRPC(route, args) {
if (route === '/microsoft_calendar/sync_data') {
return Promise.resolve({status: 'no_new_event_from_microsoft'});
}
return this._super(...arguments);
},
});

View file

@ -1,149 +0,0 @@
/** @odoo-module **/
import { click, getFixture, patchDate, makeDeferred, nextTick} from "@web/../tests/helpers/utils";
import { 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('Microsoft 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: {string: "start datetime", type: "datetime"},
stop: {string: "stop datetime", type: "datetime"},
partner_ids: {string: "attendees", type: "one2many", relation: 'partner'},
},
},
'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("component is destroyed while sync microsoft 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 === '/microsoft_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([
"/microsoft_calendar/sync_data",
"/microsoft_calendar/sync_data",
"/web/dataset/call_kw/calendar.event/search_read"
], "Correct RPC calls were made");
});
});