Skip to content

Commit 4ea7fe4

Browse files
committed
Clean up ignored tests
- Remove `#[ignore]` from tests that can now pass - Update failing tests to use `#[should_panic]` with expected messages - Fix test implementations to show DuckDB behavior - Remove useless tests copied from rusqlite
1 parent 5073edf commit 4ea7fe4

File tree

6 files changed

+23
-199
lines changed

6 files changed

+23
-199
lines changed

crates/duckdb/src/appender/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,8 @@ mod test {
208208
Ok(())
209209
}
210210

211-
// Waiting https://github.com/duckdb/duckdb/pull/3405
212211
#[cfg(feature = "uuid")]
213212
#[test]
214-
#[ignore = "not supported for now"]
215213
fn test_append_uuid() -> Result<()> {
216214
use uuid::Uuid;
217215

crates/duckdb/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -980,14 +980,13 @@ mod test {
980980
}
981981

982982
#[test]
983-
#[ignore = "not supported"]
984-
fn test_statement_debugging() -> Result<()> {
983+
#[should_panic(expected = "not supported")]
984+
fn test_statement_debugging() {
985985
let db = checked_memory_handle();
986986
let query = "SELECT 12345";
987-
let stmt = db.prepare(query)?;
987+
let stmt = db.prepare(query).unwrap();
988988

989989
assert!(format!("{stmt:?}").contains(query));
990-
Ok(())
991990
}
992991

993992
#[test]

crates/duckdb/src/pragma.rs

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -292,15 +292,13 @@ mod test {
292292
}
293293

294294
#[test]
295-
#[ignore = "not supported"]
296295
fn pragma_query_with_schema() -> Result<()> {
297296
let db = Connection::open_in_memory()?;
298-
let mut version = "".to_string();
299-
db.pragma_query(Some(DatabaseName::Main), "version", |row| {
300-
version = row.get(0)?;
301-
Ok(())
302-
})?;
303-
assert!(!version.is_empty());
297+
let res = db.pragma_query(Some(DatabaseName::Main), "version", |_| Ok(()));
298+
assert_eq!(
299+
res.unwrap_err().to_string().lines().next().unwrap(),
300+
"Parser Error: syntax error at or near \".\""
301+
);
304302
Ok(())
305303
}
306304

@@ -324,12 +322,10 @@ mod test {
324322
}
325323

326324
#[test]
327-
#[ignore = "don't support query pragma"]
328325
fn test_pragma_update_and_check() -> Result<()> {
329326
let db = Connection::open_in_memory()?;
330-
let journal_mode: String =
331-
db.pragma_update_and_check(None, "explain_output", &"OPTIMIZED_ONLY", |row| row.get(0))?;
332-
assert_eq!("OPTIMIZED_ONLY", &journal_mode);
327+
let res = db.pragma_update_and_check(None, "explain_output", &"OPTIMIZED_ONLY", |_| Ok(()));
328+
assert_eq!(res.unwrap_err(), crate::Error::QueryReturnedNoRows);
333329
Ok(())
334330
}
335331

@@ -354,11 +350,4 @@ mod test {
354350
sql.push_string_literal("value'; --");
355351
assert_eq!("'value''; --'", sql.as_str());
356352
}
357-
358-
#[test]
359-
#[ignore]
360-
fn test_locking_mode() -> Result<()> {
361-
let db = Connection::open_in_memory()?;
362-
db.pragma_update(None, "locking_mode", &"exclusive")
363-
}
364353
}

crates/duckdb/src/statement.rs

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,6 @@ mod test {
980980
}
981981

982982
#[test]
983-
#[ignore]
984983
fn test_bind_parameters() -> Result<()> {
985984
let db = Connection::open_in_memory()?;
986985
// dynamic slice:
@@ -995,8 +994,8 @@ mod test {
995994
})?;
996995
db.query_row("SELECT ?1, ?2, ?3", params_from_iter(data), |row| row.get::<_, u8>(0))?;
997996

998-
use std::collections::BTreeSet;
999-
let data: BTreeSet<String> = ["one", "two", "three"].iter().map(|s| (*s).to_string()).collect();
997+
let data: std::collections::BTreeSet<String> =
998+
["one", "two", "three"].iter().map(|s| (*s).to_string()).collect();
1000999
db.query_row("SELECT ?1, ?2, ?3", params_from_iter(&data), |row| {
10011000
row.get::<_, String>(0)
10021001
})?;
@@ -1035,22 +1034,6 @@ mod test {
10351034
}
10361035

10371036
#[test]
1038-
#[ignore]
1039-
fn test_utf16_conversion() -> Result<()> {
1040-
let db = Connection::open_in_memory()?;
1041-
db.pragma_update(None, "encoding", &"UTF-16le")?;
1042-
let encoding: String = db.pragma_query_value(None, "encoding", |row| row.get(0))?;
1043-
assert_eq!("UTF-16le", encoding);
1044-
db.execute_batch("CREATE TABLE foo(x TEXT)")?;
1045-
let expected = "テスト";
1046-
db.execute("INSERT INTO foo(x) VALUES (?)", [&expected])?;
1047-
let actual: String = db.query_row("SELECT x FROM foo", [], |row| row.get(0))?;
1048-
assert_eq!(expected, actual);
1049-
Ok(())
1050-
}
1051-
1052-
#[test]
1053-
#[ignore]
10541037
fn test_nul_byte() -> Result<()> {
10551038
let db = Connection::open_in_memory()?;
10561039
let expected = "a\x00b";

crates/duckdb/src/types/chrono.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ impl ToSql for Duration {
174174
#[cfg(test)]
175175
mod test {
176176
use crate::{
177-
types::{FromSql, ToSql, ToSqlOutput, ValueRef},
177+
types::{FromSql, FromSqlError, ToSql, ToSqlOutput, ValueRef},
178178
Connection, Result,
179179
};
180180
use chrono::{DateTime, Duration, Local, NaiveDate, NaiveDateTime, NaiveTime, TimeDelta, TimeZone, Utc};
@@ -349,9 +349,15 @@ mod test {
349349
}
350350

351351
#[test]
352-
#[ignore]
353352
fn test_lenient_parse_timezone() {
354-
assert!(DateTime::<Utc>::column_result(ValueRef::Text(b"1970-01-01T00:00:00Z")).is_ok());
355-
assert!(DateTime::<Utc>::column_result(ValueRef::Text(b"1970-01-01T00:00:00+00")).is_ok());
353+
// Not supported
354+
assert!(matches!(
355+
DateTime::<Utc>::column_result(ValueRef::Text(b"1970-01-01T00:00:00Z")),
356+
Err(FromSqlError::Other(_))
357+
));
358+
assert!(matches!(
359+
DateTime::<Utc>::column_result(ValueRef::Text(b"1970-01-01T00:00:00+00")),
360+
Err(FromSqlError::Other(_))
361+
));
356362
}
357363
}

crates/duckdb/src/types/mod.rs

Lines changed: 1 addition & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,7 @@ impl fmt::Display for Type {
197197
#[cfg(test)]
198198
mod test {
199199
use super::Value;
200-
use crate::{params, Connection, Error, Result, Statement};
201-
use std::os::raw::{c_double, c_int};
200+
use crate::{Connection, Result};
202201

203202
fn checked_memory_handle() -> Result<Connection> {
204203
let db = Connection::open_in_memory()?;
@@ -298,69 +297,6 @@ mod test {
298297
Ok(())
299298
}
300299

301-
#[test]
302-
#[allow(clippy::cognitive_complexity)]
303-
#[ignore = "duckdb doesn't support this"]
304-
fn test_mismatched_types() -> Result<()> {
305-
fn is_invalid_column_type(err: Error) -> bool {
306-
matches!(err, Error::InvalidColumnType(..))
307-
}
308-
309-
let db = checked_memory_handle()?;
310-
311-
db.execute("INSERT INTO foo(b, t, i, f) VALUES (X'0102', 'text', 1, 1.5)", [])?;
312-
313-
let mut stmt = db.prepare("SELECT b, t, i, f, n FROM foo")?;
314-
let mut rows = stmt.query([])?;
315-
let row = rows.next()?.unwrap();
316-
317-
// check the correct types come back as expected
318-
assert_eq!(vec![1, 2], row.get::<_, Vec<u8>>(0)?);
319-
assert_eq!("text", row.get::<_, String>(1)?);
320-
assert_eq!(1, row.get::<_, c_int>(2)?);
321-
assert!((1.5 - row.get::<_, c_double>(3)?).abs() < f64::EPSILON);
322-
assert_eq!(row.get::<_, Option<c_int>>(4)?, None);
323-
assert_eq!(row.get::<_, Option<c_double>>(4)?, None);
324-
assert_eq!(row.get::<_, Option<String>>(4)?, None);
325-
326-
// check some invalid types
327-
328-
// 0 is actually a blob (Vec<u8>)
329-
assert!(is_invalid_column_type(row.get::<_, c_int>(0).err().unwrap()));
330-
assert!(is_invalid_column_type(row.get::<_, c_int>(0).err().unwrap()));
331-
assert!(is_invalid_column_type(row.get::<_, i64>(0).err().unwrap()));
332-
assert!(is_invalid_column_type(row.get::<_, c_double>(0).err().unwrap()));
333-
assert!(is_invalid_column_type(row.get::<_, String>(0).err().unwrap()));
334-
assert!(is_invalid_column_type(row.get::<_, Option<c_int>>(0).err().unwrap()));
335-
336-
// 1 is actually a text (String)
337-
assert!(is_invalid_column_type(row.get::<_, c_int>(1).err().unwrap()));
338-
assert!(is_invalid_column_type(row.get::<_, i64>(1).err().unwrap()));
339-
assert!(is_invalid_column_type(row.get::<_, c_double>(1).err().unwrap()));
340-
assert!(is_invalid_column_type(row.get::<_, Vec<u8>>(1).err().unwrap()));
341-
assert!(is_invalid_column_type(row.get::<_, Option<c_int>>(1).err().unwrap()));
342-
343-
// 2 is actually an integer
344-
assert!(is_invalid_column_type(row.get::<_, String>(2).err().unwrap()));
345-
assert!(is_invalid_column_type(row.get::<_, Vec<u8>>(2).err().unwrap()));
346-
assert!(is_invalid_column_type(row.get::<_, Option<String>>(2).err().unwrap()));
347-
348-
// 3 is actually a float (c_double)
349-
assert!(is_invalid_column_type(row.get::<_, c_int>(3).err().unwrap()));
350-
assert!(is_invalid_column_type(row.get::<_, i64>(3).err().unwrap()));
351-
assert!(is_invalid_column_type(row.get::<_, String>(3).err().unwrap()));
352-
assert!(is_invalid_column_type(row.get::<_, Vec<u8>>(3).err().unwrap()));
353-
assert!(is_invalid_column_type(row.get::<_, Option<c_int>>(3).err().unwrap()));
354-
355-
// 4 is actually NULL
356-
assert!(is_invalid_column_type(row.get::<_, c_int>(4).err().unwrap()));
357-
assert!(is_invalid_column_type(row.get::<_, i64>(4).err().unwrap()));
358-
assert!(is_invalid_column_type(row.get::<_, c_double>(4).err().unwrap()));
359-
assert!(is_invalid_column_type(row.get::<_, String>(4).err().unwrap()));
360-
assert!(is_invalid_column_type(row.get::<_, Vec<u8>>(4).err().unwrap()));
361-
Ok(())
362-
}
363-
364300
#[test]
365301
fn test_dynamic_type() -> Result<()> {
366302
use super::Value;
@@ -383,91 +319,4 @@ mod test {
383319
assert_eq!(Value::Null, row.get::<_, Value>(4)?);
384320
Ok(())
385321
}
386-
387-
macro_rules! test_conversion {
388-
($db_etc:ident, $insert_value:expr, $get_type:ty,expect $expected_value:expr) => {
389-
$db_etc.insert_statement.execute(params![$insert_value])?;
390-
let res = $db_etc
391-
.query_statement
392-
.query_row([], |row| row.get::<_, $get_type>(0));
393-
assert_eq!(res?, $expected_value);
394-
$db_etc.delete_statement.execute([])?;
395-
};
396-
($db_etc:ident, $insert_value:expr, $get_type:ty,expect_from_sql_error) => {
397-
$db_etc.insert_statement.execute(params![$insert_value])?;
398-
let res = $db_etc
399-
.query_statement
400-
.query_row([], |row| row.get::<_, $get_type>(0));
401-
res.unwrap_err();
402-
$db_etc.delete_statement.execute([])?;
403-
};
404-
($db_etc:ident, $insert_value:expr, $get_type:ty,expect_to_sql_error) => {
405-
$db_etc
406-
.insert_statement
407-
.execute(params![$insert_value])
408-
.unwrap_err();
409-
};
410-
}
411-
412-
#[test]
413-
#[ignore = "duckdb doesn't support this"]
414-
fn test_numeric_conversions() -> Result<()> {
415-
#![allow(clippy::float_cmp)]
416-
417-
// Test what happens when we store an f32 and retrieve an i32 etc.
418-
let db = Connection::open_in_memory()?;
419-
db.execute_batch("CREATE TABLE foo (x)")?;
420-
421-
// DuckDB actually ignores the column types, so we just need to test
422-
// different numeric values.
423-
424-
struct DbEtc<'conn> {
425-
insert_statement: Statement<'conn>,
426-
query_statement: Statement<'conn>,
427-
delete_statement: Statement<'conn>,
428-
}
429-
430-
let mut db_etc = DbEtc {
431-
insert_statement: db.prepare("INSERT INTO foo VALUES (?1)")?,
432-
query_statement: db.prepare("SELECT x FROM foo")?,
433-
delete_statement: db.prepare("DELETE FROM foo")?,
434-
};
435-
436-
// Basic non-converting test.
437-
test_conversion!(db_etc, 0u8, u8, expect 0u8);
438-
439-
// In-range integral conversions.
440-
test_conversion!(db_etc, 100u8, i8, expect 100i8);
441-
test_conversion!(db_etc, 200u8, u8, expect 200u8);
442-
test_conversion!(db_etc, 100u16, i8, expect 100i8);
443-
test_conversion!(db_etc, 200u16, u8, expect 200u8);
444-
test_conversion!(db_etc, u32::MAX, u64, expect u32::MAX as u64);
445-
test_conversion!(db_etc, i64::MIN, i64, expect i64::MIN);
446-
test_conversion!(db_etc, i64::MAX, i64, expect i64::MAX);
447-
test_conversion!(db_etc, i64::MAX, u64, expect i64::MAX as u64);
448-
test_conversion!(db_etc, 100usize, usize, expect 100usize);
449-
test_conversion!(db_etc, 100u64, u64, expect 100u64);
450-
test_conversion!(db_etc, i64::MAX as u64, u64, expect i64::MAX as u64);
451-
452-
// Out-of-range integral conversions.
453-
test_conversion!(db_etc, 200u8, i8, expect_from_sql_error);
454-
test_conversion!(db_etc, 400u16, i8, expect_from_sql_error);
455-
test_conversion!(db_etc, 400u16, u8, expect_from_sql_error);
456-
test_conversion!(db_etc, -1i8, u8, expect_from_sql_error);
457-
test_conversion!(db_etc, i64::MIN, u64, expect_from_sql_error);
458-
test_conversion!(db_etc, u64::MAX, i64, expect_to_sql_error);
459-
test_conversion!(db_etc, u64::MAX, u64, expect_to_sql_error);
460-
test_conversion!(db_etc, i64::MAX as u64 + 1, u64, expect_to_sql_error);
461-
462-
// FromSql integer to float, always works.
463-
test_conversion!(db_etc, i64::MIN, f32, expect i64::MIN as f32);
464-
test_conversion!(db_etc, i64::MAX, f32, expect i64::MAX as f32);
465-
test_conversion!(db_etc, i64::MIN, f64, expect i64::MIN as f64);
466-
test_conversion!(db_etc, i64::MAX, f64, expect i64::MAX as f64);
467-
468-
// FromSql float to int conversion, never works even if the actual value
469-
// is an integer.
470-
test_conversion!(db_etc, 0f64, i64, expect_from_sql_error);
471-
Ok(())
472-
}
473322
}

0 commit comments

Comments
 (0)