module_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package migres
  2. import (
  3. "errors"
  4. "testing"
  5. "github.com/annybs/go-version"
  6. )
  7. func TestModule_Upgrade(t *testing.T) {
  8. type TestCase struct {
  9. Input Module
  10. Up bool
  11. From string
  12. To string
  13. Expected []string
  14. Err error
  15. }
  16. testOutput := []string{}
  17. testMigration := func(v string, ok bool) Migration {
  18. f := func() error {
  19. if ok {
  20. testOutput = append(testOutput, v)
  21. return nil
  22. }
  23. return errors.New("test")
  24. }
  25. return Func(f, f)
  26. }
  27. testCases := []TestCase{
  28. {
  29. Input: Module{
  30. "1.0.0": testMigration("1.0.0", true),
  31. "2.0.0": testMigration("2.0.0", true),
  32. "3.0.0": testMigration("3.0.0", true),
  33. },
  34. Up: true,
  35. From: "0",
  36. To: "3",
  37. Expected: []string{"1.0.0", "2.0.0", "3.0.0"},
  38. },
  39. {
  40. Input: Module{
  41. "1.0.0": testMigration("1.0.0", true),
  42. "2.0.0": testMigration("2.0.0", true),
  43. "3.0.0": testMigration("3.0.0", true),
  44. },
  45. Up: true,
  46. From: "1",
  47. To: "3",
  48. Expected: []string{"2.0.0", "3.0.0"},
  49. },
  50. {
  51. Input: Module{
  52. "1.0.0": testMigration("1.0.0", true),
  53. "2.0.0": testMigration("2.0.0", true),
  54. "3.0.0": testMigration("3.0.0", true),
  55. },
  56. From: "3",
  57. To: "0",
  58. Expected: []string{"3.0.0", "2.0.0", "1.0.0"},
  59. },
  60. {
  61. Input: Module{
  62. "1.0.0": testMigration("1.0.0", true),
  63. "2.0.0": testMigration("2.0.0", true),
  64. "3.0.0": testMigration("3.0.0", true),
  65. },
  66. From: "3",
  67. To: "2",
  68. Expected: []string{"3.0.0"},
  69. },
  70. {
  71. Input: Module{
  72. "1.0.0": testMigration("1.0.0", true),
  73. "2.0.0": testMigration("2.0.0", false),
  74. "3.0.0": testMigration("3.0.0", true),
  75. },
  76. Up: true,
  77. From: "0",
  78. To: "3",
  79. Err: failMigration(errors.New("test"), version.MustParse("2.0.0"), version.MustParse("1.0.0")),
  80. },
  81. {
  82. Input: Module{
  83. "1.0.0": testMigration("1.0.0", true),
  84. "2.0.0": testMigration("2.0.0", false),
  85. "3.0.0": testMigration("3.0.0", true),
  86. },
  87. From: "4",
  88. To: "1",
  89. Err: failMigration(errors.New("test"), version.MustParse("2.0.0"), version.MustParse("3.0.0")),
  90. },
  91. {
  92. Input: Module{
  93. "1.0.0": testMigration("1.0.0", true),
  94. "2.0.0": testMigration("2.0.0", true),
  95. "3.0.0": testMigration("3.0.0", false),
  96. },
  97. From: "4",
  98. To: "1",
  99. Err: failMigration(errors.New("test"), version.MustParse("3.0.0"), nil),
  100. },
  101. }
  102. for i, testCase := range testCases {
  103. testOutput = []string{}
  104. var err error
  105. if testCase.Up {
  106. err = testCase.Input.Upgrade(testCase.From, testCase.To)
  107. } else {
  108. err = testCase.Input.Downgrade(testCase.From, testCase.To)
  109. }
  110. if err != nil {
  111. if testCase.Err == nil {
  112. t.Errorf("test %d failed (expected nil error, got error %v)", i, err)
  113. } else if !errors.Is(err, testCase.Err) {
  114. t.Errorf("test %d failed (expected error %v, got error %v)", i, testCase.Err, err)
  115. } else {
  116. a := err.(*Error)
  117. e := testCase.Err.(*Error)
  118. if !a.Version.Equal(e.Version) {
  119. t.Errorf("test %d failed (expected error.Version %s, got error.Version %s)", i, e.Version, a.Version)
  120. } else if !a.LastVersion.Equal(e.LastVersion) {
  121. t.Errorf("test %d failed (expected error.LastVersion %s, got error.LastVersion %s)", i, e.LastVersion, a.LastVersion)
  122. } else {
  123. t.Logf("test %d passed (expected error %v, got error %v)", i, testCase.Err, err)
  124. }
  125. }
  126. continue
  127. } else if testCase.Err != nil {
  128. t.Errorf("test %d failed (expected error %v, got nil error)", i, testCase.Err)
  129. continue
  130. }
  131. if len(testOutput) != len(testCase.Expected) {
  132. t.Errorf("test %d failed (expected %v, got %v)", i, testCase.Expected, testOutput)
  133. continue
  134. }
  135. ok := true
  136. for j, v := range testOutput {
  137. if v != testCase.Expected[j] {
  138. t.Errorf("test %d failed (expected version %q at index %d, got version %q)", i, testCase.Expected[j], j, v)
  139. ok = false
  140. }
  141. }
  142. if ok {
  143. t.Logf("test %d passed (expected %v, got %v)", i, testCase.Expected, testOutput)
  144. }
  145. }
  146. }