Skip to content

Commit

Permalink
Regression test for not detecting undefined variables on resolver fields
Browse files Browse the repository at this point in the history
Reviewed By: alunyov

Differential Revision: D50251703

fbshipit-source-id: ed1ecf58dbfbb89a74b98d6eaf612a00765b7832
  • Loading branch information
tyao1 authored and facebook-github-bot committed Oct 13, 2023
1 parent 2699206 commit 998fd49
Show file tree
Hide file tree
Showing 5 changed files with 289 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
==================================== INPUT ====================================
# expected-to-throw

query clientFieldsWithUndefinedGlobalVariablesQuery($id: ID!) {
node(id: $id) {
...clientFieldsWithUndefinedGlobalVariables_user
}
}

fragment clientFieldsWithUndefinedGlobalVariables_user on User {
pop_star_name(scale: $scale)
}

# %extensions%

extend type User {
pop_star_name(scale: Float!): String
}
==================================== ERROR ====================================
✖︎ Operation 'clientFieldsWithUndefinedGlobalVariablesQuery' references undefined variable: '$scale'.

client-fields-with-undefined-global-variables.invalid.graphql:10:24
9 │ fragment clientFieldsWithUndefinedGlobalVariables_user on User {
10 │ pop_star_name(scale: $scale)
│ ^^^^^^
11 │ }
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# expected-to-throw

query clientFieldsWithUndefinedGlobalVariablesQuery($id: ID!) {
node(id: $id) {
...clientFieldsWithUndefinedGlobalVariables_user
}
}

fragment clientFieldsWithUndefinedGlobalVariables_user on User {
pop_star_name(scale: $scale)
}

# %extensions%

extend type User {
pop_star_name(scale: Float!): String
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
==================================== INPUT ====================================
# TODO: expected to throw

query relayResolverWithUndefinedGlobalVariablesQuery {
node(id: "SOME_ID") {
...relayResolverWithUndefinedGlobalVariables_PopStarName
}
}

fragment relayResolverWithUndefinedGlobalVariables_PopStarName on User {
pop_star_name(scale: $scale)
}

fragment relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name on User {
name
}

# %extensions%

extend type User {
pop_star_name(scale: Float!): String @relay_resolver(fragment_name: "relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name", import_path: "./path/to/PopStarNameResolver.js")
}
==================================== OUTPUT ===================================
{
"fragment": {
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "relayResolverWithUndefinedGlobalVariablesQuery",
"selections": [
{
"alias": null,
"args": [
{
"kind": "Literal",
"name": "id",
"value": "SOME_ID"
}
],
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
{
"args": null,
"kind": "FragmentSpread",
"name": "relayResolverWithUndefinedGlobalVariables_PopStarName"
}
],
"storageKey": "node(id:\"SOME_ID\")"
}
],
"type": "Query",
"abstractKey": null
},
"kind": "Request",
"operation": {
"argumentDefinitions": [],
"kind": "Operation",
"name": "relayResolverWithUndefinedGlobalVariablesQuery",
"selections": [
{
"alias": null,
"args": [
{
"kind": "Literal",
"name": "id",
"value": "SOME_ID"
}
],
"concreteType": null,
"kind": "LinkedField",
"name": "node",
"plural": false,
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "__typename",
"storageKey": null
},
{
"kind": "InlineFragment",
"selections": [
{
"name": "pop_star_name",
"args": [
{
"kind": "Variable",
"name": "scale",
"variableName": "scale"
}
],
"fragment": {
"kind": "InlineFragment",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
}
],
"type": "User",
"abstractKey": null
},
"kind": "RelayResolver",
"storageKey": null,
"isOutputType": false
}
],
"type": "User",
"abstractKey": null
},
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "id",
"storageKey": null
}
],
"storageKey": "node(id:\"SOME_ID\")"
}
]
},
"params": {
"cacheID": "8c99a70a7ba2df2195b28ab9b19b84eb",
"id": null,
"metadata": {},
"name": "relayResolverWithUndefinedGlobalVariablesQuery",
"operationKind": "query",
"text": null
}
}

QUERY:

query relayResolverWithUndefinedGlobalVariablesQuery {
node(id: "SOME_ID") {
__typename
...relayResolverWithUndefinedGlobalVariables_PopStarName
id
}
}

fragment relayResolverWithUndefinedGlobalVariables_PopStarName on User {
...relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name
}

fragment relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name on User {
name
}


{
"argumentDefinitions": [
{
"kind": "RootArgument",
"name": "scale"
}
],
"kind": "Fragment",
"metadata": null,
"name": "relayResolverWithUndefinedGlobalVariables_PopStarName",
"selections": [
{
"alias": null,
"args": [
{
"kind": "Variable",
"name": "scale",
"variableName": "scale"
}
],
"fragment": {
"args": null,
"kind": "FragmentSpread",
"name": "relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name"
},
"kind": "RelayResolver",
"name": "pop_star_name",
"resolverModule": require('PopStarNameResolver'),
"path": "pop_star_name"
}
],
"type": "User",
"abstractKey": null
}

{
"argumentDefinitions": [],
"kind": "Fragment",
"metadata": null,
"name": "relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name",
"selections": [
{
"alias": null,
"args": null,
"kind": "ScalarField",
"name": "name",
"storageKey": null
}
],
"type": "User",
"abstractKey": null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# TODO: expected to throw

query relayResolverWithUndefinedGlobalVariablesQuery {
node(id: "SOME_ID") {
...relayResolverWithUndefinedGlobalVariables_PopStarName
}
}

fragment relayResolverWithUndefinedGlobalVariables_PopStarName on User {
pop_star_name(scale: $scale)
}

fragment relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name on User {
name
}

# %extensions%

extend type User {
pop_star_name(scale: Float!): String @relay_resolver(fragment_name: "relayResolverWithUndefinedGlobalVariables_PopStarNameResolverFragment_name", import_path: "./path/to/PopStarNameResolver.js")
}
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<<3500dcb867d80cd51e9dc7cad71006c2>>
* @generated SignedSource<<3f72818aa4229846c82ada4a55f1b28c>>
*/

mod compile_relay_artifacts;
Expand Down Expand Up @@ -250,6 +250,13 @@ async fn client_fields_overlapping_with_nulls() {
test_fixture(transform_fixture, "client-fields-overlapping-with-nulls.graphql", "compile_relay_artifacts/fixtures/client-fields-overlapping-with-nulls.expected", input, expected).await;
}

#[tokio::test]
async fn client_fields_with_undefined_global_variables_invalid() {
let input = include_str!("compile_relay_artifacts/fixtures/client-fields-with-undefined-global-variables.invalid.graphql");
let expected = include_str!("compile_relay_artifacts/fixtures/client-fields-with-undefined-global-variables.invalid.expected");
test_fixture(transform_fixture, "client-fields-with-undefined-global-variables.invalid.graphql", "compile_relay_artifacts/fixtures/client-fields-with-undefined-global-variables.invalid.expected", input, expected).await;
}

#[tokio::test]
async fn client_fragment_spreads() {
let input = include_str!("compile_relay_artifacts/fixtures/client-fragment-spreads.graphql");
Expand Down Expand Up @@ -1244,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_global_variables_invalid() {
let input = include_str!("compile_relay_artifacts/fixtures/relay-resolver-with-undefined-global-variables.invalid.graphql");
let expected = include_str!("compile_relay_artifacts/fixtures/relay-resolver-with-undefined-global-variables.invalid.expected");
test_fixture(transform_fixture, "relay-resolver-with-undefined-global-variables.invalid.graphql", "compile_relay_artifacts/fixtures/relay-resolver-with-undefined-global-variables.invalid.expected", input, expected).await;
}

#[tokio::test]
async fn relay_resolver_without_fragment_on_client_type() {
let input = include_str!("compile_relay_artifacts/fixtures/relay-resolver-without-fragment-on-client-type.graphql");
Expand Down

0 comments on commit 998fd49

Please sign in to comment.