Skip to content

Commit 6cf5071

Browse files
evanyeungmeta-codesync[bot]
authored andcommitted
Fix @refetchable preferFetchable boolean value being ignored
Reviewed By: tyao1 Differential Revision: D95477999 fbshipit-source-id: 8dd7e95350d8de5dc03ed71edfe09c0bc1ee999a
1 parent d5506ca commit 6cf5071

6 files changed

Lines changed: 56 additions & 5 deletions

File tree

compiler/crates/relay-transforms/src/refetchable_fragment/refetchable_directive.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,20 @@ impl RefetchableDirective {
125125
)])
126126
}?
127127
} else if argument.name.item == *PREFER_FETCHABLE_ARG {
128-
prefer_fetchable = true
128+
if let Value::Constant(ConstantValue::Boolean(val)) = argument.value.item {
129+
prefer_fetchable = val;
130+
} else {
131+
return Err(vec![Diagnostic::error(
132+
ValidationMessage::ExpectPreferFetchableToBeConstantBoolean {
133+
prefer_fetchable_value: print_value(
134+
schema,
135+
&argument.value.item,
136+
PrinterOptions::default(),
137+
),
138+
},
139+
argument.name.location,
140+
)]);
141+
}
129142
} else {
130143
// should be validated by general directive validations
131144
panic!(

compiler/crates/relay-transforms/src/refetchable_fragment/validation_message.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ pub(super) enum ValidationMessage {
122122
)]
123123
ExpectQueryNameToBeString { query_name_value: String },
124124

125+
#[error(
126+
"Expected the 'preferFetchable' argument of @refetchable to be a literal Boolean value, got '{prefer_fetchable_value}'"
127+
)]
128+
ExpectPreferFetchableToBeConstantBoolean { prefer_fetchable_value: String },
129+
125130
#[error(
126131
"Fragment variable `${name}` conflicts with a global variable generated by the @refetchable generated query"
127132
)]

compiler/crates/relay-transforms/tests/refetchable_fragment/fixtures/refetchable-prefer-fetchable-false-uses-node.expected

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ query RefetchableFragmentQuery(
1717
# ),
1818
# )
1919
{
20-
fetch__FetchableType(fetch_id: $id) {
20+
node(id: $id) {
2121
...RefetchableFragment
2222
}
2323
}
@@ -28,16 +28,17 @@ fragment RefetchableFragment on FetchableType @refetchable(queryName: "Refetchab
2828
# "RefetchableFragmentQuery",
2929
# ),
3030
# path: [
31-
# "fetch__FetchableType",
31+
# "node",
3232
# ],
3333
# identifier_info: Some(
3434
# RefetchableIdentifierInfo {
35-
# identifier_field: "fetch_id",
35+
# identifier_field: "id",
3636
# identifier_query_variable_name: "id",
3737
# },
3838
# ),
3939
# is_prefetchable_pagination: false,
4040
# }
4141
{
4242
fetch_id
43+
id
4344
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
==================================== INPUT ====================================
2+
# expected-to-throw
3+
# The preferFetchable argument must be a literal Boolean value,
4+
# not a variable reference.
5+
fragment RefetchableFragment on FetchableType
6+
@refetchable(queryName: "RefetchableFragmentQuery", preferFetchable: $preferFetchable)
7+
@argumentDefinitions(preferFetchable: {type: "Boolean!"}) {
8+
fetch_id
9+
}
10+
==================================== ERROR ====================================
11+
✖︎ Expected the 'preferFetchable' argument of @refetchable to be a literal Boolean value, got '$preferFetchable'
12+
13+
refetchable-prefer-fetchable-non-constant.invalid.graphql:5:55
14+
4 │ fragment RefetchableFragment on FetchableType
15+
5 │ @refetchable(queryName: "RefetchableFragmentQuery", preferFetchable: $preferFetchable)
16+
│ ^^^^^^^^^^^^^^^
17+
6 │ @argumentDefinitions(preferFetchable: {type: "Boolean!"}) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# expected-to-throw
2+
# The preferFetchable argument must be a literal Boolean value,
3+
# not a variable reference.
4+
fragment RefetchableFragment on FetchableType
5+
@refetchable(queryName: "RefetchableFragmentQuery", preferFetchable: $preferFetchable)
6+
@argumentDefinitions(preferFetchable: {type: "Boolean!"}) {
7+
fetch_id
8+
}

compiler/crates/relay-transforms/tests/refetchable_fragment_test.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<174358d8fb5b8abb9eb20e7994daa41e>>
7+
* @generated SignedSource<<4f2114418f17cd3a52a3694c396d65f6>>
88
*/
99

1010
mod refetchable_fragment;
@@ -235,3 +235,10 @@ async fn refetchable_prefer_fetchable_false_uses_node() {
235235
let expected = include_str!("refetchable_fragment/fixtures/refetchable-prefer-fetchable-false-uses-node.expected");
236236
test_fixture(transform_fixture, file!(), "refetchable-prefer-fetchable-false-uses-node.graphql", "refetchable_fragment/fixtures/refetchable-prefer-fetchable-false-uses-node.expected", input, expected).await;
237237
}
238+
239+
#[tokio::test]
240+
async fn refetchable_prefer_fetchable_non_constant_invalid() {
241+
let input = include_str!("refetchable_fragment/fixtures/refetchable-prefer-fetchable-non-constant.invalid.graphql");
242+
let expected = include_str!("refetchable_fragment/fixtures/refetchable-prefer-fetchable-non-constant.invalid.expected");
243+
test_fixture(transform_fixture, file!(), "refetchable-prefer-fetchable-non-constant.invalid.graphql", "refetchable_fragment/fixtures/refetchable-prefer-fetchable-non-constant.invalid.expected", input, expected).await;
244+
}

0 commit comments

Comments
 (0)