11mod common;
22
3- use common:: TestDatabase ;
3+ use common:: { MigrateCommand , TestDatabase } ;
44
55#[ tokio:: test]
66async fn run_reversible_migrations ( ) {
@@ -11,10 +11,10 @@ async fn run_reversible_migrations() {
1111 20230401000000 ,
1212 20230501000000 ,
1313 ] ;
14- // Without --target-version specified.k
14+ // Without --target-version specified.
1515 {
1616 let db = TestDatabase :: new ( "migrate_run_reversible_latest" , "migrations_reversible" ) ;
17- db. run_migration ( false , None , false ) . success ( ) ;
17+ db. run_migration ( MigrateCommand :: Run , None , false ) . success ( ) ;
1818 assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
1919 }
2020 // With --target-version specified.
@@ -25,17 +25,17 @@ async fn run_reversible_migrations() {
2525 ) ;
2626
2727 // Move to latest, explicitly specified.
28- db. run_migration ( false , Some ( 20230501000000 ) , false )
28+ db. run_migration ( MigrateCommand :: Run , Some ( 20230501000000 ) , false )
2929 . success ( ) ;
3030 assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
3131
3232 // Move to latest when we're already at the latest.
33- db. run_migration ( false , Some ( 20230501000000 ) , false )
33+ db. run_migration ( MigrateCommand :: Run , Some ( 20230501000000 ) , false )
3434 . success ( ) ;
3535 assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
3636
3737 // Upgrade to an old version.
38- db. run_migration ( false , Some ( 20230301000000 ) , false )
38+ db. run_migration ( MigrateCommand :: Run , Some ( 20230301000000 ) , false )
3939 . failure ( ) ;
4040 assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
4141 }
@@ -47,34 +47,34 @@ async fn run_reversible_migrations() {
4747 ) ;
4848
4949 // First version
50- db. run_migration ( false , Some ( 20230101000000 ) , false )
50+ db. run_migration ( MigrateCommand :: Run , Some ( 20230101000000 ) , false )
5151 . success ( ) ;
5252 assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
5353
5454 // Dry run upgrade to latest.
55- db. run_migration ( false , None , true ) . success ( ) ;
55+ db. run_migration ( MigrateCommand :: Run , None , true ) . success ( ) ;
5656 assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
5757
5858 // Dry run upgrade + 2
59- db. run_migration ( false , Some ( 20230301000000 ) , true )
59+ db. run_migration ( MigrateCommand :: Run , Some ( 20230301000000 ) , true )
6060 . success ( ) ;
6161 assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
6262
6363 // Upgrade to non-existent version.
64- db. run_migration ( false , Some ( 20230901000000999 ) , false )
64+ db. run_migration ( MigrateCommand :: Run , Some ( 20230901000000999 ) , false )
6565 . failure ( ) ;
6666 assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
6767
6868 // Upgrade + 1
69- db. run_migration ( false , Some ( 20230201000000 ) , false )
69+ db. run_migration ( MigrateCommand :: Run , Some ( 20230201000000 ) , false )
7070 . success ( ) ;
7171 assert_eq ! (
7272 db. applied_migrations( ) . await ,
7373 vec![ 20230101000000 , 20230201000000 ]
7474 ) ;
7575
7676 // Upgrade + 2
77- db. run_migration ( false , Some ( 20230401000000 ) , false )
77+ db. run_migration ( MigrateCommand :: Run , Some ( 20230401000000 ) , false )
7878 . success ( ) ;
7979 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..4 ] ) ;
8080 }
@@ -93,55 +93,139 @@ async fn revert_migrations() {
9393 // Without --target-version
9494 {
9595 let db = TestDatabase :: new ( "migrate_revert_incremental" , "migrations_reversible" ) ;
96- db. run_migration ( false , None , false ) . success ( ) ;
96+ db. run_migration ( MigrateCommand :: Run , None , false ) . success ( ) ;
9797
9898 // Dry-run
99- db. run_migration ( true , None , true ) . success ( ) ;
99+ db. run_migration ( MigrateCommand :: Revert , None , true )
100+ . success ( ) ;
100101 assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
101102
102103 // Downgrade one
103- db. run_migration ( true , None , false ) . success ( ) ;
104+ db. run_migration ( MigrateCommand :: Revert , None , false )
105+ . success ( ) ;
104106 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..4 ] ) ;
105107
106108 // Downgrade one
107- db. run_migration ( true , None , false ) . success ( ) ;
109+ db. run_migration ( MigrateCommand :: Revert , None , false )
110+ . success ( ) ;
108111 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..3 ] ) ;
109112 }
110113 // With --target-version
111114 {
112115 let db = TestDatabase :: new ( "migrate_revert_incremental" , "migrations_reversible" ) ;
113- db. run_migration ( false , None , false ) . success ( ) ;
116+ db. run_migration ( MigrateCommand :: Run , None , false ) . success ( ) ;
114117
115118 // Dry-run downgrade to version 3.
116- db. run_migration ( true , Some ( 20230301000000 ) , true ) . success ( ) ;
119+ db. run_migration ( MigrateCommand :: Revert , Some ( 20230301000000 ) , true )
120+ . success ( ) ;
117121 assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
118122
119123 // Downgrade to version 3.
120- db. run_migration ( true , Some ( 20230301000000 ) , false )
124+ db. run_migration ( MigrateCommand :: Revert , Some ( 20230301000000 ) , false )
121125 . success ( ) ;
122126 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..3 ] ) ;
123127
124128 // Try downgrading to the same version.
125- db. run_migration ( true , Some ( 20230301000000 ) , false )
129+ db. run_migration ( MigrateCommand :: Revert , Some ( 20230301000000 ) , false )
126130 . success ( ) ;
127131 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..3 ] ) ;
128132
129133 // Try downgrading to a newer version.
130- db. run_migration ( true , Some ( 20230401000000 ) , false )
134+ db. run_migration ( MigrateCommand :: Revert , Some ( 20230401000000 ) , false )
131135 . failure ( ) ;
132136 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..3 ] ) ;
133137
134138 // Try downgrading to a non-existent version.
135- db. run_migration ( true , Some ( 9999 ) , false ) . failure ( ) ;
139+ db. run_migration ( MigrateCommand :: Revert , Some ( 9999 ) , false )
140+ . failure ( ) ;
136141 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..3 ] ) ;
137142
138143 // Ensure we can still upgrade
139- db. run_migration ( false , Some ( 20230401000000 ) , false )
144+ db. run_migration ( MigrateCommand :: Run , Some ( 20230401000000 ) , false )
140145 . success ( ) ;
141146 assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..4 ] ) ;
142147
143148 // Downgrade to zero.
144- db. run_migration ( true , Some ( 0 ) , false ) . success ( ) ;
149+ db. run_migration ( MigrateCommand :: Revert , Some ( 0 ) , false )
150+ . success ( ) ;
145151 assert_eq ! ( db. applied_migrations( ) . await , vec![ ] as Vec <i64 >) ;
146152 }
147153}
154+ #[ tokio:: test]
155+ async fn skip_reversible_migrations ( ) {
156+ let all_migrations: Vec < i64 > = vec ! [
157+ 20230101000000 ,
158+ 20230201000000 ,
159+ 20230301000000 ,
160+ 20230401000000 ,
161+ 20230501000000 ,
162+ ] ;
163+ // Without --target-version specified.
164+ {
165+ let db = TestDatabase :: new ( "migrate_skip_reversible_latest" , "migrations_reversible" ) ;
166+ db. run_migration ( MigrateCommand :: Skip , None , false )
167+ . success ( ) ;
168+ assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
169+ }
170+ // With --target-version specified.
171+ {
172+ let db = TestDatabase :: new (
173+ "migrate_skip_reversible_latest_explicit" ,
174+ "migrations_reversible" ,
175+ ) ;
176+
177+ // Move to latest, explicitly specified.
178+ db. run_migration ( MigrateCommand :: Run , Some ( 20230501000000 ) , false )
179+ . success ( ) ;
180+ assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
181+
182+ // Skip to latest when we're already at the latest.
183+ db. run_migration ( MigrateCommand :: Skip , Some ( 20230501000000 ) , false )
184+ . success ( ) ;
185+ assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
186+
187+ // Upgrade to an old version.
188+ db. run_migration ( MigrateCommand :: Skip , Some ( 20230301000000 ) , false )
189+ . failure ( ) ;
190+ assert_eq ! ( db. applied_migrations( ) . await , all_migrations) ;
191+ }
192+ // With --target-version, incrementally upgrade.
193+ {
194+ let db = TestDatabase :: new (
195+ "migrate_skip_reversible_incremental" ,
196+ "migrations_reversible" ,
197+ ) ;
198+
199+ // Run first version
200+ db. run_migration ( MigrateCommand :: Run , Some ( 20230101000000 ) , false )
201+ . success ( ) ;
202+ assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
203+
204+ // Skip and dry run upgrade to latest.
205+ db. run_migration ( MigrateCommand :: Skip , None , true ) . success ( ) ;
206+ assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
207+
208+ // Skip and dry run upgrade + 2
209+ db. run_migration ( MigrateCommand :: Skip , Some ( 20230301000000 ) , true )
210+ . success ( ) ;
211+ assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
212+
213+ // Skip to to non-existent version.
214+ db. run_migration ( MigrateCommand :: Skip , Some ( 20230901000000999 ) , false )
215+ . failure ( ) ;
216+ assert_eq ! ( db. applied_migrations( ) . await , vec![ 20230101000000 ] ) ;
217+
218+ // Upgrade + 1
219+ db. run_migration ( MigrateCommand :: Run , Some ( 20230201000000 ) , false )
220+ . success ( ) ;
221+ assert_eq ! (
222+ db. applied_migrations( ) . await ,
223+ vec![ 20230101000000 , 20230201000000 ]
224+ ) ;
225+
226+ // Skip + 2
227+ db. run_migration ( MigrateCommand :: Skip , Some ( 20230401000000 ) , false )
228+ . success ( ) ;
229+ assert_eq ! ( db. applied_migrations( ) . await , all_migrations[ ..4 ] ) ;
230+ }
231+ }
0 commit comments