/**
* @jest-environment jsdom
*/
import { useKBar } from "../useKBar";
import { KBarProvider } from "../KBarContextProvider";
import { render, fireEvent, RenderResult } from "@testing-library/react";
import * as React from "react";
import { createAction, Priority } from "../utils";
import { useMatches } from "../useMatches";
jest.mock("../utils", () => {
return {
...jest.requireActual("../utils"),
// Mock out throttling as we don't need it in our test environment.
useThrottledValue: (value) => value,
};
});
function Search() {
const { search, query } = useKBar((state) => ({
search: state.searchQuery,
}));
return (
query.setSearch(e.target.value)}
/>
);
}
function Results() {
const { results } = useMatches();
return (
{results.map((result) =>
typeof result === "string" ? (
- {result}
) : (
- {result.name}
)
)}
);
}
function BasicComponent() {
const action1 = createAction({ name: "Action 1" });
const action2 = createAction({ name: "Action 2" });
const action3 = createAction({ name: "Action 3" });
const childAction1 = createAction({
name: "Child Action 1",
parent: action1.id,
});
return (
);
}
function WithPriorityComponent() {
const action1 = createAction({ name: "Action 1", priority: Priority.LOW });
const action2 = createAction({ name: "Action 2", priority: Priority.HIGH });
const action3 = createAction({ name: "Action 3", priority: Priority.HIGH });
const action4 = createAction({
name: "Action 4",
priority: Priority.HIGH,
section: {
name: "Section 1",
priority: Priority.HIGH,
},
});
const childAction1 = createAction({
name: "Child Action 1",
parent: action1.id,
});
return (
);
}
const setup = (Component: React.ComponentType) => {
const utils = render();
const input = utils.getByLabelText("search-input");
return {
input,
...utils,
} as Utils;
};
type Utils = RenderResult & { input: HTMLInputElement };
describe("useMatches", () => {
describe("Basic", () => {
let utils: Utils;
beforeEach(() => {
utils = setup(BasicComponent);
});
it("returns root results with an empty search query", () => {
const results = utils.getAllByText(/Action/i);
expect(results.length).toEqual(3);
expect(results[0].textContent).toEqual("Action 1");
expect(results[1].textContent).toEqual("Action 2");
expect(results[2].textContent).toEqual("Action 3");
});
it("returns nested results when search query is present", () => {
const { input } = utils;
fireEvent.change(input, { target: { value: "1" } });
const results = utils.getAllByText(/Action/i);
expect(results.length).toEqual(2);
expect(results[0].textContent).toEqual("Action 1");
expect(results[1].textContent).toEqual("Child Action 1");
});
});
describe("With priority", () => {
let utils: Utils;
beforeEach(() => {
utils = setup(WithPriorityComponent);
});
it("returns a prioritized list", () => {
const results = utils.getAllByText(/Action/i);
expect(results.length).toEqual(4);
expect(results[0].textContent).toEqual("Action 4");
expect(results[1].textContent).toEqual("Action 2");
expect(results[2].textContent).toEqual("Action 3");
expect(results[3].textContent).toEqual("Action 1");
expect(utils.queryAllByText(/Section 1/i));
});
});
});