Skip to content

Commit 1b35023

Browse files
committed
add refetching tests with record for refetchVariables
1 parent 21c6af7 commit 1b35023

7 files changed

+1300
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
require("@testing-library/jest-dom/extend-expect");
2+
const t = require("@testing-library/react");
3+
const React = require("react");
4+
const queryMock = require("./queryMock");
5+
const ReactTestUtils = require("react-dom/test-utils");
6+
7+
const { test_refetching } = require("./Test_refetchingRecord.bs");
8+
9+
describe("Fragment", () => {
10+
test("refetching works when using a record for refetchVariables", async () => {
11+
queryMock.mockQuery({
12+
name: "TestRefetchingRecordQuery",
13+
variables: { beforeDate: "2023-01-01T00:00:00.000Z", showOnlineStatus: true, number: 10 },
14+
data: {
15+
loggedInUser: {
16+
id: "user-1",
17+
firstName: "First",
18+
onlineStatus: "offline",
19+
friendsConnection: {
20+
totalCount: 20,
21+
},
22+
friends: [
23+
{
24+
id: "user-2",
25+
},
26+
],
27+
},
28+
},
29+
});
30+
31+
t.render(test_refetching());
32+
33+
await t.screen.findByText("First is -");
34+
await t.screen.findByText("Friends: 20");
35+
36+
queryMock.mockQuery({
37+
name: "TestRefetchingRecordRefetchQuery",
38+
variables: {
39+
id: "user-1",
40+
showOnlineStatus: true,
41+
friendsOnlineStatuses: ["Online", "offline"],
42+
beforeDate: null,
43+
number:10,
44+
},
45+
data: {
46+
node: {
47+
__typename: "User",
48+
id: "user-1",
49+
firstName: "First",
50+
onlineStatus: "Online",
51+
friendsConnection: {
52+
totalCount: 10,
53+
},
54+
friends: [
55+
{
56+
id: "user-2",
57+
},
58+
{
59+
id: "user-3",
60+
},
61+
],
62+
},
63+
},
64+
});
65+
66+
ReactTestUtils.act(() => {
67+
t.fireEvent.click(t.screen.getByText("Fetch online status"));
68+
});
69+
70+
await t.screen.findByText("First is online");
71+
await t.screen.findByText("Friends: 10");
72+
});
73+
});
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
module Query = %relay(`
2+
query TestRefetchingRecordQuery($beforeDate: Datetime, $number: Number, $showOnlineStatus: Boolean!) {
3+
loggedInUser {
4+
...TestRefetchingRecord_user @arguments(
5+
beforeDate: $beforeDate
6+
number: $number
7+
showOnlineStatus: $showOnlineStatus
8+
)
9+
}
10+
}
11+
`)
12+
13+
module Fragment = %relay(`
14+
fragment TestRefetchingRecord_user on User
15+
@refetchable(queryName: "TestRefetchingRecordRefetchQuery")
16+
@argumentDefinitions(
17+
friendsOnlineStatuses: { type: "[OnlineStatus!]" }
18+
showOnlineStatus: { type: "Boolean", defaultValue: false }
19+
beforeDate: { type: "Datetime" }
20+
number: { type: "Number" }
21+
) {
22+
firstName
23+
onlineStatus @include(if: $showOnlineStatus)
24+
friendsConnection(statuses: $friendsOnlineStatuses) {
25+
totalCount
26+
}
27+
friends(beforeDate: $beforeDate, number: $number) {
28+
id
29+
}
30+
}
31+
`)
32+
33+
module FragmentWithNoArgs = %relay(`
34+
fragment TestRefetchingRecordNoArgs_query on Query
35+
@refetchable(queryName: "TestRefetchingRecordNoArgsRefetchQuery")
36+
{
37+
loggedInUser {
38+
id
39+
}
40+
}
41+
`)
42+
43+
module Test = {
44+
@react.component
45+
let make = () => {
46+
let query = Query.use(
47+
~variables={
48+
beforeDate: Date.fromString("2023-01-01T00:00:00.000Z"),
49+
showOnlineStatus: true,
50+
number: [10],
51+
},
52+
)
53+
54+
let (data, refetch) = Fragment.useRefetchable(query.loggedInUser.fragmentRefs)
55+
56+
let (_, startTransition) = React.useTransition()
57+
58+
<div>
59+
{React.string(
60+
data.firstName ++
61+
(" is " ++
62+
switch data.onlineStatus {
63+
| Some(Online) => "online"
64+
| _ => "-"
65+
}),
66+
)}
67+
<div> {React.string("Friends: " ++ data.friendsConnection.totalCount->Int.toString)} </div>
68+
<button
69+
onClick={_ => {
70+
startTransition(() => {
71+
refetch(
72+
~variables={
73+
friendsOnlineStatuses: Some([Online, Offline]),
74+
beforeDate: None,
75+
},
76+
)->RescriptRelay.Disposable.ignore
77+
})
78+
}}
79+
>
80+
{React.string("Fetch online status")}
81+
</button>
82+
</div>
83+
}
84+
}
85+
86+
@live
87+
let test_refetching = () => {
88+
let network = RescriptRelay.Network.makePromiseBased(~fetchFunction=RelayEnv.fetchQuery)
89+
90+
let environment = RescriptRelay.Environment.make(
91+
~network,
92+
~store=RescriptRelay.Store.make(~source=RescriptRelay.RecordSource.make()),
93+
)
94+
95+
<TestProviders.Wrapper environment>
96+
<Test />
97+
</TestProviders.Wrapper>
98+
}

packages/rescript-relay/__tests__/__generated__/TestRefetchingRecordNoArgsRefetchQuery_graphql.res

Lines changed: 174 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)