Skip to content

Commit d9c2fce

Browse files
committed
test: refactor tests, adding downward migrations
This will also be useful when we introduce optional validation of downward migrations (#113)
1 parent abfc3dc commit d9c2fce

File tree

4 files changed

+166
-53
lines changed

4 files changed

+166
-53
lines changed

rusqlite_migration/src/tests/core.rs

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@ use std::{iter::FromIterator, num::NonZeroUsize};
1717

1818
use rusqlite::{Connection, OpenFlags, Transaction};
1919

20+
use crate::tests::helpers::all_valid_down;
2021
use crate::{
2122
tests::helpers::{
22-
all_valid, m_invalid_down_fk, m_invalid_fk, m_valid0, m_valid10, m_valid11, m_valid_fk,
23+
all_valid_up, m_invalid_fk, m_invalid_fk_down, m_valid0_up, m_valid10_up, m_valid11_up,
24+
m_valid_fk_up,
2325
},
2426
user_version, Error, MigrationDefinitionError, Migrations, SchemaVersion, SchemaVersionError,
2527
M,
2628
};
2729

28-
use super::helpers::{m_invalid0, m_invalid1, m_valid20, m_valid21, raw_set_user_version};
30+
use super::helpers::{m_invalid0, m_invalid1, m_valid20_up, m_valid21_up, raw_set_user_version};
2931

3032
#[test]
3133
fn max_migration_test() {
@@ -129,7 +131,7 @@ fn test_db_version_to_schema_empty() {
129131

130132
#[test]
131133
fn test_db_version_to_schema_two() {
132-
let m = Migrations::new(vec![m_valid10(), m_valid11()]);
134+
let m = Migrations::new(vec![m_valid10_up(), m_valid11_up()]);
133135

134136
assert_eq!(m.db_version_to_schema(0), SchemaVersion::NoneSet);
135137
assert_eq!(
@@ -186,7 +188,7 @@ fn test_migration_hook_debug() {
186188
#[test]
187189
fn user_version_convert_test() {
188190
let mut conn = Connection::open_in_memory().unwrap();
189-
let migrations = Migrations::new(vec![m_valid10()]);
191+
let migrations = Migrations::new(vec![m_valid10_up()]);
190192
assert_eq!(Ok(()), migrations.to_latest(&mut conn));
191193
assert_eq!(Ok(1), user_version(&conn));
192194
assert_eq!(
@@ -199,7 +201,7 @@ fn user_version_convert_test() {
199201
#[test]
200202
fn user_version_migrate_test() {
201203
let mut conn = Connection::open_in_memory().unwrap();
202-
let migrations = Migrations::new(vec![m_valid10()]);
204+
let migrations = Migrations::new(vec![m_valid10_up()]);
203205

204206
assert_eq!(Ok(0), user_version(&conn));
205207

@@ -210,7 +212,7 @@ fn user_version_migrate_test() {
210212
migrations.current_version(&conn)
211213
);
212214

213-
let migrations = Migrations::new(vec![m_valid10(), m_valid11()]);
215+
let migrations = Migrations::new(vec![m_valid10_up(), m_valid11_up()]);
214216
assert_eq!(Ok(()), migrations.to_latest(&mut conn));
215217
assert_eq!(Ok(2), user_version(&conn));
216218
assert_eq!(
@@ -237,15 +239,15 @@ fn user_version_start_0_test() {
237239

238240
#[test]
239241
fn invalid_migration_statement_test() {
240-
for m in &[m_invalid0(), m_invalid1(), m_valid11(), m_valid21()] {
242+
for m in &[m_invalid0(), m_invalid1(), m_valid11_up(), m_valid21_up()] {
241243
let migrations = Migrations::new(vec![m.clone()]);
242244
assert_ne!(Ok(()), migrations.validate())
243245
}
244246
}
245247

246248
#[test]
247249
fn invalid_migration_multiple_statement_test() {
248-
let migrations = Migrations::new(vec![m_valid0(), m_invalid1()]);
250+
let migrations = Migrations::new(vec![m_valid0_up(), m_invalid1()]);
249251
assert!(matches!(
250252
dbg!(migrations.validate()),
251253
Err(Error::RusqliteError { query: _, err: _ })
@@ -254,15 +256,15 @@ fn invalid_migration_multiple_statement_test() {
254256

255257
#[test]
256258
fn valid_migration_multiple_statement_test() {
257-
for m in &[m_valid0(), m_valid10(), m_valid20()] {
259+
for m in &[m_valid0_up(), m_valid10_up(), m_valid20_up()] {
258260
let migrations = Migrations::new(vec![m.clone()]);
259261
assert_eq!(Ok(()), migrations.validate())
260262
}
261263
}
262264

263265
#[test]
264266
fn valid_fk_check_test() {
265-
assert_eq!(Ok(()), Migrations::new(vec![m_valid_fk()]).validate())
267+
assert_eq!(Ok(()), Migrations::new(vec![m_valid_fk_up()]).validate())
266268
}
267269

268270
#[test]
@@ -273,7 +275,7 @@ fn invalid_fk_check_test() {
273275

274276
#[test]
275277
fn invalid_down_fk_check_test() {
276-
let migrations = Migrations::new(vec![m_invalid_down_fk()]);
278+
let migrations = Migrations::new(vec![m_invalid_fk_down()]);
277279

278280
let mut conn = Connection::open_in_memory().unwrap();
279281
migrations.to_latest(&mut conn).unwrap();
@@ -285,8 +287,15 @@ fn invalid_down_fk_check_test() {
285287
}
286288

287289
#[test]
288-
fn all_valid_test() {
289-
let migrations = Migrations::new(all_valid());
290+
fn all_valid_up_test() {
291+
let migrations = Migrations::new(all_valid_up());
292+
assert_eq!(Ok(()), migrations.validate());
293+
insta::assert_debug_snapshot!(migrations)
294+
}
295+
296+
#[test]
297+
fn all_valid_down_test() {
298+
let migrations = Migrations::new(all_valid_down());
290299
assert_eq!(Ok(()), migrations.validate());
291300
insta::assert_debug_snapshot!(migrations)
292301
}
@@ -295,7 +304,7 @@ fn all_valid_test() {
295304
#[test]
296305
fn test_read_only_db_all_valid() {
297306
let mut conn = Connection::open_in_memory_with_flags(OpenFlags::SQLITE_OPEN_READ_ONLY).unwrap();
298-
let migrations = Migrations::new(all_valid());
307+
let migrations = Migrations::new(all_valid_up());
299308

300309
let e = migrations.to_latest(&mut conn);
301310

@@ -312,12 +321,12 @@ fn current_version_gt_max_schema_version_test() {
312321

313322
// Set migrations to a higher number
314323
{
315-
let migrations = Migrations::new(vec![m_valid0(), m_valid10()]);
324+
let migrations = Migrations::new(vec![m_valid0_up(), m_valid10_up()]);
316325
migrations.to_latest(&mut conn).unwrap();
317326
}
318327

319328
// We now have fewer migrations
320-
let migrations = Migrations::new(vec![m_valid0()]);
329+
let migrations = Migrations::new(vec![m_valid0_up()]);
321330

322331
// We should get an error
323332
assert_eq!(
@@ -456,7 +465,7 @@ fn eq_hook_test() {
456465

457466
#[test]
458467
fn test_from_iter() {
459-
let migrations = Migrations::from_iter(vec![m_valid0(), m_valid10()]);
468+
let migrations = Migrations::from_iter(vec![m_valid0_up(), m_valid10_up()]);
460469
assert_eq!(Ok(()), migrations.validate());
461470
}
462471

@@ -498,18 +507,18 @@ fn test_missing_down_migration() {
498507
fn test_build_from_cow() {
499508
use std::borrow::Cow;
500509

501-
let _ = Migrations::from_slice(&Cow::from(vec![m_valid0()]));
510+
let _ = Migrations::from_slice(&Cow::from(vec![m_valid0_up()]));
502511
}
503512

504513
#[test]
505514
fn test_pending_migrations() -> Result<(), Box<dyn std::error::Error>> {
506515
let ms = vec![
507-
m_valid0(),
508-
m_valid10(),
509-
m_valid11(),
510-
m_valid20(),
511-
m_valid21(),
512-
m_valid_fk(),
516+
m_valid0_up(),
517+
m_valid10_up(),
518+
m_valid11_up(),
519+
m_valid20_up(),
520+
m_valid21_up(),
521+
m_valid_fk_up(),
513522
];
514523
let migrations_0 = Migrations::from_slice(&[]);
515524
let migrations_1 = Migrations::from_slice(&ms[..1]);
@@ -553,7 +562,7 @@ fn test_pending_migrations() -> Result<(), Box<dyn std::error::Error>> {
553562
fn test_pending_migrations_errors() -> Result<(), Box<dyn std::error::Error>> {
554563
let mut conn = Connection::open_in_memory()?;
555564

556-
let migrations = Migrations::new(vec![m_valid0(), m_valid10()]);
565+
let migrations = Migrations::new(vec![m_valid0_up(), m_valid10_up()]);
557566

558567
// If the database is somehow corrupted, this returns an error
559568
raw_set_user_version(&mut conn, -325);

rusqlite_migration/src/tests/helpers.rs

Lines changed: 61 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,41 @@ pub fn raw_set_user_version(conn: &mut Connection, version: isize) {
2323
conn.pragma_update(None, "user_version", version).unwrap()
2424
}
2525

26-
pub fn m_valid0() -> M<'static> {
26+
pub fn m_valid0_up() -> M<'static> {
2727
M::up("CREATE TABLE m1(a, b); CREATE TABLE m2(a, b, c);")
2828
}
29-
pub fn m_valid10() -> M<'static> {
29+
pub fn m_valid0_down() -> M<'static> {
30+
m_valid0_up().down("DROP TABLE m1; DROP TABLE m2;")
31+
}
32+
pub fn m_valid10_up() -> M<'static> {
3033
M::up("CREATE TABLE t1(a, b);")
3134
}
32-
pub fn m_valid11() -> M<'static> {
35+
pub fn m_valid10_down() -> M<'static> {
36+
m_valid10_up().down("DROP TABLE t1;")
37+
}
38+
39+
pub fn m_valid11_down() -> M<'static> {
40+
m_valid11_up().down("ALTER TABLE t1 RENAME COLUMN c TO b;")
41+
}
42+
43+
pub fn m_valid20_down() -> M<'static> {
44+
m_valid20_up().down("DROP TABLE t2;")
45+
}
46+
47+
pub fn m_valid21_down() -> M<'static> {
48+
m_valid21_up().down("ALTER TABLE t2 DROP COLUMN a;")
49+
}
50+
pub fn m_valid11_up() -> M<'static> {
3351
M::up("ALTER TABLE t1 RENAME COLUMN b TO c;")
3452
}
35-
pub fn m_valid20() -> M<'static> {
53+
pub fn m_valid20_up() -> M<'static> {
3654
M::up("CREATE TABLE t2(b);")
3755
}
38-
pub fn m_valid21() -> M<'static> {
56+
pub fn m_valid21_up() -> M<'static> {
3957
M::up("ALTER TABLE t2 ADD COLUMN a;")
4058
}
4159

42-
pub fn m_valid_fk() -> M<'static> {
60+
pub fn m_valid_fk_up() -> M<'static> {
4361
M::up(
4462
r#"
4563
CREATE TABLE fk1(a PRIMARY KEY);
@@ -54,31 +72,31 @@ pub fn m_valid_fk() -> M<'static> {
5472
.foreign_key_check()
5573
}
5674

57-
pub fn m_invalid_down_fk() -> M<'static> {
58-
M::up(
59-
r#"
60-
CREATE TABLE fk1(a PRIMARY KEY);
61-
CREATE TABLE fk2(
62-
a,
63-
FOREIGN KEY(a) REFERENCES fk1(a)
64-
);
65-
INSERT INTO fk1 (a) VALUES ('foo');
66-
INSERT INTO fk2 (a) VALUES ('foo');
67-
"#,
68-
)
69-
.foreign_key_check()
70-
.down("DROP TABLE fk1;")
75+
pub fn m_valid_fk_down() -> M<'static> {
76+
m_valid_fk_up().down("DELETE FROM fk2; DELETE FROM fk1; DROP TABLE fk2; DROP TABLE fk1;")
77+
}
78+
79+
// All valid upward Ms in the right order
80+
pub fn all_valid_up() -> Vec<M<'static>> {
81+
vec![
82+
m_valid0_up(),
83+
m_valid10_up(),
84+
m_valid11_up(),
85+
m_valid20_up(),
86+
m_valid21_up(),
87+
m_valid_fk_up(),
88+
]
7189
}
7290

7391
// All valid Ms in the right order
74-
pub fn all_valid() -> Vec<M<'static>> {
92+
pub fn all_valid_down() -> Vec<M<'static>> {
7593
vec![
76-
m_valid0(),
77-
m_valid10(),
78-
m_valid11(),
79-
m_valid20(),
80-
m_valid21(),
81-
m_valid_fk(),
94+
m_valid0_down(),
95+
m_valid10_down(),
96+
m_valid11_down(),
97+
m_valid20_down(),
98+
m_valid21_down(),
99+
m_valid_fk_down(),
82100
]
83101
}
84102

@@ -103,3 +121,19 @@ pub fn m_invalid_fk() -> M<'static> {
103121
)
104122
.foreign_key_check()
105123
}
124+
125+
pub fn m_invalid_fk_down() -> M<'static> {
126+
M::up(
127+
r#"
128+
CREATE TABLE fk1(a PRIMARY KEY);
129+
CREATE TABLE fk2(
130+
a,
131+
FOREIGN KEY(a) REFERENCES fk1(a)
132+
);
133+
INSERT INTO fk1 (a) VALUES ('foo');
134+
INSERT INTO fk2 (a) VALUES ('foo');
135+
"#,
136+
)
137+
.foreign_key_check()
138+
.down("DROP TABLE fk1;")
139+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
---
2+
source: rusqlite_migration/src/tests/core.rs
3+
expression: migrations
4+
snapshot_kind: text
5+
---
6+
Migrations {
7+
ms: [
8+
M {
9+
up: "CREATE TABLE m1(a, b); CREATE TABLE m2(a, b, c);",
10+
up_hook: None,
11+
down: Some(
12+
"DROP TABLE m1; DROP TABLE m2;",
13+
),
14+
down_hook: None,
15+
foreign_key_check: false,
16+
comment: None,
17+
},
18+
M {
19+
up: "CREATE TABLE t1(a, b);",
20+
up_hook: None,
21+
down: Some(
22+
"DROP TABLE t1;",
23+
),
24+
down_hook: None,
25+
foreign_key_check: false,
26+
comment: None,
27+
},
28+
M {
29+
up: "ALTER TABLE t1 RENAME COLUMN b TO c;",
30+
up_hook: None,
31+
down: Some(
32+
"ALTER TABLE t1 RENAME COLUMN c TO b;",
33+
),
34+
down_hook: None,
35+
foreign_key_check: false,
36+
comment: None,
37+
},
38+
M {
39+
up: "CREATE TABLE t2(b);",
40+
up_hook: None,
41+
down: Some(
42+
"DROP TABLE t2;",
43+
),
44+
down_hook: None,
45+
foreign_key_check: false,
46+
comment: None,
47+
},
48+
M {
49+
up: "ALTER TABLE t2 ADD COLUMN a;",
50+
up_hook: None,
51+
down: Some(
52+
"ALTER TABLE t2 DROP COLUMN a;",
53+
),
54+
down_hook: None,
55+
foreign_key_check: false,
56+
comment: None,
57+
},
58+
M {
59+
up: "\n CREATE TABLE fk1(a PRIMARY KEY);\n CREATE TABLE fk2(\n a,\n FOREIGN KEY(a) REFERENCES fk1(a)\n );\n INSERT INTO fk1 (a) VALUES ('foo');\n INSERT INTO fk2 (a) VALUES ('foo');\n ",
60+
up_hook: None,
61+
down: Some(
62+
"DELETE FROM fk2; DELETE FROM fk1; DROP TABLE fk2; DROP TABLE fk1;",
63+
),
64+
down_hook: None,
65+
foreign_key_check: true,
66+
comment: None,
67+
},
68+
],
69+
}

rusqlite_migration/src/tests/snapshots/rusqlite_migration__tests__core__all_valid_test.snap renamed to rusqlite_migration/src/tests/snapshots/rusqlite_migration__tests__core__all_valid_up_test.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
2-
source: rusqlite_migration/src/tests/synch.rs
2+
source: rusqlite_migration/src/tests/core.rs
33
expression: migrations
4+
snapshot_kind: text
45
---
56
Migrations {
67
ms: [

0 commit comments

Comments
 (0)