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  }