123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package migres
- import (
- "errors"
- "testing"
- "github.com/annybs/go-version"
- )
- func TestModule_Upgrade(t *testing.T) {
- type TestCase struct {
- Input Module
- Up bool
- From string
- To string
- Expected []string
- Err error
- }
- testOutput := []string{}
- testMigration := func(v string, ok bool) Migration {
- f := func() error {
- if ok {
- testOutput = append(testOutput, v)
- return nil
- }
- return errors.New("test")
- }
- return Func(f, f)
- }
- testCases := []TestCase{
- {
- Input: Module{
- "1.0.0": testMigration("1.0.0", true),
- "2.0.0": testMigration("2.0.0", true),
- "3.0.0": testMigration("3.0.0", true),
- },
- Up: true,
- From: "0",
- To: "3",
- Expected: []string{"1.0.0", "2.0.0", "3.0.0"},
- },
- {
- Input: Module{
- "1.0.0": testMigration("1.0.0", true),
- "2.0.0": testMigration("2.0.0", true),
- "3.0.0": testMigration("3.0.0", true),
- },
- Up: true,
- From: "1",
- To: "3",
- Expected: []string{"2.0.0", "3.0.0"},
- },
- {
- Input: Module{
- "1.0.0": testMigration("1.0.0", true),
- "2.0.0": testMigration("2.0.0", true),
- "3.0.0": testMigration("3.0.0", true),
- },
- From: "3",
- To: "0",
- Expected: []string{"3.0.0", "2.0.0", "1.0.0"},
- },
- {
- Input: Module{
- "1.0.0": testMigration("1.0.0", true),
- "2.0.0": testMigration("2.0.0", true),
- "3.0.0": testMigration("3.0.0", true),
- },
- From: "3",
- To: "2",
- Expected: []string{"3.0.0"},
- },
- {
- Input: Module{
- "1.0.0": testMigration("1.0.0", true),
- "2.0.0": testMigration("2.0.0", false),
- "3.0.0": testMigration("3.0.0", true),
- },
- Up: true,
- From: "0",
- To: "3",
- Err: failMigration(errors.New("test"), version.MustParse("2.0.0"), version.MustParse("1.0.0")),
- },
- {
- Input: Module{
- "1.0.0": testMigration("1.0.0", true),
- "2.0.0": testMigration("2.0.0", false),
- "3.0.0": testMigration("3.0.0", true),
- },
- From: "4",
- To: "1",
- Err: failMigration(errors.New("test"), version.MustParse("2.0.0"), version.MustParse("3.0.0")),
- },
- {
- Input: Module{
- "1.0.0": testMigration("1.0.0", true),
- "2.0.0": testMigration("2.0.0", true),
- "3.0.0": testMigration("3.0.0", false),
- },
- From: "4",
- To: "1",
- Err: failMigration(errors.New("test"), version.MustParse("3.0.0"), nil),
- },
- }
- for i, testCase := range testCases {
- testOutput = []string{}
- var err error
- if testCase.Up {
- err = testCase.Input.Upgrade(testCase.From, testCase.To)
- } else {
- err = testCase.Input.Downgrade(testCase.From, testCase.To)
- }
- if err != nil {
- if testCase.Err == nil {
- t.Errorf("test %d failed (expected nil error, got error %v)", i, err)
- } else if !errors.Is(err, testCase.Err) {
- t.Errorf("test %d failed (expected error %v, got error %v)", i, testCase.Err, err)
- } else {
- a := err.(*Error)
- e := testCase.Err.(*Error)
- if !a.Version.Equal(e.Version) {
- t.Errorf("test %d failed (expected error.Version %s, got error.Version %s)", i, e.Version, a.Version)
- } else if !a.LastVersion.Equal(e.LastVersion) {
- t.Errorf("test %d failed (expected error.LastVersion %s, got error.LastVersion %s)", i, e.LastVersion, a.LastVersion)
- } else {
- t.Logf("test %d passed (expected error %v, got error %v)", i, testCase.Err, err)
- }
- }
- continue
- } else if testCase.Err != nil {
- t.Errorf("test %d failed (expected error %v, got nil error)", i, testCase.Err)
- continue
- }
- if len(testOutput) != len(testCase.Expected) {
- t.Errorf("test %d failed (expected %v, got %v)", i, testCase.Expected, testOutput)
- continue
- }
- ok := true
- for j, v := range testOutput {
- if v != testCase.Expected[j] {
- t.Errorf("test %d failed (expected version %q at index %d, got version %q)", i, testCase.Expected[j], j, v)
- ok = false
- }
- }
- if ok {
- t.Logf("test %d passed (expected %v, got %v)", i, testCase.Expected, testOutput)
- }
- }
- }
|