Skip to content

Commit 54983e3

Browse files
fix(web): sidebar test runs in the browser project and jsdom pragmas are rejected (#21937)
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
1 parent b34501a commit 54983e3

14 files changed

Lines changed: 131 additions & 21 deletions

‎apps/mobile/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"sync:pierre-icons": "node scripts/sync-pierre-file-icons.mjs",
4444
"measure-renders": "node scripts/measure-renders.mts",
4545
"generate": "node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON scripts/generate-uniwind-themes.mts",
46-
"test": "vp test run --config ../../vite.config.ts --dir .",
46+
"test": "vp test run --project unit --project react",
4747
"typecheck": "tsc-rs --noEmit"
4848
},
4949
"dependencies": {

‎apps/mobile/src/features/home/home-route-visibility.test.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @vitest-environment jsdom
21
import { RegistryContext } from "@effect/atom-react";
32
import { Atom, AtomRegistry } from "effect/reactivity";
43
import { act, useEffect } from "react";

‎apps/mobile/src/features/settings/SettingsServerControlsRouteScreen.test.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @vitest-environment jsdom
21
import { DEFAULT_SERVER_SETTINGS, type ServerSettingsPatch } from "@t3tools/contracts";
32
import * as Cause from "effect/Cause";
43
import { AsyncResult } from "effect/reactivity";

‎apps/mobile/src/features/settings/components/BranchNamingSettings.test.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @vitest-environment jsdom
21
import type { BranchNamingMode } from "@t3tools/contracts";
32
import type { ReactNode } from "react";
43
import { act } from "react";

‎apps/mobile/src/features/threads/use-visible-second-clock.test.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @vitest-environment jsdom
21
import { act, useEffect, useLayoutEffect, useSyncExternalStore } from "react";
32
import { createRoot, type Root } from "react-dom/client";
43
import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test";

‎apps/mobile/src/features/threads/useThreadHeaderOptions.test.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @vitest-environment jsdom
21
import type { VcsStatusResult } from "@t3tools/contracts";
32
import { act } from "react";
43
import { createRoot, type Root } from "react-dom/client";

‎apps/mobile/src/native/NativeHeaderToolbar.test.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @vitest-environment jsdom
21
import type { NativeStackHeaderItem } from "@react-navigation/native-stack";
32
import { act } from "react";
43
import { createRoot, type Root } from "react-dom/client";

‎apps/mobile/src/state/use-selected-thread-git-actions.test.tsx‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @vitest-environment jsdom
21
import { act, useEffect, useReducer } from "react";
32
import { createRoot, type Root } from "react-dom/client";
43
import { AsyncResult } from "effect/reactivity";

‎apps/mobile/vite.config.ts‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { defineConfig } from "vite-plus";
2+
import "vite-plus/test/config";
3+
4+
const reactTests = [
5+
"src/features/home/home-route-visibility.test.tsx",
6+
"src/features/settings/SettingsServerControlsRouteScreen.test.tsx",
7+
"src/features/settings/components/BranchNamingSettings.test.tsx",
8+
"src/features/threads/use-visible-second-clock.test.tsx",
9+
"src/features/threads/useThreadHeaderOptions.test.tsx",
10+
"src/native/NativeHeaderToolbar.test.tsx",
11+
"src/state/use-selected-thread-git-actions.test.tsx",
12+
];
13+
14+
export default defineConfig({
15+
test: {
16+
hookTimeout: 60_000,
17+
testTimeout: 60_000,
18+
projects: [
19+
{
20+
extends: true,
21+
test: {
22+
name: "unit",
23+
include: ["**/*.test.{ts,tsx,mjs}"],
24+
exclude: ["**/node_modules/**", ...reactTests],
25+
setupFiles: ["../../packages/shared/src/testing/longTempDir.ts"],
26+
},
27+
},
28+
{
29+
extends: true,
30+
test: {
31+
name: "react",
32+
include: reactTests,
33+
// Native components mock React Native and render through react-dom in these tests.
34+
environment: "jsdom",
35+
},
36+
},
37+
],
38+
},
39+
});

apps/web/src/components/ui/sidebar.test.tsx renamed to apps/web/src/components/ui/sidebar.browser.test.tsx

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
1-
// @vitest-environment jsdom
1+
import "../../index.css";
22

33
import { act } from "react";
44
import { createRoot, type Root } from "react-dom/client";
5-
import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test";
5+
import { afterEach, beforeEach, describe, expect, it } from "vite-plus/test";
6+
7+
import { page, userEvent } from "vite-plus/test/browser";
68

79
import { Sidebar, SidebarProvider, SidebarTrigger } from "./sidebar";
810
import { resolveSidebarState } from "./sidebarState";
911

1012
let root: Root;
1113
let container: HTMLDivElement;
1214

13-
beforeEach(() => {
14-
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
15-
vi.stubGlobal("matchMedia", (query: string) => ({
16-
matches: false,
17-
media: query,
18-
addEventListener: vi.fn(),
19-
removeEventListener: vi.fn(),
20-
}));
15+
beforeEach(async () => {
16+
await page.viewport(1280, 900);
2117
container = document.createElement("div");
2218
document.body.append(container);
2319
root = createRoot(container);
@@ -26,7 +22,6 @@ beforeEach(() => {
2622
afterEach(async () => {
2723
await act(async () => root.unmount());
2824
container.remove();
29-
vi.unstubAllGlobals();
3025
});
3126

3227
async function renderSidebar(open: boolean) {
@@ -73,11 +68,20 @@ describe("desktop sidebar focus", () => {
7368
await renderSidebar(false);
7469

7570
expect(document.activeElement).toBe(element('[data-testid="external-trigger"]'));
76-
expect(sidebar.hasAttribute("inert")).toBe(true);
71+
expect(sidebar.inert).toBe(true);
72+
control.focus();
73+
expect(document.activeElement).toBe(element('[data-testid="external-trigger"]'));
74+
await userEvent.keyboard("{Shift>}{Tab}{/Shift}");
75+
expect(document.activeElement).not.toBe(element('[data-testid="internal-trigger"]'));
76+
expect(document.activeElement).not.toBe(control);
77+
await userEvent.keyboard("{Tab}");
78+
expect(document.activeElement).toBe(element('[data-testid="external-trigger"]'));
79+
await userEvent.keyboard("{Tab}");
80+
expect(document.activeElement).toBe(element('[data-testid="content-control"]'));
7781

7882
await renderSidebar(true);
7983

80-
expect(sidebar.hasAttribute("inert")).toBe(false);
84+
expect(sidebar.inert).toBe(false);
8185
control.focus();
8286
expect(document.activeElement).toBe(control);
8387
});

0 commit comments

Comments
 (0)