1import { act, type ReactNode } from "react";
2import { createRoot, type Root } from "react-dom/client";
3import { afterEach, expect, it, vi } from "vite-plus/test";
4
5vi.mock("react-native", () => ({
6 View: (props: { readonly children?: ReactNode }) => <div>{props.children}</div>,
7 Keyboard: { dismiss: () => {} },
8 BackHandler: { addEventListener: () => ({ remove: () => {} }) },
9}));
10// React Navigation throws this outside a navigator, as for the Arrange threads sheet.
11vi.mock("@react-navigation/native", () => ({
12 useIsFocused: () => {
13 throw new Error("Couldn't find a navigation object.");
14 },
15}));
16vi.mock("./AndroidScreenHeader.android", () => ({
17 AndroidScreenHeader: (props: { readonly title: string }) => <h1>{props.title}</h1>,
18}));
19vi.mock("./WorkspaceAppBar.android", () => ({
20 useHasWorkspaceAppBar: () => false,
21 WorkspaceAppBar: () => null,
22}));
23vi.mock("./Menu", () => ({ Menu: (props: { readonly children?: ReactNode }) => props.children }));
24vi.mock("./ScreenHeaderButton.android", () => ({ ScreenHeaderButton: () => null }));
25vi.mock("./SearchField", () => ({ SearchField: () => null }));
26vi.mock("./Button", () => ({ Button: () => null }));
27vi.mock("../../features/layout/adaptive-workspace-context", () => ({
28 useAdaptiveWorkspaceLayout: () => ({ layout: { usesSplitView: false } }),
29}));
30vi.mock("./useToolbarLayout", () => ({
31 useToolbarLayout: () => ({ height: 48, paddingTop: 0, paddingBottom: 0 }),
32}));
33vi.mock("../../native/StackHeader", () => ({ NativeStackScreenOptions: () => null }));
34vi.mock("../../features/layout/useSidebarToggle", () => ({ useSidebarToggle: () => null }));
35vi.mock("../../features/settings/appearance/AppearancePreferencesProvider", () => ({
36 useAppearancePreferences: () => ({ themeVariables: {} }),
37}));
38
39import { AppBar } from "./AppBar.android";
40
41const roots: Root[] = [];
42
43afterEach(() => {
44 for (const root of roots.splice(0)) act(() => root.unmount());
45 document.body.innerHTML = "";
46});
47
48it("renders a sheet bar without search outside a navigation container", () => {
49 vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
50 const container = document.createElement("div");
51 document.body.append(container);
52 const root = createRoot(container);
53 roots.push(root);
54
55 act(() => root.render(<AppBar sheet title="Arrange threads" />));
56
57 expect(container.textContent).toBe("Arrange threads");
58});