Skip to content

Commit

Permalink
MockPayloadGenerator support for @no_inline with args
Browse files Browse the repository at this point in the history
Summary: MockPayloadGenerator had partial support for `no_inline` (which appears as FragmentSpread nodes in normalization ASTs). However, we missed adding support for `arguments` to `no_inline` fragments, this diff adds support.

Reviewed By: captbaritone

Differential Revision: D46122331

fbshipit-source-id: 24b5e8c2e86184a0bf63f60400a62a35104a8c42
  • Loading branch information
Joe Savona authored and facebook-github-bot committed May 23, 2023
1 parent 17d9f9f commit d04c7be
Show file tree
Hide file tree
Showing 10 changed files with 708 additions and 2 deletions.
1 change: 1 addition & 0 deletions packages/relay-runtime/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ module.exports = {
OperationTracker: RelayOperationTracker,
createRelayContext: createRelayContext,
getOperationVariables: RelayConcreteVariables.getOperationVariables,
getLocalVariables: RelayConcreteVariables.getLocalVariables,
fetchQuery: fetchQueryInternal.fetchQuery,
fetchQueryDeduped: fetchQueryInternal.fetchQueryDeduped,
getPromiseForActiveRequest: fetchQueryInternal.getPromiseForActiveRequest,
Expand Down
20 changes: 19 additions & 1 deletion packages/relay-test-utils/RelayMockPayloadGenerator.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import type {

const invariant = require('invariant');
const {
__internal,
RelayConcreteNode,
TYPENAME_KEY,
getModuleComponentKey,
Expand Down Expand Up @@ -314,8 +315,24 @@ class RelayMockPayloadGenerator {
break;
}

case CLIENT_COMPONENT:
case CLIENT_COMPONENT: {
mockData = this._traverseSelections(
selection.fragment.selections,
typeName,
isAbstractType,
path,
mockData,
defaultValues,
);
break;
}
case FRAGMENT_SPREAD: {
const prevVariables = this._variables;
this._variables = __internal.getLocalVariables(
this._variables,
selection.fragment.argumentDefinitions,
selection.args,
);
mockData = this._traverseSelections(
selection.fragment.selections,
typeName,
Expand All @@ -324,6 +341,7 @@ class RelayMockPayloadGenerator {
mockData,
defaultValues,
);
this._variables = prevVariables;
break;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ function testGeneratedData<TVariables: Variables, TData, TRawResponse>(
query: Query<TVariables, TData, TRawResponse>,
mockResolvers: ?MockResolvers,
options: ?{mockClientData?: boolean},
variables: Variables = {},
): void {
const operation = createOperationDescriptor(query, {});
const operation = createOperationDescriptor(query, variables);
const payload = RelayMockPayloadGenerator.generate(
operation,
mockResolvers,
Expand Down Expand Up @@ -1689,3 +1690,52 @@ describe('with @relay_test_operation', () => {
});
});
});

test('Query with @no_inline fragment spread with literal argument', () => {
const query = graphql`
query RelayMockPayloadGeneratorTest58Query {
node(id: "4") {
...RelayMockPayloadGeneratorTest_fragment59 @arguments(cond: true)
}
}
`;
graphql`
fragment RelayMockPayloadGeneratorTest_fragment59 on User
@argumentDefinitions(cond: {type: "Boolean", defaultValue: false})
@no_inline(raw_response_type: true) {
id
name @include(if: $cond)
}
`;
testGeneratedData(query, undefined, {
mockClientData: false,
});
});

test('Query with @no_inline fragment spread with variable argument', () => {
const query = graphql`
query RelayMockPayloadGeneratorTest60Query($cond: Boolean!) {
node(id: "4") {
...RelayMockPayloadGeneratorTest_fragment61 @arguments(cond: $cond)
}
}
`;
graphql`
fragment RelayMockPayloadGeneratorTest_fragment61 on User
@argumentDefinitions(cond: {type: "Boolean", defaultValue: false})
@no_inline(raw_response_type: true) {
id
name @include(if: $cond)
}
`;
testGeneratedData(
query,
undefined,
{
mockClientData: false,
},
{
cond: true,
},
);
});

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit d04c7be

Please sign in to comment.