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  }