Skip to content

Commit

Permalink
add regression tests for both field and fragment arguments in relay r…
Browse files Browse the repository at this point in the history
…esolvers

Summary:
## Context

When compiling relay resolvers we are missing validation on undefined global variables within resolvers. The global variables can be passed via resolver field or fragment arguments.

We want to add a suite of regression tests for the following cases:

- Relay resolver yields a scalar field without an associated fragment e.g. live or derived resolvers
- Relay resolver yields a scalar field with an associated fragment
  - Passing both field and fragment arguments
  - Fragment args only
   - Field args only
  - Multiple undefined global variables
- Linked field aka client edges

## This diff
Adds the sad path version of this test: https://fburl.com/code/qal5u86k

- Relay resolver yields a scalar field without an associated fragment e.g. live or derived resolvers
- **Relay resolver yields a scalar field with an associated fragment**
  - **Passing both field and fragment arguments**
 - Fragment args only
  - Field args only
  - Multiple undefined global variables
- Linked field aka client edges

Add additional tests for relay resolvers to detect proper validation of their field and fragment arguments, which could be undefined

Reviewed By: captbaritone

Differential Revision: D50615537

fbshipit-source-id: 05b569d736419f4a71ce8656c7179d22420bafe4
  • Loading branch information
monicatang authored and facebook-github-bot committed Oct 24, 2023
1 parent 660f51f commit 41a33a1
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
==================================== INPUT ====================================
# expected-to-throw

query relayResolverWithUndefinedFieldAndFragmentArgsQuery {
node(id: "SOME_ID") {
...relayResolverWithUndefinedFieldAndFragmentArgs_user
}
}

fragment relayResolverWithUndefinedFieldAndFragmentArgs_user on User {
pop_star_name(field_arg: $undefined_field_arg, includeName: $undefined_fragment_arg)
}

fragment relayResolverWithUndefinedFieldAndFragmentArgsFragment_name on User
@argumentDefinitions(includeName: {type: "Boolean!"}) {
__typename
name @include(if: $includeName)
}

# %extensions%

extend type User {
pop_star_name(field_arg: Int, includeName: Boolean!): String @relay_resolver(fragment_name: "relayResolverWithUndefinedFieldAndFragmentArgsFragment_name", import_path: "PopStarNameResolver")
}
==================================== ERROR ====================================
✖︎ Operation 'relayResolverWithUndefinedFieldAndFragmentArgsQuery' references undefined variable: '$undefined_fragment_arg'.

relay-resolver-with-undefined-field-and-fragment-args.invalid.graphql:10:63
9 │ fragment relayResolverWithUndefinedFieldAndFragmentArgs_user on User {
10 │ pop_star_name(field_arg: $undefined_field_arg, includeName: $undefined_fragment_arg)
│ ^^^^^^^^^^^^^^^^^^^^^^^
11 │ }
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# expected-to-throw

query relayResolverWithUndefinedFieldAndFragmentArgsQuery {
node(id: "SOME_ID") {
...relayResolverWithUndefinedFieldAndFragmentArgs_user
}
}

fragment relayResolverWithUndefinedFieldAndFragmentArgs_user on User {
pop_star_name(field_arg: $undefined_field_arg, includeName: $undefined_fragment_arg)
}

fragment relayResolverWithUndefinedFieldAndFragmentArgsFragment_name on User
@argumentDefinitions(includeName: {type: "Boolean!"}) {
__typename
name @include(if: $includeName)
}

# %extensions%

extend type User {
pop_star_name(field_arg: Int, includeName: Boolean!): String @relay_resolver(fragment_name: "relayResolverWithUndefinedFieldAndFragmentArgsFragment_name", import_path: "PopStarNameResolver")
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @generated SignedSource<<7743e2abb746815cdc1a8d9cd0257972>>
* @generated SignedSource<<ed9fffdf93ab1c751f4503a67d68092e>>
*/

mod compile_relay_artifacts;
Expand Down Expand Up @@ -1251,6 +1251,13 @@ async fn relay_resolver_with_spread_invalid() {
test_fixture(transform_fixture, "relay-resolver-with-spread.invalid.graphql", "compile_relay_artifacts/fixtures/relay-resolver-with-spread.invalid.expected", input, expected).await;
}

#[tokio::test]
async fn relay_resolver_with_undefined_field_and_fragment_args_invalid() {
let input = include_str!("compile_relay_artifacts/fixtures/relay-resolver-with-undefined-field-and-fragment-args.invalid.graphql");
let expected = include_str!("compile_relay_artifacts/fixtures/relay-resolver-with-undefined-field-and-fragment-args.invalid.expected");
test_fixture(transform_fixture, "relay-resolver-with-undefined-field-and-fragment-args.invalid.graphql", "compile_relay_artifacts/fixtures/relay-resolver-with-undefined-field-and-fragment-args.invalid.expected", input, expected).await;
}

#[tokio::test]
async fn relay_resolver_with_undefined_field_args_invalid() {
let input = include_str!("compile_relay_artifacts/fixtures/relay-resolver-with-undefined-field-args.invalid.graphql");
Expand Down

0 comments on commit 41a33a1

Please sign in to comment.