From 45119056ee7a4609c7f505835a04dc9bdf8d2d13 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Tue, 19 Apr 2022 13:41:44 +0000 Subject: [PATCH] [REF] web: tests: makeView: let View do the "get_views" Before this commit, the makeView test helper processed the given arch and generated the fields to pass to the View component. This led us to do a similar work as what is done in the view service, i.e. duplicate code, or factorize/reuse code. An alternative is to let the View component fetch whatever it needs (view arch, fields, search view...). This is the purpose of this commit. That way, the code of the view service is executed (and thus tested as well) in each test doing a "makeView". This commit makes that change, and adapts some tests accordingly (mainly, tests doing assertions in mockRPC, since we do a get_view in every test). Part-of: odoo/odoo#87522 --- addons/web/static/tests/views/helpers.js | 31 +- .../static/tests/views/pivot_view_tests.js | 76 +- addons/web/static/tests/views/view_tests.js | 671 +++++++++--------- 3 files changed, 401 insertions(+), 377 deletions(-) diff --git a/addons/web/static/tests/views/helpers.js b/addons/web/static/tests/views/helpers.js index d8e2bb60ede..8cc6021d233 100644 --- a/addons/web/static/tests/views/helpers.js +++ b/addons/web/static/tests/views/helpers.js @@ -3,7 +3,6 @@ import { makeTestEnv } from "@web/../tests/helpers/mock_env"; import { getFixture, mount } from "@web/../tests/helpers/utils"; import { getDefaultConfig, View } from "@web/views/view"; -import { _getView } from "../helpers/mock_server"; import { addLegacyMockEnvironment } from "../webclient/helpers"; /** @@ -35,29 +34,19 @@ export const makeView = async (params) => { delete props.legacyParams; delete props.config; - const env = await makeTestEnv({ serverData, mockRPC, config }); - if (props.arch) { - const defaultFields = serverData.models[props.resModel].fields; - if (!props.fields) { - props.fields = Object.assign({}, defaultFields); - // write the field name inside the field description (as done by fields_get) - for (const fieldName in props.fields) { - props.fields[fieldName].name = fieldName; - } - } - const view = _getView({ - arch: props.arch, - modelName: props.resModel, - fields: props.fields, - context: props.context || {}, - models: serverData.models, - }); - props.arch = view.arch; - props.searchViewArch = props.searchViewArch || ""; - props.searchViewFields = props.searchViewFields || Object.assign({}, props.fields); + serverData.views = serverData.views || {}; + props.viewId = 100000001; // hopefully will not conflict with an id already in views + serverData.views[`${props.resModel},${props.viewId},${props.type}`] = props.arch; + delete props.arch; + props.searchViewId = 100000002; // hopefully will not conflict with an id already in views + const searchViewArch = props.searchViewArch || ""; + serverData.views[`${props.resModel},${props.searchViewId},search`] = searchViewArch; + delete props.searchViewArch; } + const env = await makeTestEnv({ serverData, mockRPC, config }); + /** Legacy Environment, for compatibility sakes * Remove this as soon as we drop the legacy support */ diff --git a/addons/web/static/tests/views/pivot_view_tests.js b/addons/web/static/tests/views/pivot_view_tests.js index d6aafe09ce8..46b5e519f4b 100644 --- a/addons/web/static/tests/views/pivot_view_tests.js +++ b/addons/web/static/tests/views/pivot_view_tests.js @@ -211,11 +211,13 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { - assert.strictEqual( - args.kwargs.lazy, - false, - "the read_group should be done with the lazy=false option" - ); + if (args.method === "read_group") { + assert.strictEqual( + args.kwargs.lazy, + false, + "the read_group should be done with the lazy=false option" + ); + } }, }); @@ -404,6 +406,11 @@ QUnit.module("Views", (hooks) => { QUnit.test("clicking on a cell triggers a doAction", async function (assert) { assert.expect(2); + serverData.views = { + "partner,2,form": "
", + "partner,false,list": "", + "partner,5,kanban": "", + }; patchWithCleanup(session, { user_context: { userContextKey: true }, }); @@ -748,14 +755,16 @@ QUnit.module("Views", (hooks) => { `, - mockRPC(route, params) { - const wrongFields = params.kwargs.fields.filter((field) => { - return !(field.split(":")[0] in serverData.models.partner.fields); - }); - assert.ok( - !wrongFields.length, - "fields given to read_group should exist on the model" - ); + mockRPC(route, args) { + if (args.method === "read_group") { + const wrongFields = args.kwargs.fields.filter((field) => { + return !(field.split(":")[0] in serverData.models.partner.fields); + }); + assert.ok( + !wrongFields.length, + "fields given to read_group should exist on the model" + ); + } }, }); }); @@ -850,7 +859,6 @@ QUnit.module("Views", (hooks) => { assert.expect(7); let rpcCount = 0; - await makeView({ type: "pivot", resModel: "partner", @@ -860,8 +868,10 @@ QUnit.module("Views", (hooks) => { `, - mockRPC() { - rpcCount++; + mockRPC(route, args) { + if (args.method === "read_group") { + rpcCount++; + } }, }); assert.containsN( @@ -4571,23 +4581,25 @@ QUnit.module("Views", (hooks) => { `, mockRPC(route, args) { - if (args.method === "read_group" && isSecondReadGroup) { - return Promise.resolve([ - { - customer: [2, "Second"], - foo: 18, - __count: 2, - __domain: [["customer", "=", 2]], - }, - { - customer: [1, "First"], - foo: 14, - __count: 2, - __domain: [["customer", "=", 1]], - }, - ]); + if (args.method === "read_group") { + if (isSecondReadGroup) { + return Promise.resolve([ + { + customer: [2, "Second"], + foo: 18, + __count: 2, + __domain: [["customer", "=", 2]], + }, + { + customer: [1, "First"], + foo: 14, + __count: 2, + __domain: [["customer", "=", 1]], + }, + ]); + } + isSecondReadGroup = true; } - isSecondReadGroup = true; }, }); diff --git a/addons/web/static/tests/views/view_tests.js b/addons/web/static/tests/views/view_tests.js index a7bb4063e96..fa15569ae21 100644 --- a/addons/web/static/tests/views/view_tests.js +++ b/addons/web/static/tests/views/view_tests.js @@ -10,13 +10,12 @@ import { patchWithCleanup, } from "@web/../tests/helpers/utils"; import { setupControlPanelServiceRegistry } from "@web/../tests/search/helpers"; -import { makeView } from "@web/../tests/views/helpers"; import { registry } from "@web/core/registry"; import { OnboardingBanner } from "@web/views/onboarding_banner"; import { View } from "@web/views/view"; import { actionService } from "@web/webclient/actions/action_service"; -const { Component, useState, xml } = owl; +const { Component, onWillStart, onWillUpdateProps, useState, xml } = owl; const serviceRegistry = registry.category("services"); const viewRegistry = registry.category("views"); @@ -128,21 +127,22 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - assert.strictEqual(args.model, "animal"); - assert.strictEqual(args.method, "get_views"); - assert.deepEqual(args.kwargs.views, [[false, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.strictEqual(args.model, "animal"); + assert.strictEqual(args.method, "get_views"); + assert.deepEqual(args.kwargs.views, [[false, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view.o_view_controller"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -165,20 +165,21 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - assert.deepEqual(args.kwargs.views, [[1, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.deepEqual(args.kwargs.views, [[1, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", viewId: 1, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -201,23 +202,23 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - console.log(_); - assert.deepEqual(args.kwargs.views, [[1, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.deepEqual(args.kwargs.views, [[1, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -242,25 +243,26 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - assert.deepEqual(args.kwargs.views, [ - [false, "other"], - [false, "toy"], - ]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.deepEqual(args.kwargs.views, [ + [false, "other"], + [false, "toy"], + ]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const config = { + views: [[false, "other"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[false, "other"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -284,29 +286,30 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - assert.deepEqual(args.kwargs.views, [ - [1, "toy"], - [false, "other"], - ]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.deepEqual(args.kwargs.views, [ + [1, "toy"], + [false, "other"], + ]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const config = { + views: [ + [3, "toy"], + [false, "other"], + ], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", viewId: 1, - config: { - views: [ - [3, "toy"], - [false, "other"], - ], - }, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -329,16 +332,17 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: () => { - throw new Error("no RPC expected"); - }, + const mockRPC = () => { + throw new Error("no RPC expected"); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content`, fields: {}, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -361,21 +365,22 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - // the rpc is done for fields - assert.deepEqual(args.kwargs.views, [[false, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: true, - }); - }, + const mockRPC = (_, args) => { + // the rpc is done for fields + assert.deepEqual(args.kwargs.views, [[false, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: true, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", loadActionMenus: true, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -400,23 +405,24 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - // the rpc is done for fields - assert.deepEqual(args.kwargs.views, [[false, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: true, - }); - }, + const mockRPC = (_, args) => { + // the rpc is done for fields + assert.deepEqual(args.kwargs.views, [[false, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: true, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content`, fields: {}, loadActionMenus: true, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -442,11 +448,11 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: () => { - throw new Error("no RPC expected"); - }, + const mockRPC = () => { + throw new Error("no RPC expected"); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content`, @@ -455,7 +461,8 @@ QUnit.module("Views", (hooks) => { /** ... */ }, loadActionMenus: true, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view.toy").innerHTML, @@ -484,24 +491,25 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - // the rpc is done for fields - assert.deepEqual(args.kwargs.views, [ - [false, "toy"], - [false, "search"], - ]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + // the rpc is done for fields + assert.deepEqual(args.kwargs.views, [ + [false, "toy"], + [false, "search"], + ]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", searchViewId: false, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view").innerText, @@ -531,11 +539,11 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: () => { - throw new Error("no RPC expected"); - }, + const mockRPC = () => { + throw new Error("no RPC expected"); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content`, @@ -543,7 +551,8 @@ QUnit.module("Views", (hooks) => { searchViewId: false, searchViewArch: ``, searchViewFields: {}, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view").innerText, @@ -574,18 +583,19 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: () => { - throw new Error("no RPC expected"); - }, + const mockRPC = () => { + throw new Error("no RPC expected"); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content`, fields: {}, searchViewArch: ``, searchViewFields: {}, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view").innerText, @@ -616,20 +626,20 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: (_, args) => { - // the rpc is done for fields - assert.deepEqual(args.kwargs.views, [ - [false, "toy"], - [false, "search"], - ]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: true, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + // the rpc is done for fields + assert.deepEqual(args.kwargs.views, [ + [false, "toy"], + [false, "search"], + ]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: true, + toolbar: false, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content`, @@ -638,7 +648,8 @@ QUnit.module("Views", (hooks) => { searchViewArch: ``, searchViewFields: {}, loadIrFilters: true, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view").innerText, @@ -680,11 +691,11 @@ QUnit.module("Views", (hooks) => { }, }); - await makeView({ - serverData, - mockRPC: () => { - throw new Error("no RPC expected"); - }, + const mockRPC = () => { + throw new Error("no RPC expected"); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content`, @@ -693,7 +704,8 @@ QUnit.module("Views", (hooks) => { searchViewFields: {}, loadIrFilters: true, irFilters, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view"); assert.strictEqual( target.querySelector(".o_toy_view").innerText, @@ -741,16 +753,15 @@ QUnit.module("Views", (hooks) => { }; } }; - - await makeView({ - serverData, - mockRPC, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, "a"); await click(target.querySelector("a")); @@ -788,14 +799,15 @@ QUnit.module("Views", (hooks) => { `; - await makeView({ - serverData, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, "a"); await click(target.querySelector("a")); @@ -840,14 +852,15 @@ QUnit.module("Views", (hooks) => { `; - await makeView({ - serverData, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, "a"); await click(target.querySelector("a")); @@ -866,16 +879,15 @@ QUnit.module("Views", (hooks) => { return { html: `
myBanner
` }; } }; - - await makeView({ - serverData, - mockRPC, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.verifySteps(["/mybody/isacage"]); assert.containsOnce(target, ".setmybodyfree"); @@ -929,15 +941,15 @@ QUnit.module("Views", (hooks) => { patchWithCleanup(document, { createElement }); - await makeView({ - serverData, - mockRPC, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.verifySteps(["/mybody/isacage", "js loaded", "css loaded"]); assert.containsOnce(target, ".setmybodyfree"); @@ -946,7 +958,6 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("banner can re-render with new HTML", async (assert) => { - assert.expect(10); assert.expect(8); serviceRegistry.add("action", actionService, { force: true }); @@ -975,16 +986,15 @@ QUnit.module("Views", (hooks) => { }; } }; - - await makeView({ - serverData, - mockRPC, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.verifySteps(["/mybody/isacage"]); assert.containsOnce(target, ".banner1"); @@ -1007,22 +1017,31 @@ QUnit.module("Views", (hooks) => { myBanner `; + let toy; + const ToyView = viewRegistry.get("toy"); + class ToyViewExtended extends ToyView { + setup() { + super.setup(); + toy = this; + } + } + viewRegistry.add("toy", ToyViewExtended, { force: true }); + const mockRPC = (route) => { if (route === "/mybody/isacage") { assert.step(route); return { html: bannerArch }; } }; - - const toy = await makeView({ - serverData, - mockRPC, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); assert.verifySteps(["/mybody/isacage"]); assert.containsOnce(target, ".setmybodyfree"); @@ -1081,16 +1100,15 @@ QUnit.module("Views", (hooks) => { }; } }; - - await makeView({ - mockRPC, - serverData, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); await click(target.querySelector("a[data-method='setTheControl']")); click(target.querySelector("a[data-method='heartOfTheSun']")); @@ -1147,16 +1165,15 @@ QUnit.module("Views", (hooks) => { return true; } }; - - await makeView({ - serverData, - mockRPC, + const config = { + views: [[1, "toy"]], + }; + const env = await makeTestEnv({ serverData, mockRPC, config }); + const props = { resModel: "animal", type: "toy", - config: { - views: [[1, "toy"]], - }, - }); + }; + await mount(View, target, { env, props }); const prom = new Promise((resolve) => { const complete = (ev) => { @@ -1191,19 +1208,20 @@ QUnit.module("Views", (hooks) => { QUnit.test("rendering with given jsClass", async function (assert) { assert.expect(4); - await makeView({ - serverData, - mockRPC: (_, args) => { - assert.deepEqual(args.kwargs.views, [[false, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.deepEqual(args.kwargs.views, [[false, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy_imp", - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view.toy_imp"); assert.strictEqual( target.querySelector(".o_toy_view.toy_imp").innerText, @@ -1213,20 +1231,21 @@ QUnit.module("Views", (hooks) => { QUnit.test("rendering with loaded arch attribute 'js_class'", async function (assert) { assert.expect(4); - await makeView({ - serverData, - mockRPC: (_, args) => { - assert.deepEqual(args.kwargs.views, [[2, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.deepEqual(args.kwargs.views, [[2, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", viewId: 2, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view.toy_imp"); assert.strictEqual( target.querySelector(".o_toy_view.toy_imp").innerText, @@ -1235,17 +1254,17 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("rendering with given arch attribute 'js_class'", async function (assert) { - assert.expect(2); - await makeView({ - serverData, - mockRPC: () => { - throw new Error("no RPC expected"); - }, + const mockRPC = () => { + throw new Error("no RPC expected"); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy", arch: `Specific arch content for specific class`, fields: {}, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view.toy_imp"); assert.strictEqual( target.querySelector(".o_toy_view.toy_imp").innerText, @@ -1263,20 +1282,21 @@ QUnit.module("Views", (hooks) => { ToyView2.type = "toy"; viewRegistry.add("toy_2", ToyView2); - await makeView({ - serverData, - mockRPC: (_, args) => { - assert.deepEqual(args.kwargs.views, [[2, "toy"]]); - assert.deepEqual(args.kwargs.options, { - action_id: false, - load_filters: false, - toolbar: false, - }); - }, + const mockRPC = (_, args) => { + assert.deepEqual(args.kwargs.views, [[2, "toy"]]); + assert.deepEqual(args.kwargs.options, { + action_id: false, + load_filters: false, + toolbar: false, + }); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy_2", viewId: 2, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view.toy_imp", "jsClass from arch prefered"); } ); @@ -1284,23 +1304,22 @@ QUnit.module("Views", (hooks) => { QUnit.test( "rendering with given arch attribute 'js_class' and given jsClass", async function (assert) { - assert.expect(1); - class ToyView2 extends Component {} ToyView2.template = xml`
`; ToyView2.type = "toy"; viewRegistry.add("toy_2", ToyView2); - await makeView({ - serverData, - mockRPC: () => { - throw new Error("no RPC expected"); - }, + const mockRPC = () => { + throw new Error("no RPC expected"); + }; + const env = await makeTestEnv({ serverData, mockRPC }); + const props = { resModel: "animal", type: "toy_2", arch: ``, fields: {}, - }); + }; + await mount(View, target, { env, props }); assert.containsOnce(target, ".o_toy_view.toy_imp", "jsClass from arch prefered"); } ); @@ -1310,9 +1329,10 @@ QUnit.module("Views", (hooks) => { //////////////////////////////////////////////////////////////////////////// QUnit.test("'resModel' must be passed as prop", async function (assert) { - assert.expect(2); + const env = await makeTestEnv({ serverData }); + const props = {}; try { - await makeView({ serverData }); + await mount(View, target, { env, props }); } catch (error) { assert.step(error.message); } @@ -1320,9 +1340,10 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("'type' must be passed as prop", async function (assert) { - assert.expect(2); + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal" }; try { - await makeView({ serverData, resModel: "animal" }); + await mount(View, target, { env, props }); } catch (error) { assert.step(error.message); } @@ -1330,9 +1351,7 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("'arch' cannot be passed as prop alone", async function (assert) { - assert.expect(2); const env = await makeTestEnv({ serverData }); - const target = getFixture(); const props = { resModel: "animal", type: "toy", arch: "" }; try { await mount(View, target, { env, props }); @@ -1343,9 +1362,10 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("'fields' cannot be passed as prop alone", async function (assert) { - assert.expect(2); + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", fields: {} }; try { - await makeView({ serverData, resModel: "animal", type: "toy", fields: {} }); + await mount(View, target, { env, props }); } catch (error) { assert.step(error.message); } @@ -1353,14 +1373,10 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("'searchViewArch' cannot be passed as prop alone", async function (assert) { - assert.expect(2); + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", searchViewArch: "" }; try { - await makeView({ - serverData, - resModel: "animal", - type: "toy", - searchViewArch: "", - }); + await mount(View, target, { env, props }); } catch (error) { assert.step(error.message); } @@ -1370,9 +1386,10 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("'searchViewFields' cannot be passed as prop alone", async function (assert) { - assert.expect(2); + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", searchViewFields: {} }; try { - await makeView({ serverData, resModel: "animal", type: "toy", searchViewFields: {} }); + await mount(View, target, { env, props }); } catch (error) { assert.step(error.message); } @@ -1409,15 +1426,16 @@ QUnit.module("Views", (hooks) => { viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ - serverData, + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", domain: [[0, "=", 1]], groupBy: ["birthday"], context: { key: "val" }, orderBy: ["bar"], - }); + }; + await mount(View, target, { env, props }); } ); @@ -1433,12 +1451,13 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ - serverData, + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", noContentHelp: "
Help
", - }); + }; + await mount(View, target, { env, props }); }); QUnit.test("useSampleModel false by default", async function (assert) { @@ -1453,7 +1472,9 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ serverData, resModel: "animal", type: "toy" }); + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy" }; + await mount(View, target, { env, props }); }); QUnit.test("sample='1' on arch", async function (assert) { @@ -1468,13 +1489,14 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ - serverData, + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", arch: ``, fields: {}, - }); + }; + await mount(View, target, { env, props }); }); QUnit.test("sample='0' on arch and useSampleModel=true", async function (assert) { @@ -1489,14 +1511,15 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ - serverData, + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", useSampleModel: true, arch: ``, fields: {}, - }); + }; + await mount(View, target, { env, props }); }); QUnit.test("sample='1' on arch and useSampleModel=false", async function (assert) { @@ -1511,14 +1534,15 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ - serverData, + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", useSampleModel: false, arch: ``, fields: {}, - }); + }; + await mount(View, target, { env, props }); }); QUnit.test("useSampleModel=true", async function (assert) { @@ -1533,7 +1557,9 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ serverData, resModel: "animal", type: "toy", useSampleModel: true }); + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", useSampleModel: true }; + await mount(View, target, { env, props }); }); QUnit.test("rendering with given prop", async function (assert) { @@ -1548,12 +1574,9 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ - serverData, - resModel: "animal", - type: "toy", - specificProp: "specificProp", - }); + const env = await makeTestEnv({ serverData }); + const props = { resModel: "animal", type: "toy", specificProp: "specificProp" }; + await mount(View, target, { env, props }); }); QUnit.test( @@ -1578,8 +1601,8 @@ QUnit.module("Views", (hooks) => { ToyView.type = "toy"; viewRegistry.add("toy", ToyView, { force: true }); - await makeView({ - serverData, + const env = await makeTestEnv({ serverData }); + const props = { type: "toy", resModel: "animal", searchViewId: 1, @@ -1587,7 +1610,8 @@ QUnit.module("Views", (hooks) => { groupBy: ["birthday"], context: { search_default_filter: 1, search_default_group_by: 1 }, orderBy: ["bar"], - }); + }; + await mount(View, target, { env, props }); } ); @@ -1600,10 +1624,10 @@ QUnit.module("Views", (hooks) => { class ToyView extends Component { setup() { - owl.onWillStart(() => { + onWillStart(() => { assert.deepEqual(this.props.domain, [["type", "=", "carnivorous"]]); }); - owl.onWillUpdateProps((nextProps) => { + onWillUpdateProps((nextProps) => { assert.deepEqual(nextProps.domain, [["type", "=", "herbivorous"]]); }); } @@ -1626,7 +1650,6 @@ QUnit.module("Views", (hooks) => { Parent.template = xml``; Parent.components = { View }; - const target = getFixture(); const parent = await mount(Parent, target, { env }); parent.state.domain = [["type", "=", "herbivorous"]];