gluesql_test_suite/validate/
unique.rs

1use {
2    crate::*,
3    gluesql_core::{error::ValidateError, prelude::Value},
4};
5
6test_case!(unique, {
7    let g = get_tester!();
8
9    let queries = [
10        r#"
11        CREATE TABLE TestA (
12            id INTEGER UNIQUE,
13            num INT
14        )
15        "#,
16        r#"
17        CREATE TABLE TestB (
18            id INTEGER UNIQUE,
19            num INT UNIQUE
20        )
21        "#,
22        r#"
23        CREATE TABLE TestC (
24            id INTEGER NULL UNIQUE,
25            num INT
26        )
27        "#,
28        "INSERT INTO TestA VALUES (1, 1)",
29        "INSERT INTO TestA VALUES (2, 1), (3, 1)",
30        "INSERT INTO TestB VALUES (1, 1)",
31        "INSERT INTO TestB VALUES (2, 2), (3, 3)",
32        "INSERT INTO TestC VALUES (NULL, 1)",
33        "INSERT INTO TestC VALUES (2, 2), (NULL, 3)",
34        "UPDATE TestC SET id = 1 WHERE num = 1",
35        "UPDATE TestC SET id = NULL WHERE num = 1",
36    ];
37
38    for query in queries {
39        g.run(query).await;
40    }
41
42    let error_cases = [
43        (
44            "INSERT INTO TestA VALUES (2, 2)",
45            ValidateError::DuplicateEntryOnUniqueField(Value::I64(2), "id".to_owned()).into(),
46        ),
47        (
48            "INSERT INTO TestA VALUES (4, 4), (4, 5)",
49            ValidateError::DuplicateEntryOnUniqueField(Value::I64(4), "id".to_owned()).into(),
50        ),
51        (
52            "UPDATE TestA SET id = 2 WHERE id = 1",
53            ValidateError::DuplicateEntryOnUniqueField(Value::I64(2), "id".to_owned()).into(),
54        ),
55        (
56            "INSERT INTO TestB VALUES (1, 3)",
57            ValidateError::DuplicateEntryOnUniqueField(Value::I64(1), "id".to_owned()).into(),
58        ),
59        (
60            "INSERT INTO TestB VALUES (4, 2)",
61            ValidateError::DuplicateEntryOnUniqueField(Value::I64(2), "num".to_owned()).into(),
62        ),
63        (
64            "INSERT INTO TestB VALUES (5, 5), (6, 5)",
65            ValidateError::DuplicateEntryOnUniqueField(Value::I64(5), "num".to_owned()).into(),
66        ),
67        (
68            "UPDATE TestB SET num = 2 WHERE id = 1",
69            ValidateError::DuplicateEntryOnUniqueField(Value::I64(2), "num".to_owned()).into(),
70        ),
71        (
72            "INSERT INTO TestC VALUES (2, 4)",
73            ValidateError::DuplicateEntryOnUniqueField(Value::I64(2), "id".to_owned()).into(),
74        ),
75        (
76            "INSERT INTO TestC VALUES (NULL, 5), (3, 5), (3, 6)",
77            ValidateError::DuplicateEntryOnUniqueField(Value::I64(3), "id".to_owned()).into(),
78        ),
79        (
80            "UPDATE TestC SET id = 1",
81            ValidateError::DuplicateEntryOnUniqueField(Value::I64(1), "id".to_owned()).into(),
82        ),
83    ];
84
85    for (sql, error) in error_cases {
86        g.test(sql, Err(error)).await;
87    }
88});