Odoo18-Base/addons/web/static/tests/search/search_panel_mobile.test.js
2025-01-06 10:57:38 +07:00

137 lines
3.9 KiB
JavaScript

import { describe, expect, test } from "@odoo/hoot";
import { queryAllTexts } from "@odoo/hoot-dom";
import { Component, xml } from "@odoo/owl";
import {
contains,
defineModels,
fields,
models,
mountWithSearch,
} from "@web/../tests/web_test_helpers";
import { SearchPanel } from "@web/search/search_panel/search_panel";
class Partner extends models.Model {
name = fields.Char();
foo = fields.Char();
bar = fields.Boolean();
int_field = fields.Integer({ string: "Int Field", aggregator: "sum" });
category_id = fields.Many2one({ string: "category", relation: "category" });
state = fields.Selection({
selection: [
["abc", "ABC"],
["def", "DEF"],
["ghi", "GHI"],
],
});
_records = [
{
id: 1,
bar: true,
foo: "yop",
int_field: 1,
state: "abc",
category_id: 6,
},
{
id: 2,
bar: true,
foo: "blip",
int_field: 2,
state: "def",
category_id: 7,
},
{
id: 3,
bar: true,
foo: "gnap",
int_field: 4,
state: "ghi",
category_id: 7,
},
{
id: 4,
bar: false,
foo: "blip",
int_field: 8,
state: "ghi",
category_id: 7,
},
];
_views = {
search: /* xml */ `
<search>
<filter name="false_domain" string="False Domain" domain="[(0, '=', 1)]"/>
<filter name="filter" string="Filter" domain="[('bar', '=', true)]"/>
<filter name="true_domain" string="True Domain" domain="[(1, '=', 1)]"/>
<filter name="group_by_bar" string="Bar" context="{ 'group_by': 'bar' }"/>
<searchpanel view_types="kanban,list,toy">
<field name="category_id" expand="1"/>
</searchpanel>
</search>
`,
};
}
class Category extends models.Model {
name = fields.Char({ string: "Category Name" });
_records = [
{ id: 6, name: "gold" },
{ id: 7, name: "silver" },
];
}
defineModels([Partner, Category]);
describe.current.tags("mobile");
test("basic search panel rendering", async () => {
class Parent extends Component {
static components = { SearchPanel };
static template = xml`<SearchPanel/>`;
static props = ["*"];
}
await mountWithSearch(Parent, {
resModel: "partner",
searchViewId: false,
});
expect(".o_search_panel .o-dropdown").toHaveCount(1);
expect(".o_search_panel .o-dropdown").toHaveText("category");
await contains(".o_search_panel .o-dropdown").click();
expect(".o_search_panel_section.o_search_panel_category").toHaveCount(1);
expect(".o_search_panel_category_value").toHaveCount(3);
expect(queryAllTexts(".o_search_panel_field li")).toEqual(["All", "gold", "silver"]);
await contains(".o_search_panel_category_value:nth-of-type(2) header").click();
expect(".o_search_panel .o-dropdown").toHaveText("gold");
expect(".o_search_panel a").toHaveCount(1);
await contains(".o_search_panel a").click();
expect(".o_search_panel .o-dropdown").toHaveText("category");
});
test("Dropdown closes on category selection", async () => {
class Parent extends Component {
static components = { SearchPanel };
static template = xml`<SearchPanel/>`;
static props = ["*"];
}
await mountWithSearch(Parent, {
resModel: "partner",
searchViewId: false,
});
expect(".o-dropdown--menu").toHaveCount(0);
await contains(".o_search_panel .o-dropdown").click();
expect(".o-dropdown--menu").toHaveCount(1);
await contains(".o_search_panel_category_value:nth-of-type(2) header").click();
expect(".o-dropdown--menu").toHaveCount(0);
});