Skip to content

Commit ebf3c2b

Browse files
committed
test: add specs
1 parent f8c9805 commit ebf3c2b

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import { renderHook, act } from "@testing-library/react-hooks";
2+
import { useApprovalRequest } from "./useApprovalRequest";
3+
4+
global.fetch = jest.fn();
5+
6+
const mockApprovalRequest = {
7+
id: "1",
8+
status: "active",
9+
};
10+
11+
describe("useApprovalRequest", () => {
12+
beforeEach(() => {
13+
jest.clearAllMocks();
14+
});
15+
16+
it("fetches approval request on mount", async () => {
17+
(fetch as jest.Mock).mockResolvedValueOnce({
18+
ok: true,
19+
json: async () => ({ approval_request: mockApprovalRequest }),
20+
});
21+
22+
const { result, waitForNextUpdate } = renderHook(() =>
23+
useApprovalRequest({
24+
approvalWorkflowInstanceId: "workflow123",
25+
approvalRequestId: "1234",
26+
enablePolling: false,
27+
})
28+
);
29+
30+
expect(result.current.isLoading).toBe(true);
31+
32+
await waitForNextUpdate();
33+
34+
expect(fetch).toHaveBeenCalledWith(
35+
"/api/v2/approval_workflow_instances/workflow123/approval_requests/1234"
36+
);
37+
expect(result.current.approvalRequest).toEqual(mockApprovalRequest);
38+
expect(result.current.isLoading).toBe(false);
39+
});
40+
41+
it("polls data when polling is enabled and status is not terminal", async () => {
42+
jest.useFakeTimers();
43+
44+
(fetch as jest.Mock).mockResolvedValue({
45+
ok: true,
46+
json: async () => ({ approval_request: mockApprovalRequest }),
47+
});
48+
49+
const { waitForNextUpdate } = renderHook(() =>
50+
useApprovalRequest({
51+
approvalWorkflowInstanceId: "workflow123",
52+
approvalRequestId: "1234",
53+
enablePolling: true,
54+
})
55+
);
56+
57+
await waitForNextUpdate();
58+
59+
expect(fetch).toHaveBeenCalledTimes(1);
60+
61+
act(() => {
62+
jest.advanceTimersByTime(10000);
63+
});
64+
65+
await waitForNextUpdate();
66+
67+
expect(fetch).toHaveBeenCalledTimes(2);
68+
});
69+
70+
it("does not poll data when polling is disabled", async () => {
71+
jest.useFakeTimers();
72+
73+
(fetch as jest.Mock).mockResolvedValue({
74+
ok: true,
75+
json: async () => ({ approval_request: mockApprovalRequest }),
76+
});
77+
78+
const { waitForNextUpdate } = renderHook(() =>
79+
useApprovalRequest({
80+
approvalWorkflowInstanceId: "workflow123",
81+
approvalRequestId: "1234",
82+
enablePolling: false,
83+
})
84+
);
85+
86+
await waitForNextUpdate();
87+
88+
expect(fetch).toHaveBeenCalledTimes(1);
89+
90+
act(() => {
91+
jest.advanceTimersByTime(10000);
92+
});
93+
94+
expect(fetch).toHaveBeenCalledTimes(1);
95+
});
96+
97+
it("does not poll data when status is terminal", async () => {
98+
jest.useFakeTimers();
99+
100+
const terminalApprovalRequest = {
101+
...mockApprovalRequest,
102+
status: "approved",
103+
};
104+
105+
(fetch as jest.Mock).mockResolvedValue({
106+
ok: true,
107+
json: async () => ({ approval_request: terminalApprovalRequest }),
108+
});
109+
110+
const { waitForNextUpdate } = renderHook(() =>
111+
useApprovalRequest({
112+
approvalWorkflowInstanceId: "workflow123",
113+
approvalRequestId: "1234",
114+
enablePolling: true,
115+
})
116+
);
117+
118+
await waitForNextUpdate();
119+
120+
expect(fetch).toHaveBeenCalledTimes(1);
121+
122+
act(() => {
123+
jest.advanceTimersByTime(10000);
124+
});
125+
126+
expect(fetch).toHaveBeenCalledTimes(1);
127+
});
128+
});

0 commit comments

Comments
 (0)