Skip to content

Commit 9047aec

Browse files
committed
more functora-tagged tests
1 parent 1efdadb commit 9047aec

File tree

2 files changed

+337
-0
lines changed

2 files changed

+337
-0
lines changed

rust/functora-tagged/tests/tagged.rs

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,162 @@ fn test_tagged_from_str() {
176176
_ => panic!("Expected Refine error"),
177177
}
178178
}
179+
180+
#[cfg(feature = "serde")]
181+
use serde::{Deserialize, Serialize};
182+
183+
#[cfg(feature = "serde")]
184+
#[test]
185+
fn test_serde_tagged_roundtrip() {
186+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
187+
struct Wrapper {
188+
tagged_value: TestTagged,
189+
}
190+
let original = Wrapper {
191+
tagged_value: TestTagged::new(100).unwrap(),
192+
};
193+
let toml = toml::to_string(&original).unwrap();
194+
let deserialized: Wrapper =
195+
toml::from_str(&toml).unwrap();
196+
assert_eq!(original, deserialized);
197+
assert_eq!(deserialized.tagged_value.rep(), &100);
198+
}
199+
200+
#[cfg(feature = "serde")]
201+
#[test]
202+
fn test_serde_tagged_invalid_refine() {
203+
#[derive(Deserialize, Debug)]
204+
struct Wrapper {
205+
tagged_value: TestTagged,
206+
}
207+
208+
let toml = r"tagged_value = -1";
209+
let err = toml::from_str::<Wrapper>(toml).unwrap_err();
210+
assert!(
211+
err.to_string().contains("MyRefineError"),
212+
"Unexpected failure: {err}"
213+
);
214+
215+
let toml_valid = r"tagged_value = 50";
216+
let wrapper: Wrapper =
217+
toml::from_str(toml_valid).unwrap();
218+
assert_eq!(wrapper.tagged_value.rep(), &50);
219+
}
220+
221+
#[cfg(feature = "diesel")]
222+
mod diesel_tests {
223+
use super::*;
224+
use diesel::Connection;
225+
use diesel::ExpressionMethods;
226+
use diesel::QueryDsl;
227+
use diesel::QueryableByName;
228+
use diesel::RunQueryDsl;
229+
use diesel::insert_into;
230+
use diesel::sql_query;
231+
use diesel::sql_types::Integer;
232+
use diesel::sqlite::SqliteConnection;
233+
use diesel::table;
234+
235+
table! {
236+
tagged_values (id) {
237+
id -> Integer,
238+
value -> Integer,
239+
}
240+
}
241+
242+
#[derive(QueryableByName, PartialEq, Debug)]
243+
struct TaggedRow {
244+
#[diesel(sql_type = Integer)]
245+
id: i32,
246+
#[diesel(sql_type = Integer)]
247+
value: TestTagged,
248+
}
249+
250+
fn memory_db() -> SqliteConnection {
251+
let mut conn =
252+
SqliteConnection::establish(":memory:")
253+
.unwrap_or_else(|_| {
254+
panic!("cannot create in-memory DB")
255+
});
256+
sql_query(
257+
"CREATE TABLE tagged_values (id INTEGER PRIMARY KEY AUTOINCREMENT, value INTEGER NOT NULL);",
258+
)
259+
.execute(&mut conn)
260+
.expect("failed to create table");
261+
conn
262+
}
263+
264+
#[test]
265+
fn test_diesel_tagged_queryable_success() {
266+
let mut conn = memory_db();
267+
let valid_tagged_value =
268+
TestTagged::new(100).unwrap();
269+
270+
insert_into(tagged_values::table)
271+
.values((tagged_values::value
272+
.eq(&valid_tagged_value),))
273+
.execute(&mut conn)
274+
.unwrap();
275+
276+
let rows: Vec<TaggedRow> = sql_query(
277+
"SELECT id, value FROM tagged_values",
278+
)
279+
.load(&mut conn)
280+
.unwrap();
281+
282+
assert_eq!(rows.len(), 1);
283+
assert_eq!(rows[0].value, valid_tagged_value);
284+
assert_eq!(rows[0].value.rep(), &100);
285+
}
286+
287+
#[test]
288+
fn test_diesel_tagged_queryable_refine_failure() {
289+
let mut conn = memory_db();
290+
291+
let insert_result = sql_query(
292+
"INSERT INTO tagged_values (value) VALUES (?)",
293+
)
294+
.bind::<Integer, _>(-5i32)
295+
.execute(&mut conn);
296+
assert!(
297+
insert_result.is_ok(),
298+
"Insert statement failed unexpectedly"
299+
);
300+
301+
let err = sql_query(
302+
"SELECT id, value FROM tagged_values",
303+
)
304+
.load::<TaggedRow>(&mut conn)
305+
.unwrap_err();
306+
307+
let err_msg = err.to_string();
308+
assert!(
309+
err_msg.contains("MyRefineError"),
310+
"Expected MyRefineError, but got: {err_msg}"
311+
);
312+
}
313+
314+
#[test]
315+
fn test_diesel_tagged_to_sql() {
316+
let mut conn = memory_db();
317+
let tagged_value = TestTagged::new(150).unwrap();
318+
319+
insert_into(tagged_values::table)
320+
.values((
321+
tagged_values::value.eq(&tagged_value),
322+
))
323+
.execute(&mut conn)
324+
.unwrap();
325+
326+
let rows: Vec<(i32, i32)> = tagged_values::table
327+
.select((
328+
tagged_values::id,
329+
tagged_values::value,
330+
))
331+
.load(&mut conn)
332+
.unwrap();
333+
334+
assert_eq!(rows.len(), 1);
335+
assert_eq!(rows[0].1, 150);
336+
}
337+
}

rust/functora-tagged/tests/via_string.rs

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,181 @@ fn test_via_string_from_str() {
194194
_ => panic!("Expected Refine error"),
195195
}
196196
}
197+
198+
#[cfg(feature = "serde")]
199+
use serde::{Deserialize, Serialize};
200+
201+
#[cfg(feature = "serde")]
202+
#[test]
203+
fn test_serde_via_string_roundtrip() {
204+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
205+
struct Wrapper {
206+
via_string_value: TestViaString,
207+
}
208+
let original = Wrapper {
209+
via_string_value: TestViaString::new(
210+
"valid_serde_test".to_string(),
211+
)
212+
.unwrap(),
213+
};
214+
let toml = toml::to_string(&original).unwrap();
215+
let deserialized: Wrapper =
216+
toml::from_str(&toml).unwrap();
217+
assert_eq!(original, deserialized);
218+
assert_eq!(
219+
deserialized.via_string_value.rep(),
220+
"valid_serde_test"
221+
);
222+
}
223+
224+
#[cfg(feature = "serde")]
225+
#[test]
226+
fn test_serde_via_string_invalid_refine() {
227+
#[derive(Deserialize, Debug)]
228+
struct Wrapper {
229+
via_string_value: TestViaString,
230+
}
231+
232+
let toml = r#"via_string_value = "invalid_string""#;
233+
let err = toml::from_str::<Wrapper>(toml).unwrap_err();
234+
assert!(
235+
err.to_string().contains("MyRefineError"),
236+
"Unexpected failure: {err}"
237+
);
238+
239+
let toml_valid =
240+
r#"via_string_value = "valid_serde_refine""#;
241+
let wrapper: Wrapper =
242+
toml::from_str(toml_valid).unwrap();
243+
assert_eq!(
244+
wrapper.via_string_value.rep(),
245+
"valid_serde_refine"
246+
);
247+
}
248+
249+
#[cfg(feature = "diesel")]
250+
mod diesel_tests {
251+
use super::*;
252+
use diesel::Connection;
253+
use diesel::ExpressionMethods;
254+
use diesel::QueryDsl;
255+
use diesel::QueryableByName;
256+
use diesel::RunQueryDsl;
257+
use diesel::SqliteConnection;
258+
use diesel::insert_into;
259+
use diesel::sql_query;
260+
use diesel::sql_types::Integer;
261+
use diesel::sql_types::Text;
262+
use diesel::table;
263+
264+
table! {
265+
via_string_values (id) {
266+
id -> Integer,
267+
value -> Text,
268+
}
269+
}
270+
271+
#[derive(QueryableByName, PartialEq, Debug)]
272+
struct ViaStringRow {
273+
#[diesel(sql_type = Integer)]
274+
id: i32,
275+
#[diesel(sql_type = Text)]
276+
value: TestViaString,
277+
}
278+
279+
fn memory_db() -> SqliteConnection {
280+
let mut conn =
281+
SqliteConnection::establish(":memory:")
282+
.unwrap_or_else(|_| {
283+
panic!("cannot create in-memory DB")
284+
});
285+
sql_query(
286+
"CREATE TABLE via_string_values (id INTEGER PRIMARY KEY AUTOINCREMENT, value TEXT NOT NULL);",
287+
)
288+
.execute(&mut conn)
289+
.expect("failed to create table");
290+
conn
291+
}
292+
293+
#[test]
294+
fn test_diesel_via_string_queryable_success() {
295+
let mut conn = memory_db();
296+
let valid_via_string_value = TestViaString::new(
297+
"valid_diesel_test".to_string(),
298+
)
299+
.unwrap();
300+
301+
insert_into(via_string_values::table)
302+
.values((via_string_values::value
303+
.eq(&valid_via_string_value),))
304+
.execute(&mut conn)
305+
.unwrap();
306+
307+
let rows: Vec<ViaStringRow> = sql_query(
308+
"SELECT id, value FROM via_string_values",
309+
)
310+
.load(&mut conn)
311+
.unwrap();
312+
313+
assert_eq!(rows.len(), 1);
314+
assert_eq!(rows[0].value, valid_via_string_value);
315+
assert_eq!(
316+
rows[0].value.rep(),
317+
"valid_diesel_test"
318+
);
319+
}
320+
321+
#[test]
322+
fn test_diesel_via_string_queryable_refine_failure() {
323+
let mut conn = memory_db();
324+
325+
let insert_result = sql_query(
326+
"INSERT INTO via_string_values (value) VALUES (?)",
327+
)
328+
.bind::<Text, _>("invalid_string")
329+
.execute(&mut conn);
330+
assert!(
331+
insert_result.is_ok(),
332+
"Insert statement failed unexpectedly"
333+
);
334+
335+
let err = sql_query(
336+
"SELECT id, value FROM via_string_values",
337+
)
338+
.load::<ViaStringRow>(&mut conn)
339+
.unwrap_err();
340+
341+
let err_msg = err.to_string();
342+
assert!(
343+
err_msg.contains("MyRefineError"),
344+
"Expected MyRefineError, but got: {err_msg}"
345+
);
346+
}
347+
348+
#[test]
349+
fn test_diesel_via_string_to_sql() {
350+
let mut conn = memory_db();
351+
let via_string_value = TestViaString::new(
352+
"valid_to_sql_test".to_string(),
353+
)
354+
.unwrap();
355+
356+
insert_into(via_string_values::table)
357+
.values((via_string_values::value
358+
.eq(&via_string_value),))
359+
.execute(&mut conn)
360+
.unwrap();
361+
362+
let rows: Vec<(i32, String)> =
363+
via_string_values::table
364+
.select((
365+
via_string_values::id,
366+
via_string_values::value,
367+
))
368+
.load(&mut conn)
369+
.unwrap();
370+
371+
assert_eq!(rows.len(), 1);
372+
assert_eq!(rows[0].1, "valid_to_sql_test");
373+
}
374+
}

0 commit comments

Comments
 (0)