Open History to see the last commit
1import { afterEach, describe, expect, it, vi } from "vite-plus/test";
2
3const navigation = vi.hoisted(() => ({
4 navigate: vi.fn(),
5 ready: true,
6 queue: [] as Array<() => void>,
7}));
8const optOut = vi.hoisted(() => ({ optedOut: new Set<string>() }));
9
10vi.mock("../../lib/rootNavigation", () => ({
11 rootNavigationRef: navigation,
12 whenRootNavigationReady: (navigate: () => void) =>
13 navigation.ready ? navigate() : navigation.queue.push(navigate),
14}));
15vi.mock("./connectOnboardingOptOut", () => ({
16 isConnectOnboardingOptedOut: (accountId: string) =>
17 Promise.resolve(optOut.optedOut.has(accountId)),
18}));
19
20import { clearConnectOnboardingRequest, requestConnectOnboarding } from "./connectOnboarding";
21
22afterEach(() => {
23 clearConnectOnboardingRequest();
24 optOut.optedOut.clear();
25 navigation.navigate.mockReset();
26 navigation.ready = true;
27 navigation.queue.length = 0;
28 vi.useRealTimers();
29});
30
31describe("requestConnectOnboarding", () => {
32 it("presents the sheet after the settle delay", async () => {
33 vi.useFakeTimers();
34 requestConnectOnboarding("account-1");
35 await vi.advanceTimersByTimeAsync(599);
36 expect(navigation.navigate).not.toHaveBeenCalled();
37 await vi.advanceTimersByTimeAsync(1);
38 expect(navigation.navigate).toHaveBeenCalledExactlyOnceWith("ConnectOnboarding");
39 });
40
41 it("drops a request cleared by sign-out before it fires", async () => {
42 vi.useFakeTimers();
43 requestConnectOnboarding("account-1");
44 clearConnectOnboardingRequest();
45 await vi.runAllTimersAsync();
46 expect(navigation.navigate).not.toHaveBeenCalled();
47 });
48
49 it("skips accounts that opted out", async () => {
50 vi.useFakeTimers();
51 optOut.optedOut.add("account-1");
52 requestConnectOnboarding("account-1");
53 await vi.runAllTimersAsync();
54 expect(navigation.navigate).not.toHaveBeenCalled();
55 });
56
57 it("presents once when a newer request replaces a pending one", async () => {
58 vi.useFakeTimers();
59 requestConnectOnboarding("account-1");
60 requestConnectOnboarding("account-2");
61 await vi.runAllTimersAsync();
62 expect(navigation.navigate).toHaveBeenCalledOnce();
63 });
64
65 it("drops a request cleared while it waits for navigation to be ready", async () => {
66 vi.useFakeTimers();
67 navigation.ready = false;
68 requestConnectOnboarding("account-1");
69 await vi.runAllTimersAsync();
70 clearConnectOnboardingRequest();
71 for (const navigate of navigation.queue.splice(0)) navigate();
72 expect(navigation.navigate).not.toHaveBeenCalled();
73 });
74});