import * as React from "react";
import { screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { setupServer } from "msw/node";
import { http, HttpResponse } from "msw";
import CustomLists from "../../../src/components/CustomLists";
import renderWithContext from "../testUtils/renderWithContext";
import buildStore from "../../../src/store";
import { ConfigurationSettings } from "../../../src/interfaces";
describe("CustomLists", () => {
// Stub scrollTo, since a component in the render tree will try to call it, and it is not
// provided by JSDOM.
// eslint-disable-next-line @typescript-eslint/no-empty-function
Element.prototype.scrollTo = () => {};
const server = setupServer(
http.get("*/search", () => HttpResponse.xml("")),
http.get("*", () => HttpResponse.json({}))
);
beforeAll(() => {
server.listen();
});
afterAll(() => {
server.close();
});
it("adds filters when new filter values are entered", async () => {
const user = userEvent.setup();
const appConfigSettings: Partial = {
csrfToken: "",
featureFlags: {},
roles: [{ role: "system" }],
};
renderWithContext(
,
appConfigSettings
);
await user.click(screen.getByRole("textbox", { name: "filter value" }));
await user.keyboard("horror{enter}");
const items = screen.getAllByRole("treeitem");
expect(items).toHaveLength(1);
expect(items[0]).toHaveTextContent(/Genre = horror/);
await user.click(screen.getByRole("textbox", { name: "filter value" }));
await user.keyboard("science fiction{enter}");
const newItems = screen.getAllByRole("treeitem");
expect(newItems).toHaveLength(3);
expect(newItems[0]).toHaveTextContent(
/all of these filters must be matched/i
);
expect(newItems[1]).toHaveTextContent(/genre = horror/i);
expect(newItems[2]).toHaveTextContent(/genre = science fiction/i);
});
it("replaces the existing filters when adding a new filter when the clear filters checkbox is checked", async () => {
const user = userEvent.setup();
const appConfigSettings: Partial = {
csrfToken: "",
featureFlags: {},
roles: [{ role: "system" }],
};
renderWithContext(
,
appConfigSettings
);
await user.click(screen.getByRole("textbox", { name: "filter value" }));
await user.keyboard("horror{enter}");
let items = screen.getAllByRole("treeitem");
expect(items).toHaveLength(1);
expect(items[0]).toHaveTextContent(/Genre = horror/);
await user.click(screen.getByRole("textbox", { name: "filter value" }));
await user.keyboard("science fiction{enter}");
items = screen.getAllByRole("treeitem");
expect(items).toHaveLength(3);
await user.click(screen.getByRole("checkbox", { name: /clear filters/i }));
await user.click(screen.getByRole("textbox", { name: "filter value" }));
await user.keyboard("fantasy{enter}");
items = screen.getAllByRole("treeitem");
expect(items).toHaveLength(1);
});
it("sends the language=all search parameter", async () => {
let searchParams = null;
server.use(
http.get("*/search", ({ request }) => {
const url = new URL(request.url);
searchParams = url.searchParams;
return HttpResponse.xml("");
})
);
const user = userEvent.setup();
const appConfigSettings: Partial = {
csrfToken: "",
featureFlags: {},
roles: [{ role: "system" }],
};
renderWithContext(
,
appConfigSettings
);
await user.click(screen.getByRole("textbox", { name: "filter value" }));
await user.keyboard("horror{enter}");
await waitFor(() => {
expect(searchParams.get("language")).toEqual("all");
expect(JSON.parse(searchParams.get("q"))).toEqual({
query: {
key: "genre",
value: "horror",
},
});
});
});
it("sends the language=all search parameter when a language filter is added, and places the language filter in the q parameter", async () => {
let searchParams = null;
server.use(
http.get("*/search", ({ request }) => {
const url = new URL(request.url);
searchParams = url.searchParams;
return HttpResponse.xml("");
})
);
const user = userEvent.setup();
const appConfigSettings: Partial = {
csrfToken: "",
featureFlags: {},
roles: [{ role: "system" }],
};
renderWithContext(
,
appConfigSettings
);
await userEvent.selectOptions(
screen.getByRole("combobox", { name: "filter field key" }),
screen.getByRole("option", { name: "Language" })
);
await user.click(screen.getByRole("textbox", { name: "filter value" }));
await user.keyboard("french{enter}");
await waitFor(() => {
expect(searchParams.get("language")).toEqual("all");
expect(JSON.parse(searchParams.get("q"))).toEqual({
query: {
key: "language",
value: "french",
},
});
});
});
});