github.com/kubeshop/testkube@v1.17.23/pkg/migrator/migrator_test.go (about) 1 package migrator 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 ) 9 10 var ErrMigrationFailed = fmt.Errorf("migration failed") 11 12 func TestMigrator(t *testing.T) { 13 14 t.Run("migrate versions one after another", func(t *testing.T) { 15 // given 16 migrator := NewMigrator() 17 migrator.Add(&Migr1{}) 18 migrator.Add(&Migr2{}) 19 migrator.Add(&Migr3{}) 20 21 // when 22 err := migrator.Run("0.0.2", MigrationTypeClient) 23 assert.NoError(t, err) 24 25 // then 26 assert.Equal(t, migrator.Migrations[0].(*Migr1).Run, false) 27 assert.Equal(t, migrator.Migrations[1].(*Migr2).Run, true) 28 assert.Equal(t, migrator.Migrations[2].(*Migr3).Run, true) 29 }) 30 31 t.Run("migrate mixed versions", func(t *testing.T) { 32 // given 33 migrator := NewMigrator() 34 migrator.Add(&Migr3{}) 35 migrator.Add(&Migr1{}) 36 migrator.Add(&Migr2{}) 37 migrator.Add(&Migr1{}) 38 39 // when 40 err := migrator.Run("0.0.2", MigrationTypeClient) 41 assert.NoError(t, err) 42 43 // then 44 assert.Equal(t, migrator.Migrations[0].(*Migr3).Run, true) 45 assert.Equal(t, migrator.Migrations[1].(*Migr1).Run, false) 46 assert.Equal(t, migrator.Migrations[2].(*Migr2).Run, true) 47 assert.Equal(t, migrator.Migrations[3].(*Migr1).Run, false) 48 }) 49 50 t.Run("failed migration returns error", func(t *testing.T) { 51 // given 52 migrator := NewMigrator() 53 migrator.Add(&Migr1{}) 54 migrator.Add(&MigrFailed{}) 55 migrator.Add(&Migr1{}) 56 57 // when 58 err := migrator.Run("0.0.1", MigrationTypeClient) 59 60 // then 61 assert.Error(t, err, ErrMigrationFailed) 62 }) 63 64 t.Run("run only client migration", func(t *testing.T) { 65 // given 66 migrator := NewMigrator() 67 migrator.Add(&Migr1{}) 68 migrator.Add(&MigrServer{}) 69 70 // when 71 err := migrator.Run("0.0.1", MigrationTypeClient) 72 assert.NoError(t, err) 73 74 // then 75 assert.Equal(t, migrator.Migrations[0].(*Migr1).Run, true) 76 assert.Equal(t, migrator.Migrations[1].(*MigrServer).Run, false) 77 }) 78 79 t.Run("run only server migration", func(t *testing.T) { 80 // given 81 migrator := NewMigrator() 82 migrator.Add(&Migr1{}) 83 migrator.Add(&MigrServer{}) 84 85 // when 86 err := migrator.Run("0.0.1", MigrationTypeServer) 87 assert.NoError(t, err) 88 89 // then 90 assert.Equal(t, migrator.Migrations[0].(*Migr1).Run, false) 91 assert.Equal(t, migrator.Migrations[1].(*MigrServer).Run, true) 92 }) 93 94 } 95 96 type Migr1 struct { 97 Run bool 98 } 99 100 func (m *Migr1) Version() string { 101 return "0.0.1" 102 } 103 func (m *Migr1) Migrate() error { 104 m.Run = true 105 return nil 106 } 107 func (m *Migr1) Info() string { 108 return "some migration description 1" 109 } 110 111 func (m *Migr1) Type() MigrationType { 112 return MigrationTypeClient 113 } 114 115 type Migr2 struct { 116 Run bool 117 } 118 119 func (m *Migr2) Version() string { 120 return "0.0.2" 121 } 122 func (m *Migr2) Migrate() error { 123 m.Run = true 124 return nil 125 } 126 func (m *Migr2) Info() string { 127 return "some migration description 2" 128 } 129 func (m *Migr2) Type() MigrationType { 130 return MigrationTypeClient 131 } 132 133 type Migr3 struct { 134 Run bool 135 } 136 137 func (m *Migr3) Version() string { 138 return "0.0.3" 139 } 140 func (m *Migr3) Migrate() error { 141 m.Run = true 142 return nil 143 } 144 func (m *Migr3) Info() string { 145 return "some migration description 3" 146 } 147 func (m *Migr3) Type() MigrationType { 148 return MigrationTypeClient 149 } 150 151 type MigrFailed struct { 152 Run bool 153 } 154 155 func (m *MigrFailed) Version() string { 156 return "0.0.1" 157 } 158 func (m *MigrFailed) Migrate() error { 159 m.Run = true 160 return ErrMigrationFailed 161 } 162 func (m *MigrFailed) Info() string { 163 return "some failed migration" 164 } 165 func (m *MigrFailed) Type() MigrationType { 166 return MigrationTypeClient 167 } 168 169 type MigrServer struct { 170 Run bool 171 } 172 173 func (m *MigrServer) Version() string { 174 return "0.0.1" 175 } 176 func (m *MigrServer) Migrate() error { 177 m.Run = true 178 return nil 179 } 180 func (m *MigrServer) Info() string { 181 return "some server migration" 182 } 183 func (m *MigrServer) Type() MigrationType { 184 return MigrationTypeServer 185 }