diff --git a/crates/integration-tests/src/tests/expressions.rs b/crates/integration-tests/src/tests/expressions.rs index c6630e80..9b59046c 100644 --- a/crates/integration-tests/src/tests/expressions.rs +++ b/crates/integration-tests/src/tests/expressions.rs @@ -1,20 +1,45 @@ use insta::assert_yaml_snapshot; -use ndc_models::ExistsInCollection; +use ndc_models::{ExistsInCollection, Expression}; use ndc_test_helpers::{ - asc, binop, exists, field, query, query_request, relation_field, relationship, target, value, + array, asc, binop, exists, field, object, query, query_request, relation_field, relationship, + target, value, }; use crate::{connector::Connector, graphql_query, run_connector_query}; #[tokio::test] -async fn evaluates_field_name_that_requires_escaping_in_nested_expression() -> anyhow::Result<()> { +async fn evaluates_field_name_that_requires_escaping() -> anyhow::Result<()> { assert_yaml_snapshot!( graphql_query( r#" - query Filtering { - extendedJsonTestData(where: { value: { _regex: "hello" } }) { - type - value + query { + testCases_weirdFieldNames(where: { invalidName: { _eq: 3 } }) { + invalidName + } + } + "# + ) + .run() + .await? + ); + Ok(()) +} + +#[tokio::test] +async fn evaluates_field_name_that_requires_escaping_in_complex_expression() -> anyhow::Result<()> { + assert_yaml_snapshot!( + graphql_query( + r#" + query { + testCases_weirdFieldNames( + where: { + _and: [ + { invalidName: { _gt: 2 } }, + { invalidName: { _lt: 4 } } + ] + } + ) { + invalidName } } "# @@ -55,3 +80,86 @@ async fn evaluates_exists_with_predicate() -> anyhow::Result<()> { ); Ok(()) } + +#[tokio::test] +async fn exists_with_predicate_with_escaped_field_name() -> anyhow::Result<()> { + assert_yaml_snapshot!( + run_connector_query( + Connector::TestCases, + query_request().collection("weird_field_names").query( + query() + .predicate(exists( + ExistsInCollection::NestedCollection { + column_name: "$invalid.array".into(), + arguments: Default::default(), + field_path: Default::default(), + }, + binop("_lt", target!("$invalid.element"), value!(3)), + )) + .fields([ + field!("_id"), + field!("invalid_array" => "$invalid.array", array!(object!([ + field!("invalid_element" => "$invalid.element") + ]))) + ]) + .order_by([asc!("$invalid.name")]), + ) + ) + .await? + ); + Ok(()) +} + +#[tokio::test] +async fn exists_in_nested_collection_without_predicate() -> anyhow::Result<()> { + assert_yaml_snapshot!( + run_connector_query( + Connector::TestCases, + query_request().collection("nested_collection").query( + query() + .predicate(Expression::Exists { + in_collection: ExistsInCollection::NestedCollection { + column_name: "staff".into(), + arguments: Default::default(), + field_path: Default::default(), + }, + predicate: None, + }) + .fields([field!("_id"), field!("institution")]) + .order_by([asc!("institution")]), + ) + ) + .await? + ); + Ok(()) +} + +#[tokio::test] +async fn exists_in_nested_collection_without_predicate_with_escaped_field_name( +) -> anyhow::Result<()> { + assert_yaml_snapshot!( + run_connector_query( + Connector::TestCases, + query_request().collection("weird_field_names").query( + query() + .predicate(Expression::Exists { + in_collection: ExistsInCollection::NestedCollection { + column_name: "$invalid.array".into(), + arguments: Default::default(), + field_path: Default::default(), + }, + predicate: None, + }) + .fields([ + field!("_id"), + field!("invalid_array" => "$invalid.array", array!(object!([ + field!("invalid_element" => "$invalid.element") + ]))) + ]) + .order_by([asc!("$invalid.name")]), + ) + ) + .await? + ); + Ok(()) +} diff --git a/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping.snap b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping.snap new file mode 100644 index 00000000..0259aa59 --- /dev/null +++ b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping.snap @@ -0,0 +1,8 @@ +--- +source: crates/integration-tests/src/tests/expressions.rs +expression: "graphql_query(r#\"\n query {\n testCases_weirdFieldNames(where: { invalidName: { _eq: 3 } }) {\n invalidName\n }\n }\n \"#).run().await?" +--- +data: + testCases_weirdFieldNames: + - invalidName: 3 +errors: ~ diff --git a/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping_in_complex_expression.snap b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping_in_complex_expression.snap new file mode 100644 index 00000000..cdd1cbcc --- /dev/null +++ b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping_in_complex_expression.snap @@ -0,0 +1,8 @@ +--- +source: crates/integration-tests/src/tests/expressions.rs +expression: "graphql_query(r#\"\n query {\n testCases_weirdFieldNames(\n where: { \n _and: [\n { invalidName: { _gt: 2 } },\n { invalidName: { _lt: 4 } } \n ] \n }\n ) {\n invalidName\n }\n }\n \"#).run().await?" +--- +data: + testCases_weirdFieldNames: + - invalidName: 3 +errors: ~ diff --git a/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping_in_nested_expression.snap b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping_in_nested_expression.snap deleted file mode 100644 index cbd26264..00000000 --- a/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__evaluates_field_name_that_requires_escaping_in_nested_expression.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/integration-tests/src/tests/expressions.rs -expression: "graphql_query(r#\"\n query Filtering {\n extendedJsonTestData(where: { value: { _regex: \"hello\" } }) {\n type\n value\n }\n }\n \"#).run().await?" ---- -data: - extendedJsonTestData: - - type: string - value: "hello, world!" -errors: ~ diff --git a/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_in_nested_collection_without_predicate.snap b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_in_nested_collection_without_predicate.snap new file mode 100644 index 00000000..bb6e8460 --- /dev/null +++ b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_in_nested_collection_without_predicate.snap @@ -0,0 +1,11 @@ +--- +source: crates/integration-tests/src/tests/expressions.rs +expression: "run_connector_query(Connector::TestCases,\n query_request().collection(\"nested_collection\").query(query().predicate(Expression::Exists {\n in_collection: ExistsInCollection::NestedCollection {\n column_name: \"staff\".into(),\n arguments: Default::default(),\n field_path: Default::default(),\n },\n predicate: None,\n }).fields([field!(\"_id\"),\n field!(\"institution\")]).order_by([asc!(\"institution\")]))).await?" +--- +- rows: + - _id: 6705a1cec2df58ace3e67807 + institution: Aperture Science + - _id: 6705a1c2c2df58ace3e67806 + institution: Black Mesa + - _id: 6705a1d7c2df58ace3e67808 + institution: City 17 diff --git a/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_in_nested_collection_without_predicate_with_escaped_field_name.snap b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_in_nested_collection_without_predicate_with_escaped_field_name.snap new file mode 100644 index 00000000..02a0ab0e --- /dev/null +++ b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_in_nested_collection_without_predicate_with_escaped_field_name.snap @@ -0,0 +1,17 @@ +--- +source: crates/integration-tests/src/tests/expressions.rs +expression: "run_connector_query(Connector::TestCases,\n query_request().collection(\"weird_field_names\").query(query().predicate(Expression::Exists {\n in_collection: ExistsInCollection::NestedCollection {\n column_name: \"$invalid.array\".into(),\n arguments: Default::default(),\n field_path: Default::default(),\n },\n predicate: None,\n }).fields([field!(\"_id\"),\n field!(\"invalid_array\" => \"$invalid.array\",\n array!(object!([field!(\"invalid_element\" =>\n \"$invalid.element\")])))]).order_by([asc!(\"$invalid.name\")]))).await?" +--- +- rows: + - _id: 66cf91a0ec1dfb55954378bd + invalid_array: + - invalid_element: 1 + - _id: 66cf9230ec1dfb55954378be + invalid_array: + - invalid_element: 2 + - _id: 66cf9274ec1dfb55954378bf + invalid_array: + - invalid_element: 3 + - _id: 66cf9295ec1dfb55954378c0 + invalid_array: + - invalid_element: 4 diff --git a/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_with_predicate_with_escaped_field_name.snap b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_with_predicate_with_escaped_field_name.snap new file mode 100644 index 00000000..60507475 --- /dev/null +++ b/crates/integration-tests/src/tests/snapshots/integration_tests__tests__expressions__exists_with_predicate_with_escaped_field_name.snap @@ -0,0 +1,11 @@ +--- +source: crates/integration-tests/src/tests/expressions.rs +expression: "run_connector_query(Connector::TestCases,\n query_request().collection(\"weird_field_names\").query(query().predicate(exists(ExistsInCollection::NestedCollection {\n column_name: \"$invalid.array\".into(),\n arguments: Default::default(),\n field_path: Default::default(),\n },\n binop(\"_lt\", target!(\"$invalid.element\"),\n value!(3)))).fields([field!(\"_id\"),\n field!(\"invalid_array\" => \"$invalid.array\",\n array!(object!([field!(\"invalid_element\" =>\n \"$invalid.element\")])))]).order_by([asc!(\"$invalid.name\")]))).await?" +--- +- rows: + - _id: 66cf91a0ec1dfb55954378bd + invalid_array: + - invalid_element: 1 + - _id: 66cf9230ec1dfb55954378be + invalid_array: + - invalid_element: 2 diff --git a/fixtures/hasura/test_cases/connector/schema/weird_field_names.json b/fixtures/hasura/test_cases/connector/schema/weird_field_names.json index 2fbd8940..42344e40 100644 --- a/fixtures/hasura/test_cases/connector/schema/weird_field_names.json +++ b/fixtures/hasura/test_cases/connector/schema/weird_field_names.json @@ -8,6 +8,13 @@ "objectTypes": { "weird_field_names": { "fields": { + "$invalid.array": { + "type": { + "arrayOf": { + "object": "weird_field_names_$invalid.array" + } + } + }, "$invalid.name": { "type": { "scalar": "int" @@ -30,6 +37,15 @@ } } }, + "weird_field_names_$invalid.array": { + "fields": { + "$invalid.element": { + "type": { + "scalar": "int" + } + } + } + }, "weird_field_names_$invalid.object.name": { "fields": { "valid_name": { diff --git a/fixtures/mongodb/test_cases/nested_collection.json b/fixtures/mongodb/test_cases/nested_collection.json index f03fe46f..ac89a340 100644 --- a/fixtures/mongodb/test_cases/nested_collection.json +++ b/fixtures/mongodb/test_cases/nested_collection.json @@ -1,3 +1,3 @@ -{ "institution": "Black Mesa", "staff": [{ "name": "Freeman" }, { "name": "Calhoun" }] } -{ "institution": "Aperture Science", "staff": [{ "name": "GLaDOS" }, { "name": "Chell" }] } -{ "institution": "City 17", "staff": [{ "name": "Alyx" }, { "name": "Freeman" }, { "name": "Breen" }] } +{ "_id": { "$oid": "6705a1c2c2df58ace3e67806" }, "institution": "Black Mesa", "staff": [{ "name": "Freeman" }, { "name": "Calhoun" }] } +{ "_id": { "$oid": "6705a1cec2df58ace3e67807" }, "institution": "Aperture Science", "staff": [{ "name": "GLaDOS" }, { "name": "Chell" }] } +{ "_id": { "$oid": "6705a1d7c2df58ace3e67808" }, "institution": "City 17", "staff": [{ "name": "Alyx" }, { "name": "Freeman" }, { "name": "Breen" }] } diff --git a/fixtures/mongodb/test_cases/weird_field_names.json b/fixtures/mongodb/test_cases/weird_field_names.json index 3894de91..e1c1d7b5 100644 --- a/fixtures/mongodb/test_cases/weird_field_names.json +++ b/fixtures/mongodb/test_cases/weird_field_names.json @@ -1,4 +1,4 @@ -{ "_id": { "$oid": "66cf91a0ec1dfb55954378bd" }, "$invalid.name": 1, "$invalid.object.name": { "valid_name": 1 }, "valid_object_name": { "$invalid.nested.name": 1 } } -{ "_id": { "$oid": "66cf9230ec1dfb55954378be" }, "$invalid.name": 2, "$invalid.object.name": { "valid_name": 2 }, "valid_object_name": { "$invalid.nested.name": 2 } } -{ "_id": { "$oid": "66cf9274ec1dfb55954378bf" }, "$invalid.name": 3, "$invalid.object.name": { "valid_name": 3 }, "valid_object_name": { "$invalid.nested.name": 3 } } -{ "_id": { "$oid": "66cf9295ec1dfb55954378c0" }, "$invalid.name": 4, "$invalid.object.name": { "valid_name": 4 }, "valid_object_name": { "$invalid.nested.name": 4 } } +{ "_id": { "$oid": "66cf91a0ec1dfb55954378bd" }, "$invalid.name": 1, "$invalid.object.name": { "valid_name": 1 }, "valid_object_name": { "$invalid.nested.name": 1 }, "$invalid.array": [{ "$invalid.element": 1 }] } +{ "_id": { "$oid": "66cf9230ec1dfb55954378be" }, "$invalid.name": 2, "$invalid.object.name": { "valid_name": 2 }, "valid_object_name": { "$invalid.nested.name": 2 }, "$invalid.array": [{ "$invalid.element": 2 }] } +{ "_id": { "$oid": "66cf9274ec1dfb55954378bf" }, "$invalid.name": 3, "$invalid.object.name": { "valid_name": 3 }, "valid_object_name": { "$invalid.nested.name": 3 }, "$invalid.array": [{ "$invalid.element": 3 }] } +{ "_id": { "$oid": "66cf9295ec1dfb55954378c0" }, "$invalid.name": 4, "$invalid.object.name": { "valid_name": 4 }, "valid_object_name": { "$invalid.nested.name": 4 }, "$invalid.array": [{ "$invalid.element": 4 }] }