Skip to content

Commit c46c03d

Browse files
committed
catch on top level unions in fragments
1 parent 39b586f commit c46c03d

File tree

6 files changed

+471
-1
lines changed

6 files changed

+471
-1
lines changed

CHANGELOG.md

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

3+
- Add supprot for top level `@catch` on fragments on unions.
4+
35
# 3.2.0
46

57
- Add support for the new Relay `@catch` directive. https://github.com/zth/rescript-relay/pull/549

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,53 @@ describe("Catch", () => {
199199
"User: user-1 - 2025-01-01, Error!, User: user-3 - 2025-01-01"
200200
);
201201
});
202+
203+
test("union member fragment - success user", async () => {
204+
queryMock.mockQuery({
205+
name: "TestCatchUnionMemberQuery",
206+
data: {
207+
member: {
208+
__typename: "User",
209+
id: "user-1",
210+
createdAt: date.toISOString(),
211+
},
212+
},
213+
});
214+
215+
t.render(test_catch("TestUnionMember"));
216+
await t.screen.findByText("Got user id: user-1, and createdAt: 2025-01-01");
217+
});
218+
219+
test("union member fragment - success group", async () => {
220+
queryMock.mockQuery({
221+
name: "TestCatchUnionMemberQuery",
222+
data: {
223+
member: {
224+
__typename: "Group",
225+
id: "group-1",
226+
name: "Test Group",
227+
},
228+
},
229+
});
230+
231+
t.render(test_catch("TestUnionMember"));
232+
await t.screen.findByText("Got group id: group-1, and name: Test Group");
233+
});
234+
235+
test("union member fragment - fail", async () => {
236+
queryMock.mockQuery({
237+
name: "TestCatchUnionMemberQuery",
238+
data: {
239+
member: {
240+
__typename: "User",
241+
id: "user-1",
242+
createdAt: null,
243+
},
244+
},
245+
graphqlErrors: [{ path: ["member", "createdAt"] }],
246+
});
247+
248+
t.render(test_catch("TestUnionMember"));
249+
await t.screen.findByText("Error from union fragment!");
250+
});
202251
});

packages/rescript-relay/__tests__/Test_catch.res

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,53 @@ module TestMembers = {
173173
}
174174
}
175175

176+
module UnionMemberFragment = %relay(`
177+
fragment TestCatchUnionMember_member on Member @catch {
178+
... on User {
179+
id
180+
createdAt
181+
}
182+
... on Group {
183+
id
184+
name
185+
}
186+
}
187+
`)
188+
189+
module QueryUnionMember = %relay(`
190+
query TestCatchUnionMemberQuery {
191+
member(id: "123") {
192+
...TestCatchUnionMember_member
193+
}
194+
}
195+
`)
196+
197+
module TestUnionMember = {
198+
@react.component
199+
let make = () => {
200+
let query = QueryUnionMember.use(~variables=())
201+
let fragmentData = UnionMemberFragment.useOpt(
202+
query.member->Belt.Option.map(r => r.fragmentRefs),
203+
)
204+
205+
switch fragmentData {
206+
| Some(Ok({value: User({id, createdAt})})) =>
207+
<div>
208+
{React.string(
209+
"Got user id: " ++
210+
id ++
211+
", and createdAt: " ++
212+
createdAt->Js.Date.toISOString->Js.String2.slice(~from=0, ~to_=10),
213+
)}
214+
</div>
215+
| Some(Ok({value: Group({id, name})})) =>
216+
<div> {React.string("Got group id: " ++ id ++ ", and name: " ++ name)} </div>
217+
| Some(Error(_)) => <div> {React.string("Error from union fragment!")} </div>
218+
| _ => React.null
219+
}
220+
}
221+
}
222+
176223
@live
177224
let test_catch = testName => {
178225
let network = RescriptRelay.Network.makePromiseBased(~fetchFunction=RelayEnv.fetchQuery)
@@ -189,6 +236,7 @@ let test_catch = testName => {
189236
| "TestMember" => <TestMember />
190237
| "TestMemberNested" => <TestMemberNested />
191238
| "TestMembers" => <TestMembers />
239+
| "TestUnionMember" => <TestUnionMember />
192240
| _ => React.null
193241
}}
194242
</TestProviders.Wrapper>

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

Lines changed: 248 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)