Skip to content

Commit e449782

Browse files
authored
use optional fields for refetch variables (#588)
* use optional fields for refetch variables * add more tests for refetchVariables * update changelog * add refetching tests with record for refetchVariables * update test-project-res * add test preloaded RelaySchemaAssets_graphql to .gitignore * update relay
1 parent c9cae0a commit e449782

33 files changed

+1488
-105
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# master
22

33
- Simplify `missingFieldHandlers`. https://github.com/zth/rescript-relay/pull/589
4+
- Fix behavior of `refetchVariables` on optional variables. https://github.com/zth/rescript-relay/pull/588
45

56
# 4.1.0
67

packages/rescript-relay/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ node_modules
44
src/Dummy.re*
55
.bsb.lock
66
*.log
7-
relay-compiler
7+
relay-compiler
8+
__tests_preloaded__/__generated__/RelaySchemaAssets_graphql.res

packages/rescript-relay/__tests__/Test_refetching-tests.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ describe("Fragment", () => {
1010
test("refetching works", async () => {
1111
queryMock.mockQuery({
1212
name: "TestRefetchingQuery",
13-
variables: { beforeDate: "2023-01-01T00:00:00.000Z" },
13+
variables: { beforeDate: "2023-01-01T00:00:00.000Z", showOnlineStatus: true, number: 10 },
1414
data: {
1515
loggedInUser: {
1616
id: "user-1",
1717
firstName: "First",
18-
onlineStatus: null,
18+
onlineStatus: "offline",
1919
friendsConnection: {
2020
totalCount: 20,
2121
},
@@ -40,6 +40,7 @@ describe("Fragment", () => {
4040
showOnlineStatus: true,
4141
friendsOnlineStatuses: ["Online", "offline"],
4242
beforeDate: null,
43+
number:10,
4344
},
4445
data: {
4546
node: {

packages/rescript-relay/__tests__/Test_refetching.res

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
module Query = %relay(`
2-
query TestRefetchingQuery($beforeDate: Datetime) {
2+
query TestRefetchingQuery($beforeDate: Datetime, $number: Number, $showOnlineStatus: Boolean!) {
33
loggedInUser {
44
...TestRefetching_user @arguments(
55
beforeDate: $beforeDate
6+
number: $number
7+
showOnlineStatus: $showOnlineStatus
68
)
79
}
810
}
@@ -15,13 +17,14 @@ module Fragment = %relay(`
1517
friendsOnlineStatuses: { type: "[OnlineStatus!]" }
1618
showOnlineStatus: { type: "Boolean", defaultValue: false }
1719
beforeDate: { type: "Datetime" }
20+
number: { type: "Number" }
1821
) {
1922
firstName
2023
onlineStatus @include(if: $showOnlineStatus)
2124
friendsConnection(statuses: $friendsOnlineStatuses) {
2225
totalCount
2326
}
24-
friends(beforeDate: $beforeDate) {
27+
friends(beforeDate: $beforeDate, number: $number) {
2528
id
2629
}
2730
}
@@ -43,6 +46,8 @@ module Test = {
4346
let query = Query.use(
4447
~variables={
4548
beforeDate: Date.fromString("2023-01-01T00:00:00.000Z"),
49+
showOnlineStatus: true,
50+
number: [10],
4651
},
4752
)
4853

@@ -65,7 +70,6 @@ module Test = {
6570
startTransition(() => {
6671
refetch(
6772
~variables=Fragment.makeRefetchVariables(
68-
~showOnlineStatus=Some(true),
6973
~friendsOnlineStatuses=Some([Online, Offline]),
7074
~beforeDate=None,
7175
),
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__/TestAliasedFragmentsQuery_graphql.res

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

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

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

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

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

0 commit comments

Comments
 (0)