-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuseCart.test.tsx
138 lines (131 loc) · 3.97 KB
/
useCart.test.tsx
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import {act, renderHook, waitFor} from "@testing-library/react";
import React, {ReactNode} from "react";
import {CartProvider, ShopifyProvider, useCart} from "@shopify/hydrogen-react";
import "whatwg-fetch";
const accessToken = "8b6008fe5f922fb7b1f0df8b142c2d38";
const renderCart = () => {
const wrapper = ({children}: { children: ReactNode }) => (
<ShopifyProvider
storeDomain={`https://test-cleankitchen.myshopify.com`}
storefrontApiVersion="2023-01"
storefrontToken={accessToken}
countryIsoCode="EE"
languageIsoCode="ET"
>
<CartProvider
onLineAddComplete={() => console.log("Line add complete", new Date())}
onLineUpdateComplete={() => console.log("Line update complete", new Date())}
onLineRemoveComplete={() => console.log("Line remove complete", new Date())}
onAttributesUpdateComplete={() =>
console.log("Attributes update complete", new Date())
}
>
{children}
</CartProvider>
</ShopifyProvider>
);
return renderHook(() => useCart(), {wrapper});
};
const sleepUntil = async (f: () => boolean, timeoutMs = 1000) => {
return new Promise((resolve, reject) => {
const timeWas = new Date();
const wait = setTimeout(() => setInterval(function () {
if (f()) {
clearInterval(wait);
resolve(true);
} else if (+new Date() - +timeWas > timeoutMs) {
clearInterval(wait);
reject(false);
}
}, 20), 200);
});
};
xtest("when calling attributes update and lines remove then the latter is ignored", async () => {
const {result} = renderCart();
act(() => result.current.cartCreate({}));
await waitFor(() => {
expect(result.current.status).toBe("idle");
});
await act(() => {
result.current.linesAdd([
{
merchandiseId: "gid://shopify/ProductVariant/44671043141922",
quantity: 1,
},
]);
});
await waitFor(() => {
expect(result.current.status).toBe("idle");
});
await act(async () => {
result.current.cartAttributesUpdate([
{key: "test2", value: "val2"},
{key: "test2", value: "val3"},
]);
await sleepUntil(() => {
console.log("Current status", result.current.status);
return result.current.status === "idle";
});
//TODO if you run linesRemove inside timeout then it works
// setTimeout(
// () => result.current.linesRemove(result.current.lines.map((it) => it.id)),
// 800
// )
result.current.linesRemove(result.current.lines.map((it) => it.id));
});
await waitFor(() => {
expect(result.current.status).toBe("idle");
});
await waitFor(() => {
expect(
result.current.attributes.filter((it) => it.key === "test2")[0]
).toStrictEqual({
key: "test2",
value: "val3",
});
});
await waitFor(() => {
expect(result.current.lines.length).toBe(0);
});
});
test("when calling line remove and line add the latter is ignored", async () => {
const {result} = renderCart();
act(() => result.current.cartCreate({}));
await waitFor(() => {
expect(result.current.status).toBe("idle");
});
await act(() => {
result.current.linesAdd([
{
merchandiseId: "gid://shopify/ProductVariant/44671043141922",
quantity: 1,
},
]);
});
await waitFor(() => {
expect(result.current.status).toBe("idle");
});
console.log("Going to remove line", new Date());
await act(async () => {
result.current.linesRemove(result.current.lines.map((it) => it.id));
await sleepUntil(() => {
console.log("Current status", result.current.status);
return result.current.status === "idle";
});
console.log("Going to add a line", new Date());
result.current.linesAdd([
{
merchandiseId: "gid://shopify/ProductVariant/44671043141922",
quantity: 20,
},
]);
});
await waitFor(() => {
expect(result.current.status).toBe("idle");
});
await waitFor(() => {
expect(
result.current.totalQuantity
).toBe(20);
});
})