-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathuse-state-subscription.spec.ts
More file actions
115 lines (96 loc) · 3.41 KB
/
use-state-subscription.spec.ts
File metadata and controls
115 lines (96 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import {
useCtrlStateQuery,
useCtrlStateSSubscription,
} from "@/graphql/codegen/generated";
import { useSubscribeState } from "../use-state-subscription";
vi.mock("@/graphql/codegen/generated", () => ({
useCtrlStateQuery: vi.fn(),
useCtrlStateSSubscription: vi.fn(),
}));
describe("useSubscribeState", () => {
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
vi.resetAllMocks();
});
it("fetches initial state successfully from the query", () => {
vi.mocked(useCtrlStateQuery).mockReturnValue({
data: { value: { ctrl: { state: "initialized" } } },
error: { value: undefined },
} as any);
vi.mocked(useCtrlStateSSubscription).mockReturnValue({
data: { value: undefined },
error: { value: undefined },
} as any);
const { state } = useSubscribeState();
expect(state.value).toBe("initialized");
});
it("updates state from subscription", () => {
const queryMock = vi.mocked(useCtrlStateQuery);
const subscriptionMock = vi.mocked(useCtrlStateSSubscription);
queryMock.mockReturnValue({
data: { value: { ctrl: { state: "initial" } } },
error: { value: undefined },
} as any);
subscriptionMock.mockReturnValue({
data: { value: { ctrlState: "updated" } },
error: { value: undefined },
} as any);
const { state } = useSubscribeState();
expect(state.value).toBe("updated");
});
it("handles query error", () => {
vi.mocked(useCtrlStateQuery).mockReturnValue({
data: { value: undefined },
error: { value: new Error("Query error") },
} as any);
vi.mocked(useCtrlStateSSubscription).mockReturnValue({
data: { value: undefined },
error: { value: undefined },
} as any);
const { state, error } = useSubscribeState();
expect(state.value).toBeUndefined();
expect(error.value).toEqual(new Error("Query error"));
});
it("handles subscription error", () => {
vi.mocked(useCtrlStateQuery).mockReturnValue({
data: { value: { ctrl: { state: "initial" } } },
error: { value: undefined },
} as any);
vi.mocked(useCtrlStateSSubscription).mockReturnValue({
data: { value: undefined },
error: { value: new Error("Subscription error") },
} as any);
const { state, error } = useSubscribeState();
expect(state.value).toBeUndefined();
expect(error.value).toEqual(new Error("Subscription error"));
});
it("can be used as a promise", async () => {
vi.mocked(useCtrlStateQuery).mockReturnValue({
data: { value: { ctrl: { state: "promised" } } },
error: { value: undefined },
then: (resolve: (value: any) => void) =>
resolve({ data: { value: { ctrl: { state: "promised" } } } }),
} as any);
vi.mocked(useCtrlStateSSubscription).mockReturnValue({
data: { value: undefined },
error: { value: undefined },
} as any);
const result = await useSubscribeState();
expect(result.state.value).toBe("promised");
});
it("handles empty responses", () => {
vi.mocked(useCtrlStateQuery).mockReturnValue({
data: { value: null },
error: { value: undefined },
} as any);
vi.mocked(useCtrlStateSSubscription).mockReturnValue({
data: { value: null },
error: { value: undefined },
} as any);
const { state } = useSubscribeState();
expect(state.value).toBeUndefined();
});
});