From a7d4f007b0d7fe32fb5467279f71b593795e02a0 Mon Sep 17 00:00:00 2001 From: jkomyno Date: Mon, 23 Sep 2024 15:12:21 +0200 Subject: [PATCH] test(quaint): add explicit regression test for issue prisma/prisma#24072, via new macro "assert_connector_error" --- .../query-engine-tests/src/utils/querying.rs | 22 ++++++++++ .../new/ref_actions/on_delete/set_default.rs | 2 +- .../tests/new/regressions/mod.rs | 1 + .../tests/new/regressions/prisma_24072.rs | 44 +++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/prisma_24072.rs diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/src/utils/querying.rs b/query-engine/connector-test-kit-rs/query-engine-tests/src/utils/querying.rs index 268fddef976b..ce64623645bd 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/src/utils/querying.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/src/utils/querying.rs @@ -34,6 +34,28 @@ macro_rules! match_connector_result { }; } +#[macro_export] +macro_rules! assert_connector_error { + ($runner:expr, $q:expr, $code:expr, $( $($matcher:pat_param)|+ $( if $pred:expr )? => $msg:expr ),*) => { + use query_tests_setup::*; + use query_tests_setup::ConnectorVersion::*; + + let connector = $runner.connector_version(); + + let mut results = match &connector { + $( + $( $matcher )|+ $( if $pred )? => $msg.to_string() + ),* + }; + + if results.len() == 0 { + panic!("No assertion failure defined for connector {connector}."); + } + + $runner.query($q).await?.assert_failure($code, Some(results)); + }; +} + #[macro_export] macro_rules! is_one_of { ($result:expr, $potential_results:expr) => { diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/ref_actions/on_delete/set_default.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/ref_actions/on_delete/set_default.rs index 17da4f624b6c..9e347d476059 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/ref_actions/on_delete/set_default.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/ref_actions/on_delete/set_default.rs @@ -187,7 +187,7 @@ mod one2one_opt { runner, "mutation { deleteOneParent(where: { id: 1 }) { id }}", 2003, - "Foreign key constraint violated: `Child_parent_id_fkey (index)`" + "Foreign key constraint violated" ); Ok(()) diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/mod.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/mod.rs index 4b014fa53f69..5cd387d64f9e 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/mod.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/mod.rs @@ -27,6 +27,7 @@ mod prisma_21901; mod prisma_22007; mod prisma_22298; mod prisma_22971; +mod prisma_24072; mod prisma_5952; mod prisma_6173; mod prisma_7010; diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/prisma_24072.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/prisma_24072.rs new file mode 100644 index 000000000000..b2163892e0c7 --- /dev/null +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/new/regressions/prisma_24072.rs @@ -0,0 +1,44 @@ +use indoc::indoc; +use query_engine_tests::*; + +#[test_suite(schema(schema))] +mod prisma_24072 { + fn schema() -> String { + let schema = indoc! { + r#"model Parent { + #id(id, Int, @id) + child Child? + } + + model Child { + #id(id, Int, @id) + parent_id Int? @default(2) @unique + parent Parent? @relation(fields: [parent_id], references: [id], onDelete: SetDefault) + }"# + }; + + schema.to_owned() + } + + // Deleting the parent without cascading to the child should fail with an explicitly named constraint violation, + // without any "(not available)" names. + #[connector_test] + async fn test_24072(runner: Runner) -> TestResult<()> { + insta::assert_snapshot!( + run_query!(&runner, r#"mutation { createOneParent(data: { id: 1, child: { create: { id: 1 }}}) { id }}"#), + @r###"{"data":{"createOneParent":{"id":1}}}"### + ); + + assert_connector_error!( + &runner, + "mutation { deleteOneParent(where: { id: 1 }) { id }}", + 2003, + CockroachDb(_) | Postgres(_) | SqlServer(_) | Vitess(_) => "Foreign key constraint violated: `Child_parent_id_fkey (index)`", + MySql(_) => "Foreign key constraint violated: `parent_id`", + Sqlite(_) => "Foreign key constraint violated: `foreign key`", + _ => "Foreign key constraint violated" + ); + + Ok(()) + } +}