Skip to content

Commit 66bd2dc

Browse files
committed
Add tests for bound parameters
1 parent 13f96ab commit 66bd2dc

File tree

67 files changed

+1656
-233
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+1656
-233
lines changed

crates/ndc-clickhouse/tests/query_builder.rs

Lines changed: 107 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,26 @@ mod test_utils {
7070
let expected_statement = fs::read_to_string(&statement_path).await?;
7171
Ok(expected_statement)
7272
}
73+
async fn read_expected_parameterized_sql(
74+
schema_dir: &str,
75+
group_dir: &str,
76+
test_name: &str,
77+
) -> Result<String, Box<dyn Error>> {
78+
let statement_path = tests_dir_path(schema_dir, group_dir)
79+
.join(format!("{test_name}.parameterized_statement.sql"));
80+
let expected_statement = fs::read_to_string(&statement_path).await?;
81+
Ok(expected_statement)
82+
}
83+
async fn read_expected_parameters(
84+
schema_dir: &str,
85+
group_dir: &str,
86+
test_name: &str,
87+
) -> Result<String, Box<dyn Error>> {
88+
let parameters_path =
89+
tests_dir_path(schema_dir, group_dir).join(format!("{test_name}.parameters.txt"));
90+
let expected_parameters = fs::read_to_string(&parameters_path).await?;
91+
Ok(expected_parameters)
92+
}
7393
async fn write_expected_sql(
7494
schema_dir: &str,
7595
group_dir: &str,
@@ -78,8 +98,23 @@ mod test_utils {
7898
) -> Result<(), Box<dyn Error>> {
7999
let statement_path =
80100
tests_dir_path(schema_dir, group_dir).join(format!("{test_name}.statement.sql"));
81-
let pretty_statement = pretty_print_sql(generated_statement);
82-
fs::write(&statement_path, &pretty_statement).await?;
101+
fs::write(&statement_path, &generated_statement).await?;
102+
Ok(())
103+
}
104+
async fn write_expected_parameterized_sql(
105+
schema_dir: &str,
106+
group_dir: &str,
107+
test_name: &str,
108+
generated_statement: &str,
109+
parameters: &str,
110+
) -> Result<(), Box<dyn Error>> {
111+
let statement_path = tests_dir_path(schema_dir, group_dir)
112+
.join(format!("{test_name}.parameterized_statement.sql"));
113+
let parameters_path =
114+
tests_dir_path(schema_dir, group_dir).join(format!("{test_name}.parameters.txt"));
115+
fs::write(&statement_path, &generated_statement).await?;
116+
fs::write(&parameters_path, &parameters).await?;
117+
83118
Ok(())
84119
}
85120
fn pretty_print_sql(query: &str) -> String {
@@ -104,6 +139,26 @@ mod test_utils {
104139
);
105140
Ok(generated_statement)
106141
}
142+
fn generate_parameterized_sql(
143+
configuration: &ServerConfig,
144+
request: &models::QueryRequest,
145+
) -> Result<(String, String), QueryBuilderError> {
146+
let (statement, parameters) =
147+
QueryBuilder::new(request, configuration).build_parameterized()?;
148+
let pretty_statement = pretty_print_sql(&statement.to_string());
149+
let printed_parameters =
150+
parameters
151+
.into_iter()
152+
.fold(String::new(), |mut acc, (name, value)| {
153+
acc.reserve(name.len() + value.len() + 2);
154+
acc.push_str(&name);
155+
acc.push('=');
156+
acc.push_str(&value);
157+
acc.push('\n');
158+
acc
159+
});
160+
Ok((pretty_statement, printed_parameters))
161+
}
107162
pub async fn test_generated_sql(
108163
schema_dir: &str,
109164
group_dir: &str,
@@ -113,13 +168,48 @@ mod test_utils {
113168
let request = read_request(schema_dir, group_dir, test_name).await?;
114169

115170
let generated_sql = generate_sql(&configuration, &request)?;
171+
let (parameterized_sql, parameters) = generate_parameterized_sql(&configuration, &request)?;
116172

117173
if UPDATE_SNAPSHOTS {
118174
write_expected_sql(schema_dir, group_dir, test_name, &generated_sql).await?;
175+
write_expected_parameterized_sql(
176+
schema_dir,
177+
group_dir,
178+
test_name,
179+
&parameterized_sql,
180+
&parameters,
181+
)
182+
.await?;
119183
} else {
120184
let expected_sql = read_expected_sql(schema_dir, group_dir, test_name).await?;
121185

122-
assert_eq!(generated_sql, expected_sql);
186+
assert_eq!(
187+
generated_sql, expected_sql,
188+
"Inlined SQL should match snapshot"
189+
);
190+
191+
let expected_parameterized_sql =
192+
read_expected_parameterized_sql(schema_dir, group_dir, test_name).await?;
193+
194+
assert_eq!(
195+
parameterized_sql, expected_parameterized_sql,
196+
"Parameterized SQL should match snapshot"
197+
);
198+
199+
let expected_parameters =
200+
read_expected_parameters(schema_dir, group_dir, test_name).await?;
201+
202+
assert_eq!(
203+
parameters, expected_parameters,
204+
"Parameters should match snapshot"
205+
);
206+
207+
if expected_parameters.is_empty() {
208+
assert_eq!(
209+
generated_sql, parameterized_sql,
210+
"If no parameters are present, parameterized sql should match inlined sql"
211+
);
212+
}
123213
}
124214

125215
Ok(())
@@ -349,3 +439,17 @@ mod field_selector {
349439
test_generated_sql("06_no_useless_nested_accessors").await
350440
}
351441
}
442+
443+
#[cfg(test)]
444+
mod bound_parameters {
445+
use super::*;
446+
447+
async fn test_generated_sql(name: &str) -> Result<(), Box<dyn Error>> {
448+
super::test_utils::test_generated_sql("complex_columns", "bound_parameters", name).await
449+
}
450+
451+
#[tokio::test]
452+
async fn bind_complex_parameters() -> Result<(), Box<dyn Error>> {
453+
test_generated_sql("01_bind_complex_parameters").await
454+
}
455+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
SELECT
2+
toJSONString(
3+
groupArray(
4+
cast(
5+
"_rowset"."_rowset",
6+
'Tuple(rows Array(Tuple("albumId" Int32, "artistId" Int32, "title" String)))'
7+
)
8+
)
9+
) AS "rowsets"
10+
FROM
11+
(
12+
SELECT
13+
tuple(
14+
groupArray(
15+
tuple(
16+
"_row"."_field_albumId",
17+
"_row"."_field_artistId",
18+
"_row"."_field_title"
19+
)
20+
)
21+
) AS "_rowset"
22+
FROM
23+
(
24+
SELECT
25+
"_origin"."AlbumId" AS "_field_albumId",
26+
"_origin"."ArtistId" AS "_field_artistId",
27+
"_origin"."Title" AS "_field_title"
28+
FROM
29+
"Chinook"."Album" AS "_origin"
30+
) AS "_row"
31+
) AS "_rowset" FORMAT TabSeparatedRaw;

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/01_select_rows.parameters.txt

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
SELECT
2+
toJSONString(
3+
groupArray(
4+
cast(
5+
"_rowset"."_rowset",
6+
'Tuple(rows Array(Tuple("albumId" Int32, "artistId" Int32, "title" String)))'
7+
)
8+
)
9+
) AS "rowsets"
10+
FROM
11+
(
12+
SELECT
13+
tuple(
14+
groupArray(
15+
tuple(
16+
"_row"."_field_albumId",
17+
"_row"."_field_artistId",
18+
"_row"."_field_title"
19+
)
20+
)
21+
) AS "_rowset"
22+
FROM
23+
(
24+
SELECT
25+
"_origin"."AlbumId" AS "_field_albumId",
26+
"_origin"."ArtistId" AS "_field_artistId",
27+
"_origin"."Title" AS "_field_title"
28+
FROM
29+
"Chinook"."Album" AS "_origin"
30+
WHERE
31+
"_origin"."ArtistId" = { p0 :Int32 }
32+
) AS "_row"
33+
) AS "_rowset" FORMAT TabSeparatedRaw;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
param_p0=1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
SELECT
2+
toJSONString(
3+
groupArray(
4+
cast(
5+
"_rowset"."_rowset",
6+
'Tuple(rows Array(Tuple("albumId" Int32, "artistId" Int32, "title" String)))'
7+
)
8+
)
9+
) AS "rowsets"
10+
FROM
11+
(
12+
SELECT
13+
tuple(
14+
groupArray(
15+
tuple(
16+
"_row"."_field_albumId",
17+
"_row"."_field_artistId",
18+
"_row"."_field_title"
19+
)
20+
)
21+
) AS "_rowset"
22+
FROM
23+
(
24+
SELECT
25+
"_origin"."AlbumId" AS "_field_albumId",
26+
"_origin"."ArtistId" AS "_field_artistId",
27+
"_origin"."Title" AS "_field_title"
28+
FROM
29+
"Chinook"."Album" AS "_origin"
30+
WHERE
31+
(
32+
"_origin"."ArtistId" = { p0 :Int32 }
33+
AND NOT ("_origin"."ArtistId" = { p1 :Int32 })
34+
)
35+
) AS "_row"
36+
) AS "_rowset" FORMAT TabSeparatedRaw;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
param_p0=1
2+
param_p1=2

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/03_larger_predicate.request.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "../request.schema.json",
2+
"$schema": "../../request.schema.json",
33
"collection": "Chinook_Album",
44
"query": {
55
"fields": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
SELECT
2+
toJSONString(
3+
groupArray(
4+
cast(
5+
"_rowset"."_rowset",
6+
'Tuple(rows Array(Tuple("albumId" Int32, "artistId" Int32, "title" String)))'
7+
)
8+
)
9+
) AS "rowsets"
10+
FROM
11+
(
12+
SELECT
13+
tuple(
14+
groupArray(
15+
tuple(
16+
"_row"."_field_albumId",
17+
"_row"."_field_artistId",
18+
"_row"."_field_title"
19+
)
20+
)
21+
) AS "_rowset"
22+
FROM
23+
(
24+
SELECT
25+
"_origin"."AlbumId" AS "_field_albumId",
26+
"_origin"."ArtistId" AS "_field_artistId",
27+
"_origin"."Title" AS "_field_title"
28+
FROM
29+
"Chinook"."Album" AS "_origin"
30+
LIMIT
31+
10
32+
) AS "_row"
33+
) AS "_rowset" FORMAT TabSeparatedRaw;

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/04_limit.parameters.txt

Whitespace-only changes.

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/04_limit.request.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "../request.schema.json",
2+
"$schema": "../../request.schema.json",
33
"collection": "Chinook_Album",
44
"query": {
55
"fields": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
SELECT
2+
toJSONString(
3+
groupArray(
4+
cast(
5+
"_rowset"."_rowset",
6+
'Tuple(rows Array(Tuple("albumId" Int32, "artistId" Int32, "title" String)))'
7+
)
8+
)
9+
) AS "rowsets"
10+
FROM
11+
(
12+
SELECT
13+
tuple(
14+
groupArray(
15+
tuple(
16+
"_row"."_field_albumId",
17+
"_row"."_field_artistId",
18+
"_row"."_field_title"
19+
)
20+
)
21+
) AS "_rowset"
22+
FROM
23+
(
24+
SELECT
25+
"_origin"."AlbumId" AS "_field_albumId",
26+
"_origin"."ArtistId" AS "_field_artistId",
27+
"_origin"."Title" AS "_field_title"
28+
FROM
29+
"Chinook"."Album" AS "_origin" OFFSET 10
30+
) AS "_row"
31+
) AS "_rowset" FORMAT TabSeparatedRaw;

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/05_offset.parameters.txt

Whitespace-only changes.

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/05_offset.request.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "../request.schema.json",
2+
"$schema": "../../request.schema.json",
33
"collection": "Chinook_Album",
44
"query": {
55
"fields": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
SELECT
2+
toJSONString(
3+
groupArray(
4+
cast(
5+
"_rowset"."_rowset",
6+
'Tuple(rows Array(Tuple("albumId" Int32, "artistId" Int32, "title" String)))'
7+
)
8+
)
9+
) AS "rowsets"
10+
FROM
11+
(
12+
SELECT
13+
tuple(
14+
groupArray(
15+
tuple(
16+
"_row"."_field_albumId",
17+
"_row"."_field_artistId",
18+
"_row"."_field_title"
19+
)
20+
)
21+
) AS "_rowset"
22+
FROM
23+
(
24+
SELECT
25+
"_origin"."AlbumId" AS "_field_albumId",
26+
"_origin"."ArtistId" AS "_field_artistId",
27+
"_origin"."Title" AS "_field_title"
28+
FROM
29+
"Chinook"."Album" AS "_origin"
30+
LIMIT
31+
10 OFFSET 10
32+
) AS "_row"
33+
) AS "_rowset" FORMAT TabSeparatedRaw;

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/06_limit_offset.parameters.txt

Whitespace-only changes.

crates/ndc-clickhouse/tests/query_builder/chinook/01_simple_queries/06_limit_offset.request.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "../request.schema.json",
2+
"$schema": "../../request.schema.json",
33
"collection": "Chinook_Album",
44
"query": {
55
"fields": {

0 commit comments

Comments
 (0)