github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/migration/migration_test.go (about) 1 package migration 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestMigrations(t *testing.T) { 11 testData := map[string]int{} 12 curVer := &inmemIDStore{} 13 14 t.Run("native", func(t *testing.T) { 15 require := require.New(t) 16 17 native := Begin("native") 18 curVer.lastID = idOf("native") 19 20 num := 1 21 lastGood := native.Next("01", 22 func() error { 23 testData["migration1"] = num 24 num++ 25 return nil 26 }, 27 ).Next("02", 28 func() error { 29 testData["migration2"] = num 30 num++ 31 return nil 32 }, 33 ) 34 35 afterBad := lastGood.Next("03", 36 func() error { 37 testData["migration3"] = num 38 num++ 39 return errors.New("test migration error") 40 }, 41 ).Next("04", 42 func() error { 43 testData["migration4"] = num 44 num++ 45 return nil 46 }, 47 ) 48 49 err := afterBad.Exec(curVer, flush) 50 require.Error(err, "Success after a migration error") 51 52 lastID := curVer.GetID() 53 require.Equal(lastGood.ID(), lastID, "Bad last id in idProducer after a migration error") 54 55 require.Equal(1, testData["migration1"], "Bad value after run migration1") 56 require.Equal(2, testData["migration2"], "Bad value after run migration2") 57 require.Equal(3, testData["migration3"], "Bad value after run migration3") 58 require.Empty(testData["migration4"], "Bad data for migration4 - should by empty") 59 60 // Continue with fixed transactions 61 62 num = 3 63 fixed := lastGood.Next("03", 64 func() error { 65 testData["migration3"] = num 66 num++ 67 return nil 68 }, 69 ).Next("04", 70 func() error { 71 testData["migration4"] = num 72 num++ 73 return nil 74 }, 75 ) 76 77 err = fixed.Exec(curVer, flush) 78 require.NoError(err, "Error when run migration manager") 79 80 require.Equal(1, testData["migration1"], "Bad value after run migration1") 81 require.Equal(2, testData["migration2"], "Bad value after run migration2") 82 require.Equal(3, testData["migration3"], "Bad value after run migration3") 83 require.Equal(4, testData["migration4"], "Bad value after run migration4") 84 }) 85 86 t.Run("nonnative", func(t *testing.T) { 87 require := require.New(t) 88 89 nonnative := Begin("nonnative"). 90 Next("01", 91 func() error { 92 testData["migration1"] = 999 93 return nil 94 }, 95 ) 96 97 err := nonnative.Exec(curVer, flush) 98 require.NotEqual(999, testData["migration1"], "nonnative migration is applied") 99 require.Error(err) 100 }) 101 } 102 103 func flush() error { 104 return nil 105 }