11#[ cfg( test) ]
22mod 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