Skip to content

Commit 8c3aa77

Browse files
committed
test: Expand passthrough test cases
1 parent 3ab0c7c commit 8c3aa77

2 files changed

Lines changed: 149 additions & 1 deletion

File tree

packages/cipherstash-proxy-integration/src/common.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ pub async fn clear() {
3636

3737
let sql = "TRUNCATE encrypted";
3838
client.simple_query(sql).await.unwrap();
39+
40+
let sql = "TRUNCATE plaintext";
41+
client.simple_query(sql).await.unwrap();
3942
}
4043

4144
pub async fn reset_schema() {

packages/cipherstash-proxy-integration/src/passthrough.rs

Lines changed: 146 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
#[cfg(test)]
22
mod tests {
3-
use crate::common::{connect_with_tls, id, random_string, PROXY};
3+
use crate::common::{clear, connect_with_tls, id, random_string, PROXY};
44
use rand::Rng;
55
use std::error::Error;
66

77
#[tokio::test]
88
async fn passthrough_statement() {
99
let client = connect_with_tls(PROXY).await;
1010

11+
clear().await;
12+
1113
let id = id();
1214
let encrypted_text = "hello@cipherstash.com";
1315

@@ -29,6 +31,8 @@ mod tests {
2931
async fn passthrough_invalid_statement() {
3032
let client = connect_with_tls(PROXY).await;
3133

34+
clear().await;
35+
3236
let sql = "SELECT * FROM blahvtha";
3337
let result = client.query(sql, &[]).await;
3438

@@ -79,4 +83,145 @@ mod tests {
7983
tokio::time::sleep(std::time::Duration::from_millis(sleep_duration)).await;
8084
}
8185
}
86+
87+
#[tokio::test]
88+
async fn passthrough_insert_from_select() {
89+
let client = connect_with_tls(PROXY).await;
90+
91+
clear().await;
92+
93+
// Setup data
94+
let id_1 = id();
95+
let plaintext = "hello@cipherstash.com";
96+
97+
let sql = "INSERT INTO plaintext (id, plaintext) VALUES ($1, $2)";
98+
client.query(sql, &[&id_1, &plaintext]).await.unwrap();
99+
100+
let id_2 = id_1 + 1;
101+
102+
// Insert value is selected from the record we just created
103+
let select =
104+
"SELECT id + 1, plaintext FROM plaintext WHERE id = ANY( ARRAY[ $1::Int8, $2::Int8 ] )";
105+
let sql = format!("INSERT INTO plaintext (id, plaintext) {select} ON CONFLICT DO NOTHING");
106+
client.query(&sql, &[&id_1, &id_2]).await.unwrap();
107+
108+
let sql = "SELECT id, plaintext FROM plaintext WHERE id = $1";
109+
let rows = client.query(sql, &[&id_2]).await.unwrap();
110+
111+
assert_eq!(rows.len(), 1);
112+
113+
for row in rows {
114+
let result: String = row.get("plaintext");
115+
assert_eq!(plaintext, result);
116+
}
117+
}
118+
119+
#[tokio::test]
120+
async fn passthrough_insert_with_value_from_select() {
121+
let client = connect_with_tls(PROXY).await;
122+
123+
clear().await;
124+
125+
// Setup data
126+
let id_1 = id();
127+
let plaintext = "hello@cipherstash.com";
128+
129+
let sql = "INSERT INTO plaintext (id, plaintext) VALUES ($1, $2)";
130+
client.query(sql, &[&id_1, &plaintext]).await.unwrap();
131+
132+
let id_2 = id();
133+
134+
// Insert value is selected from the record we just created
135+
let select = "SELECT plaintext FROM plaintext WHERE id = $2";
136+
let sql = format!("INSERT INTO plaintext (id, plaintext) VALUES ($1, ({select}))");
137+
client.query(&sql, &[&id_2, &id_1]).await.unwrap();
138+
139+
let sql = "SELECT id, plaintext FROM plaintext WHERE id = $1";
140+
let rows = client.query(sql, &[&id_2]).await.unwrap();
141+
142+
assert_eq!(rows.len(), 1);
143+
144+
for row in rows {
145+
let result: String = row.get("plaintext");
146+
assert_eq!(plaintext, result);
147+
}
148+
}
149+
150+
#[tokio::test]
151+
async fn passthrough_insert_with_returning() {
152+
let client = connect_with_tls(PROXY).await;
153+
154+
clear().await;
155+
156+
// Setup data
157+
let id = id();
158+
let plaintext = "hello@cipherstash.com";
159+
160+
let sql = "INSERT INTO plaintext (id, plaintext) VALUES ($1, $2) RETURNING *";
161+
let rows = client.query(sql, &[&id, &plaintext]).await.unwrap();
162+
163+
assert_eq!(rows.len(), 1);
164+
165+
for row in rows {
166+
let result: String = row.get("plaintext");
167+
assert_eq!(plaintext, result);
168+
}
169+
}
170+
171+
#[tokio::test]
172+
async fn passthrough_select_with_cardinality() {
173+
let client = connect_with_tls(PROXY).await;
174+
175+
clear().await;
176+
177+
// Setup data
178+
let id_1 = id();
179+
let plaintext = "hello@cipherstash.com";
180+
181+
let sql = "INSERT INTO plaintext (id, plaintext) VALUES ($1, $2)";
182+
client.query(sql, &[&id_1, &plaintext]).await.unwrap();
183+
184+
let id_2 = id();
185+
186+
let sql = "INSERT INTO plaintext (id) VALUES ($1)";
187+
client.query(sql, &[&id_2]).await.unwrap();
188+
189+
let sql = "SELECT ARRAY_REMOVE(ARRAY_AGG(id), NULL), plaintext
190+
FROM plaintext
191+
WHERE CARDINALITY(ARRAY[1,2]) <> 0
192+
GROUP BY plaintext";
193+
194+
let rows = client.query(sql, &[]).await.unwrap();
195+
196+
assert_eq!(rows.len(), 2);
197+
}
198+
199+
#[tokio::test]
200+
async fn passthrough_delete_with_select() {
201+
let client = connect_with_tls(PROXY).await;
202+
203+
clear().await;
204+
205+
// Setup data
206+
let id_1 = id();
207+
let plaintext = "one@cipherstash.com";
208+
209+
let sql = "INSERT INTO plaintext (id, plaintext) VALUES ($1, $2)";
210+
client.query(sql, &[&id_1, &plaintext]).await.unwrap();
211+
212+
let id_2 = id();
213+
let plaintext = "two@cipherstash.com";
214+
215+
let sql = "INSERT INTO plaintext (id, plaintext) VALUES ($1, $2)";
216+
client.query(sql, &[&id_2, &plaintext]).await.unwrap();
217+
218+
let sql = "DELETE FROM plaintext
219+
WHERE id IN (SELECT id FROM plaintext WHERE plaintext = $1)";
220+
client.query(sql, &[&plaintext]).await.unwrap();
221+
222+
let sql = "SELECT * FROM plaintext WHERE plaintext = $1";
223+
let rows = client.query(sql, &[&plaintext]).await.unwrap();
224+
225+
assert_eq!(rows.len(), 0);
226+
}
82227
}

0 commit comments

Comments
 (0)