Skip to content

Commit 6b38703

Browse files
lynnshaoyufacebook-github-bot
authored andcommitted
modify _readClientSideDirectiveField in RelayReader to work for exec time resolvers
Reviewed By: tyao1 Differential Revision: D69620498 fbshipit-source-id: 619c92ef0b05f72fdb784bc39c10fc916a35f266
1 parent de07cb9 commit 6b38703

File tree

5 files changed

+533
-36
lines changed

5 files changed

+533
-36
lines changed

packages/relay-runtime/store/RelayReader.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -661,12 +661,31 @@ class RelayReader {
661661
} else {
662662
return this._readLink(selection.field, record, data);
663663
}
664+
664665
case 'RelayResolver':
665-
case 'RelayLiveResolver':
666-
return this._readResolverField(selection.field, record, data);
666+
case 'RelayLiveResolver': {
667+
if (this._useExecTimeResolvers) {
668+
return this._readScalar(selection.field, record, data);
669+
} else {
670+
return this._readResolverField(selection.field, record, data);
671+
}
672+
}
667673
case 'ClientEdgeToClientObject':
668674
case 'ClientEdgeToServerObject':
669-
return this._readClientEdge(selection.field, record, data);
675+
if (
676+
this._useExecTimeResolvers &&
677+
(selection.field.backingField.kind === 'RelayResolver' ||
678+
selection.field.backingField.kind === 'RelayLiveResolver')
679+
) {
680+
const {field} = selection;
681+
if (field.linkedField.plural) {
682+
return this._readPluralLink(field.linkedField, record, data);
683+
} else {
684+
return this._readLink(field.linkedField, record, data);
685+
}
686+
} else {
687+
return this._readClientEdge(selection.field, record, data);
688+
}
670689
case 'AliasedInlineFragmentSpread':
671690
return this._readAliasedInlineFragment(selection.field, record, data);
672691
default:

packages/relay-runtime/store/__tests__/RelayReader-ExecResolvers-test.js

Lines changed: 77 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ export type TReaderTestUser = {
3636
name: ?string,
3737
};
3838

39-
const modelMock = jest.fn();
39+
let modelMock;
40+
let nameMock;
41+
let bestFriendMock;
42+
let friendsMock;
43+
let user_oneMock;
44+
4045
/**
4146
* @RelayResolver RelayReaderExecResolversTestUser
4247
*/
@@ -47,7 +52,6 @@ export function RelayReaderExecResolversTestUser(id: DataID): TReaderTestUser {
4752
};
4853
}
4954

50-
const nameMock = jest.fn();
5155
/**
5256
* @RelayResolver RelayReaderExecResolversTestUser.name: String
5357
*/
@@ -56,7 +60,6 @@ export function name(user: TReaderTestUser): ?string {
5660
return user.name;
5761
}
5862

59-
const bestFriendMock = jest.fn();
6063
/**
6164
* @RelayResolver RelayReaderExecResolversTestUser.best_friend: RelayReaderExecResolversTestUser
6265
*/
@@ -67,7 +70,6 @@ export function best_friend(
6770
return {id: '2'};
6871
}
6972

70-
const friendsMock = jest.fn();
7173
/**
7274
* @RelayResolver RelayReaderExecResolversTestUser.friends: [RelayReaderExecResolversTestUser]
7375
*/
@@ -78,7 +80,6 @@ export function friends(
7880
return [{id: '2'}, {id: '3'}, {id: '4'}];
7981
}
8082

81-
const user_oneMock = jest.fn();
8283
/**
8384
* @RelayResolver Query.RelayReaderExecResolversTest_user_one: RelayReaderExecResolversTestUser
8485
*/
@@ -87,6 +88,14 @@ export function RelayReaderExecResolversTest_user_one(): IdOf<'RelayReaderExecRe
8788
return {id: '1'};
8889
}
8990

91+
beforeEach(() => {
92+
modelMock = jest.fn();
93+
nameMock = jest.fn();
94+
bestFriendMock = jest.fn();
95+
friendsMock = jest.fn();
96+
user_oneMock = jest.fn();
97+
});
98+
9099
/**
91100
* Note that the reading of exec time resolvers is expected to be the same as
92101
* the reading of standard server queries. The main purpose of testing is to ensure
@@ -96,7 +105,7 @@ export function RelayReaderExecResolversTest_user_one(): IdOf<'RelayReaderExecRe
96105
describe('RelayReaderExecResolvers', () => {
97106
it('reads exec_time_resolvers without calling the resolvers when provider returns true', () => {
98107
const Query = graphql`
99-
query RelayReaderExecResolversTestRunsQuery
108+
query RelayReaderExecResolversTestQuery
100109
@exec_time_resolvers(
101110
enabledProvider: "relayReaderTestExecTimeResolversTrueProvider"
102111
) {
@@ -157,7 +166,7 @@ describe('RelayReaderExecResolvers', () => {
157166

158167
it('reads read time resolvers when exec time resolvers provider returns false', () => {
159168
const Query = graphql`
160-
query RelayReaderExecResolversTestRunsNoProviderQuery
169+
query RelayReaderExecResolversTestFalseProviderQuery
161170
@exec_time_resolvers(
162171
enabledProvider: "relayReaderTestExecTimeResolversFalseProvider"
163172
) {
@@ -228,4 +237,65 @@ describe('RelayReaderExecResolvers', () => {
228237
},
229238
});
230239
});
240+
241+
it('reads exec time resolvers data correctly when client side directives are present, like @required', () => {
242+
const Query = graphql`
243+
query RelayReaderExecResolversTestClientDirectiveQuery
244+
@exec_time_resolvers(
245+
enabledProvider: "relayReaderTestExecTimeResolversTrueProvider"
246+
) {
247+
RelayReaderExecResolversTest_user_one {
248+
name @required(action: THROW)
249+
best_friend {
250+
name
251+
}
252+
friends {
253+
name
254+
}
255+
}
256+
}
257+
`;
258+
const operation = createOperationDescriptor(Query, {});
259+
const source = new RelayRecordSource({
260+
'client:root': {
261+
__id: 'client:root',
262+
__typename: '__Root',
263+
RelayReaderExecResolversTest_user_one: {__ref: '1'},
264+
},
265+
'1': {
266+
__id: '1',
267+
name: 'Alice',
268+
friends: {__refs: ['2', '3', '4']},
269+
},
270+
'2': {
271+
__id: '2',
272+
name: 'Bob',
273+
},
274+
'3': {
275+
__id: '3',
276+
name: 'Claire',
277+
},
278+
'4': {
279+
__id: '4',
280+
name: 'Dennis',
281+
},
282+
});
283+
const resolverStore = new RelayModernStore(source);
284+
const {data} = read(
285+
source,
286+
operation.fragment,
287+
new LiveResolverCache(() => source, resolverStore),
288+
);
289+
290+
expect(modelMock).not.toBeCalled();
291+
expect(nameMock).not.toBeCalled();
292+
expect(user_oneMock).not.toBeCalled();
293+
expect(friendsMock).not.toBeCalled();
294+
expect(data).toEqual({
295+
RelayReaderExecResolversTest_user_one: {
296+
name: 'Alice',
297+
friends: [{name: 'Bob'}, {name: 'Claire'}, {name: 'Dennis'}],
298+
},
299+
});
300+
});
231301
});

0 commit comments

Comments
 (0)