-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrun-property-test.ts
More file actions
74 lines (62 loc) · 2.57 KB
/
run-property-test.ts
File metadata and controls
74 lines (62 loc) · 2.57 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
import { vi, expect } from "vitest";
import type { ComputedRef } from "vue";
import { useQuery, useSubscription } from "@urql/vue";
import type { UseQueryResponse, UseSubscriptionResponse } from "@urql/vue";
import fc from "fast-check";
import {
mockUseQueryResponse,
mockUseSubscriptionResponse,
fcMockUseQueryResponseArg,
fcMockUseSubscriptionResponseArg,
} from "@/graphql/tests";
interface _UseSubscribeXXXReturn<R> {
data: ComputedRef<R | undefined>;
error: ComputedRef<Error | undefined>;
loading: ComputedRef<boolean>;
}
type UseSubscribeXXXReturn<R> = _UseSubscribeXXXReturn<R> &
PromiseLike<_UseSubscribeXXXReturn<R>>;
export async function runPropertyTest<QueryData, SubData, R>(
useSubscribeXXX: () => UseSubscribeXXXReturn<R>,
mapQuery: (d: QueryData | undefined) => R | undefined,
mapSub: (d: SubData | undefined) => R | undefined,
fcQueryData: fc.Arbitrary<QueryData>,
fcSubData: fc.Arbitrary<SubData>,
) {
type QueryRes = UseQueryResponse<QueryData, any>;
type SubRes = UseSubscriptionResponse<SubData, SubData, any>;
const fcQueryArg = fcMockUseQueryResponseArg(fcQueryData);
const fcSubArg = fcMockUseSubscriptionResponseArg(fcSubData);
await fc.assert(
fc.asyncProperty(fcQueryArg, fcSubArg, async (queryArg, subArg) => {
// Mock useGenQuery()
const queryRes = mockUseQueryResponse<QueryData>(queryArg);
vi.mocked(useQuery<QueryData>).mockReturnValue(queryRes as QueryRes);
// Mock useGenSub()
const { response: subRes, issue } = mockUseSubscriptionResponse<SubData>(subArg);
vi.mocked(useSubscription<SubData>).mockReturnValue(subRes as SubRes);
const { data, error, loading, then } = useSubscribeXXX();
// Assert loading and undefined values.
expect(loading.value).toBe(true);
expect(error.value).toBeUndefined();
expect(data.value).toBeUndefined();
// Wait until loading ends.
await then();
expect(loading.value).toBe(false);
// Assert initial values are from query.
expect(error.value).toBe(queryArg.error);
expect(data.value).toStrictEqual(
queryArg.error ? undefined : mapQuery(queryArg.data),
);
// Assert the subsequent values are issued from subscription backed up by query.
for (const issued of issue) {
const expectedError = issued.error || queryArg.error;
const expectedData = expectedError
? undefined
: (mapSub(issued.data) ?? mapQuery(queryArg.data));
expect(error.value).toBe(expectedError);
expect(data.value).toStrictEqual(expectedData);
}
}),
);
}