Skip to content

Commit 1de2de6

Browse files
captbaritonefacebook-github-bot
authored andcommitted
Regression test for abstract root fragment
Differential Revision: D80984351
1 parent 87062e6 commit 1de2de6

File tree

4 files changed

+351
-0
lines changed

4 files changed

+351
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict-local
8+
* @format
9+
* @oncall relay
10+
*/
11+
12+
'use strict';
13+
14+
import type {IEnvironment} from 'relay-runtime';
15+
16+
const React = require('react');
17+
const {RelayEnvironmentProvider, useLazyLoadQuery} = require('react-relay');
18+
const TestRenderer = require('react-test-renderer');
19+
const {graphql} = require('relay-runtime/query/GraphQLTag');
20+
const {createMockEnvironment} = require('relay-test-utils');
21+
const {
22+
disallowConsoleErrors,
23+
disallowWarnings,
24+
injectPromisePolyfill__DEPRECATED,
25+
} = require('relay-test-utils-internal');
26+
27+
injectPromisePolyfill__DEPRECATED();
28+
disallowWarnings();
29+
disallowConsoleErrors();
30+
31+
function EnvironmentWrapper({
32+
children,
33+
environment,
34+
}: {
35+
children: React.Node,
36+
environment: IEnvironment,
37+
}) {
38+
return (
39+
<RelayEnvironmentProvider environment={environment}>
40+
<React.Suspense fallback="Loading...">{children}</React.Suspense>
41+
</RelayEnvironmentProvider>
42+
);
43+
}
44+
45+
function NodeGreeting() {
46+
const data = useLazyLoadQuery(
47+
graphql`
48+
query RelayResolversAbstractTypeRootFragmentTestQuery {
49+
node(id: "4") {
50+
node_greeting
51+
}
52+
}
53+
`,
54+
{},
55+
);
56+
return data.node?.node_greeting;
57+
}
58+
59+
// https://github.com/facebook/relay/issues/4943#issuecomment-3221637018
60+
test('Can read a resolver with a rootFragment on an abstract type', async () => {
61+
const logEvents = [];
62+
const environment = createMockEnvironment({
63+
relayFieldLogger(event) {
64+
logEvents.push(event);
65+
},
66+
});
67+
let renderer;
68+
TestRenderer.act(() => {
69+
renderer = TestRenderer.create(
70+
<EnvironmentWrapper environment={environment}>
71+
<NodeGreeting />
72+
</EnvironmentWrapper>,
73+
);
74+
});
75+
expect(renderer?.toJSON()).toEqual('Loading...');
76+
expect(logEvents).toEqual([]);
77+
78+
await TestRenderer.act(() => {
79+
environment.mock.resolveMostRecentOperation({
80+
data: {
81+
node: {
82+
__typename: 'User',
83+
__isNode: 'User',
84+
id: '4',
85+
},
86+
},
87+
});
88+
jest.runAllImmediates();
89+
});
90+
91+
// Incorrect! We provided `__isNode`!
92+
expect(logEvents).toEqual([
93+
{
94+
fieldPath: '<abstract-type-hint>',
95+
kind: 'missing_expected_data.log',
96+
owner: 'NodeResolversGreeting',
97+
uiContext: undefined,
98+
},
99+
]);
100+
// Incorrect! Should be the greeting.
101+
expect(renderer?.toJSON()).toEqual(null);
102+
});

packages/react-relay/__tests__/__generated__/RelayResolversAbstractTypeRootFragmentTestQuery.graphql.js

Lines changed: 153 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict-local
8+
* @format
9+
* @oncall relay
10+
*/
11+
12+
'use strict';
13+
14+
import type {NodeResolversGreeting$key} from './__generated__/NodeResolversGreeting.graphql';
15+
16+
const {graphql} = require('relay-runtime');
17+
const {readFragment} = require('relay-runtime/store/ResolverFragments');
18+
19+
/**
20+
* @RelayResolver Node.node_greeting: String
21+
* @rootFragment NodeResolversGreeting
22+
*/
23+
function node_greeting(rootKey: NodeResolversGreeting$key): string {
24+
const node = readFragment(
25+
graphql`
26+
fragment NodeResolversGreeting on Node {
27+
id
28+
}
29+
`,
30+
rootKey,
31+
);
32+
return `Hello Node with id ${node.id}!`;
33+
}
34+
35+
module.exports = {
36+
node_greeting,
37+
};

packages/relay-runtime/store/__tests__/resolvers/__generated__/NodeResolversGreeting.graphql.js

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