Skip to content

Commit 7731fdf

Browse files
authored
Make the boundary show errors less (#1517)
1 parent f81e0e5 commit 7731fdf

File tree

2 files changed

+297
-68
lines changed

2 files changed

+297
-68
lines changed
Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
import { render, screen } from "@testing-library/react";
2+
import { describe, expect, test, vi } from "vitest";
3+
4+
import { EdgeDiscoveryBoundary } from "./EdgeDiscoveryBoundary";
5+
6+
vi.mock("@/core", async () => {
7+
const actual = await vi.importActual("@/core");
8+
return {
9+
...actual,
10+
useMaybeActiveSchema: vi.fn(),
11+
};
12+
});
13+
14+
vi.mock("@/hooks/useSchemaSync", () => ({
15+
useSchemaSync: vi.fn(),
16+
useCancelSchemaSync: vi.fn(() => vi.fn()),
17+
}));
18+
19+
vi.mock("@/hooks", async () => {
20+
const actual = await vi.importActual("@/hooks");
21+
return {
22+
...actual,
23+
useTranslations: () => (key: string) => key,
24+
};
25+
});
26+
27+
import { useMaybeActiveSchema } from "@/core";
28+
import { useSchemaSync } from "@/hooks/useSchemaSync";
29+
import { createRandomEdgeConnection } from "@/utils/testing/randomData";
30+
31+
const mockedUseMaybeActiveSchema = vi.mocked(useMaybeActiveSchema);
32+
const mockedUseSchemaSync = vi.mocked(useSchemaSync);
33+
34+
function createMockSchemaSync(
35+
overrides: Partial<ReturnType<typeof useSchemaSync>> = {},
36+
): ReturnType<typeof useSchemaSync> {
37+
return {
38+
schemaDiscoveryQuery: {
39+
isLoading: false,
40+
error: null,
41+
refetch: vi.fn(),
42+
} as unknown as ReturnType<typeof useSchemaSync>["schemaDiscoveryQuery"],
43+
edgeDiscoveryQuery: {
44+
isLoading: false,
45+
error: null,
46+
refetch: vi.fn(),
47+
} as unknown as ReturnType<typeof useSchemaSync>["edgeDiscoveryQuery"],
48+
refreshSchema: vi.fn(),
49+
isFetching: false,
50+
...overrides,
51+
};
52+
}
53+
54+
describe("EdgeDiscoveryBoundary", () => {
55+
test("renders children when edgeConnections is defined", () => {
56+
mockedUseMaybeActiveSchema.mockReturnValue({
57+
vertices: [],
58+
edges: [],
59+
edgeConnections: [createRandomEdgeConnection()],
60+
});
61+
mockedUseSchemaSync.mockReturnValue(createMockSchemaSync());
62+
63+
render(
64+
<EdgeDiscoveryBoundary>
65+
<div>Children</div>
66+
</EdgeDiscoveryBoundary>,
67+
);
68+
69+
expect(screen.getByText("Children")).toBeInTheDocument();
70+
});
71+
72+
test("renders children when edgeConnections exists even if edge query has error", () => {
73+
mockedUseMaybeActiveSchema.mockReturnValue({
74+
vertices: [],
75+
edges: [],
76+
edgeConnections: [createRandomEdgeConnection()],
77+
});
78+
mockedUseSchemaSync.mockReturnValue(
79+
createMockSchemaSync({
80+
edgeDiscoveryQuery: {
81+
isLoading: false,
82+
error: new Error("Query failed"),
83+
refetch: vi.fn(),
84+
} as unknown as ReturnType<typeof useSchemaSync>["edgeDiscoveryQuery"],
85+
}),
86+
);
87+
88+
render(
89+
<EdgeDiscoveryBoundary>
90+
<div>Children</div>
91+
</EdgeDiscoveryBoundary>,
92+
);
93+
94+
expect(screen.getByText("Children")).toBeInTheDocument();
95+
});
96+
97+
test("renders children when edgeConnections exists even if edgeConnectionDiscoveryFailed is true", () => {
98+
mockedUseMaybeActiveSchema.mockReturnValue({
99+
vertices: [],
100+
edges: [],
101+
edgeConnections: [createRandomEdgeConnection()],
102+
edgeConnectionDiscoveryFailed: true,
103+
});
104+
mockedUseSchemaSync.mockReturnValue(createMockSchemaSync());
105+
106+
render(
107+
<EdgeDiscoveryBoundary>
108+
<div>Children</div>
109+
</EdgeDiscoveryBoundary>,
110+
);
111+
112+
expect(screen.getByText("Children")).toBeInTheDocument();
113+
});
114+
115+
test("renders loading when edgeConnections is undefined and queries are loading", () => {
116+
mockedUseMaybeActiveSchema.mockReturnValue({
117+
vertices: [],
118+
edges: [],
119+
edgeConnections: undefined,
120+
});
121+
mockedUseSchemaSync.mockReturnValue(
122+
createMockSchemaSync({
123+
edgeDiscoveryQuery: {
124+
isLoading: true,
125+
error: null,
126+
refetch: vi.fn(),
127+
} as unknown as ReturnType<typeof useSchemaSync>["edgeDiscoveryQuery"],
128+
}),
129+
);
130+
131+
render(
132+
<EdgeDiscoveryBoundary>
133+
<div>Children</div>
134+
</EdgeDiscoveryBoundary>,
135+
);
136+
137+
expect(screen.getByText("Synchronizing...")).toBeInTheDocument();
138+
expect(screen.queryByText("Children")).not.toBeInTheDocument();
139+
});
140+
141+
test("renders error with retry when edgeConnections is undefined and schema query has error", () => {
142+
mockedUseMaybeActiveSchema.mockReturnValue({
143+
vertices: [],
144+
edges: [],
145+
edgeConnections: undefined,
146+
});
147+
mockedUseSchemaSync.mockReturnValue(
148+
createMockSchemaSync({
149+
schemaDiscoveryQuery: {
150+
isLoading: false,
151+
error: new Error("Schema query failed"),
152+
refetch: vi.fn(),
153+
} as unknown as ReturnType<
154+
typeof useSchemaSync
155+
>["schemaDiscoveryQuery"],
156+
}),
157+
);
158+
159+
render(
160+
<EdgeDiscoveryBoundary>
161+
<div>Children</div>
162+
</EdgeDiscoveryBoundary>,
163+
);
164+
165+
expect(screen.queryByText("Children")).not.toBeInTheDocument();
166+
expect(screen.getByRole("button", { name: /retry/i })).toBeInTheDocument();
167+
});
168+
169+
test("renders error with retry when edgeConnections is undefined and edge query has error", () => {
170+
mockedUseMaybeActiveSchema.mockReturnValue({
171+
vertices: [],
172+
edges: [],
173+
edgeConnections: undefined,
174+
});
175+
mockedUseSchemaSync.mockReturnValue(
176+
createMockSchemaSync({
177+
edgeDiscoveryQuery: {
178+
isLoading: false,
179+
error: new Error("Query failed"),
180+
refetch: vi.fn(),
181+
} as unknown as ReturnType<typeof useSchemaSync>["edgeDiscoveryQuery"],
182+
}),
183+
);
184+
185+
render(
186+
<EdgeDiscoveryBoundary>
187+
<div>Children</div>
188+
</EdgeDiscoveryBoundary>,
189+
);
190+
191+
expect(screen.queryByText("Children")).not.toBeInTheDocument();
192+
expect(screen.getByRole("button", { name: /retry/i })).toBeInTheDocument();
193+
});
194+
195+
test("renders failure state when edgeConnections is undefined and discovery failed", () => {
196+
mockedUseMaybeActiveSchema.mockReturnValue({
197+
vertices: [],
198+
edges: [],
199+
edgeConnections: undefined,
200+
edgeConnectionDiscoveryFailed: true,
201+
});
202+
mockedUseSchemaSync.mockReturnValue(createMockSchemaSync());
203+
204+
render(
205+
<EdgeDiscoveryBoundary>
206+
<div>Children</div>
207+
</EdgeDiscoveryBoundary>,
208+
);
209+
210+
expect(screen.getByText(/discovery failed/)).toBeInTheDocument();
211+
expect(screen.queryByText("Children")).not.toBeInTheDocument();
212+
});
213+
214+
test("renders nothing when schema is undefined", () => {
215+
mockedUseMaybeActiveSchema.mockReturnValue(undefined);
216+
mockedUseSchemaSync.mockReturnValue(createMockSchemaSync());
217+
218+
const { container } = render(
219+
<EdgeDiscoveryBoundary>
220+
<div>Children</div>
221+
</EdgeDiscoveryBoundary>,
222+
);
223+
224+
expect(screen.queryByText("Children")).not.toBeInTheDocument();
225+
expect(container.innerHTML).toBe("");
226+
});
227+
});

0 commit comments

Comments
 (0)