@@ -242,6 +242,108 @@ fn test_migrate_v2_to_current() {
242242 } ) ;
243243}
244244
245+ #[ test]
246+ fn test_next_pk_and_indexes_after_migration ( ) {
247+ let runtime = tokio:: runtime:: Builder :: new_multi_thread ( )
248+ . worker_threads ( 2 )
249+ . enable_io ( )
250+ . enable_time ( )
251+ . build ( )
252+ . unwrap ( ) ;
253+
254+ runtime. block_on ( async {
255+ let src = "tests/data/migration/next_pk_after_migration" ;
256+ let dst = "tests/data/migration/next_pk_after_migration/dst" ;
257+ remove_dir_if_exists ( src. to_string ( ) ) . await ;
258+
259+ {
260+ let config = DiskConfig :: new_with_table_name (
261+ src,
262+ v2:: UserWorkTable :: name_snake_case ( ) ,
263+ v2:: UserWorkTable :: version ( ) ,
264+ ) ;
265+ let engine = v2:: UserPersistenceEngine :: new ( config) . await . unwrap ( ) ;
266+ let table = v2:: UserWorkTable :: load ( engine) . await . unwrap ( ) ;
267+
268+ table
269+ . insert ( v2:: UserRow {
270+ id : table. get_next_pk ( ) . into ( ) ,
271+ name : "Eve" . to_string ( ) ,
272+ email : "eve@test.com" . to_string ( ) ,
273+ } )
274+ . unwrap ( ) ;
275+ table
276+ . insert ( v2:: UserRow {
277+ id : table. get_next_pk ( ) . into ( ) ,
278+ name : "Frank" . to_string ( ) ,
279+ email : "frank@test.com" . to_string ( ) ,
280+ } )
281+ . unwrap ( ) ;
282+
283+ table. wait_for_ops ( ) . await ;
284+ }
285+
286+ let ctx = UserMigrationContext {
287+ default_email : "unknown@example.com" . to_string ( ) ,
288+ default_created_at : chrono:: Utc :: now ( ) . timestamp ( ) as u64 ,
289+ } ;
290+
291+ let report = UserMigrationEngine :: migrate ( src, dst, & ctx) . await . unwrap ( ) ;
292+ assert_eq ! ( report. source_version, v2:: UserWorkTable :: version( ) ) ;
293+
294+ let inserted = {
295+ let config =
296+ DiskConfig :: new_with_table_name ( dst, UserWorkTable :: name_snake_case ( ) , UserWorkTable :: version ( ) ) ;
297+ let engine = UserPersistenceEngine :: new ( config) . await . unwrap ( ) ;
298+ let table = UserWorkTable :: load ( engine) . await . unwrap ( ) ;
299+
300+ let next_pk = table. get_next_pk ( ) ;
301+ assert_eq ! ( next_pk, 2_u64 . into( ) ) ;
302+
303+ let inserted = UserRow {
304+ id : next_pk. into ( ) ,
305+ name : "Grace" . to_string ( ) ,
306+ email : "grace@test.com" . to_string ( ) ,
307+ created_at : ctx. default_created_at + 1 ,
308+ } ;
309+
310+ table. insert ( inserted. clone ( ) ) . unwrap ( ) ;
311+ table. wait_for_ops ( ) . await ;
312+
313+ assert_eq ! ( table. count( ) , 3 ) ;
314+ assert_eq ! ( table. select( inserted. id) , Some ( inserted. clone( ) ) ) ;
315+
316+ let by_name = table. select_by_name ( inserted. name . clone ( ) ) . execute ( ) . unwrap ( ) ;
317+ assert_eq ! ( by_name, vec![ inserted. clone( ) ] ) ;
318+
319+ let by_name_range = table
320+ . select_by_name_range ( inserted. name . clone ( ) ..=inserted. name . clone ( ) )
321+ . execute ( )
322+ . unwrap ( ) ;
323+ assert_eq ! ( by_name_range, vec![ inserted. clone( ) ] ) ;
324+
325+ let by_pk_range = table. select_by_pk_range ( inserted. id ..=inserted. id ) . execute ( ) . unwrap ( ) ;
326+ assert_eq ! ( by_pk_range, vec![ inserted. clone( ) ] ) ;
327+
328+ inserted
329+ } ;
330+
331+ {
332+ let config =
333+ DiskConfig :: new_with_table_name ( dst, UserWorkTable :: name_snake_case ( ) , UserWorkTable :: version ( ) ) ;
334+ let engine = UserPersistenceEngine :: new ( config) . await . unwrap ( ) ;
335+ let table = UserWorkTable :: load ( engine) . await . unwrap ( ) ;
336+
337+ assert_eq ! ( table. count( ) , 3 ) ;
338+ assert_eq ! ( table. select( inserted. id) , Some ( inserted. clone( ) ) ) ;
339+ assert_eq ! (
340+ table. select_by_name( inserted. name. clone( ) ) . execute( ) . unwrap( ) ,
341+ vec![ inserted. clone( ) ]
342+ ) ;
343+ }
344+ } ) ;
345+ }
346+
245347/// Nonexistent source returns an error
246348#[ test]
247349fn test_nonexistent_source_error ( ) {
0 commit comments