migrations_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package settings
  2. import (
  3. "encoding/json"
  4. "io"
  5. "os"
  6. "strings"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. "github.com/Jguer/yay/v12/pkg/text"
  11. )
  12. func TestMigrationNothingToDo(t *testing.T) {
  13. t.Parallel()
  14. // Create temporary file for config
  15. configFile, err := os.CreateTemp("/tmp", "yay-*-config.json")
  16. require.NoError(t, err)
  17. testFilePath := configFile.Name()
  18. defer os.Remove(testFilePath)
  19. // Create config with configVersion
  20. config := Configuration{
  21. Version: "99.0.0",
  22. // Create runtime with runtimeVersion
  23. Runtime: &Runtime{
  24. Version: "20.0.0",
  25. Logger: text.NewLogger(io.Discard, strings.NewReader(""), false, "test"),
  26. },
  27. }
  28. // Run Migration
  29. err = config.RunMigrations(DefaultMigrations(), testFilePath)
  30. require.NoError(t, err)
  31. // Check file contents if wantSave otherwise check file empty
  32. cfile, err := os.Open(testFilePath)
  33. require.NoError(t, err)
  34. defer cfile.Close()
  35. decoder := json.NewDecoder(cfile)
  36. newConfig := Configuration{}
  37. err = decoder.Decode(&newConfig)
  38. require.Error(t, err)
  39. assert.Empty(t, newConfig.Version)
  40. }
  41. func TestProvidesMigrationDo(t *testing.T) {
  42. migration := &configProviderMigration{}
  43. config := Configuration{
  44. Provides: true,
  45. Runtime: &Runtime{
  46. Logger: text.NewLogger(io.Discard, strings.NewReader(""), false, "test"),
  47. },
  48. }
  49. assert.True(t, migration.Do(&config))
  50. falseConfig := Configuration{Provides: false}
  51. assert.False(t, migration.Do(&falseConfig))
  52. }
  53. func TestProvidesMigration(t *testing.T) {
  54. t.Parallel()
  55. type testCase struct {
  56. desc string
  57. testConfig *Configuration
  58. wantSave bool
  59. }
  60. testCases := []testCase{
  61. {
  62. desc: "to upgrade",
  63. testConfig: &Configuration{
  64. Version: "11.0.1",
  65. Runtime: &Runtime{Version: "11.2.1"},
  66. Provides: true,
  67. },
  68. wantSave: true,
  69. },
  70. {
  71. desc: "to upgrade-git",
  72. testConfig: &Configuration{
  73. Version: "11.2.0.r7.g6f60892",
  74. Runtime: &Runtime{Version: "11.2.1"},
  75. Provides: true,
  76. },
  77. wantSave: true,
  78. },
  79. {
  80. desc: "to not upgrade",
  81. testConfig: &Configuration{
  82. Version: "11.2.0",
  83. Runtime: &Runtime{Version: "11.2.1"},
  84. Provides: false,
  85. },
  86. wantSave: false,
  87. },
  88. {
  89. desc: "to not upgrade - target version",
  90. testConfig: &Configuration{
  91. Version: "11.2.1",
  92. Runtime: &Runtime{Version: "11.2.1"},
  93. Provides: true,
  94. },
  95. wantSave: false,
  96. },
  97. {
  98. desc: "to not upgrade - new version",
  99. testConfig: &Configuration{
  100. Version: "11.3.0",
  101. Runtime: &Runtime{Version: "11.3.0"},
  102. Provides: true,
  103. },
  104. wantSave: false,
  105. },
  106. }
  107. for _, tc := range testCases {
  108. t.Run(tc.desc, func(t *testing.T) {
  109. // Create temporary file for config
  110. configFile, err := os.CreateTemp("/tmp", "yay-*-config.json")
  111. require.NoError(t, err)
  112. testFilePath := configFile.Name()
  113. defer os.Remove(testFilePath)
  114. // Create config with configVersion and provides
  115. tcConfig := Configuration{
  116. Version: tc.testConfig.Version,
  117. Provides: tc.testConfig.Provides,
  118. // Create runtime with runtimeVersion
  119. Runtime: &Runtime{
  120. Logger: text.NewLogger(io.Discard, strings.NewReader(""), false, "test"),
  121. Version: tc.testConfig.Runtime.Version,
  122. },
  123. }
  124. // Run Migration
  125. err = tcConfig.RunMigrations(
  126. []configMigration{&configProviderMigration{}},
  127. testFilePath)
  128. require.NoError(t, err)
  129. // Check file contents if wantSave otherwise check file empty
  130. cfile, err := os.Open(testFilePath)
  131. require.NoError(t, err)
  132. defer cfile.Close()
  133. decoder := json.NewDecoder(cfile)
  134. newConfig := Configuration{}
  135. err = decoder.Decode(&newConfig)
  136. if tc.wantSave {
  137. require.NoError(t, err)
  138. assert.Equal(t, tc.testConfig.Runtime.Version, newConfig.Version)
  139. assert.Equal(t, false, newConfig.Provides)
  140. } else {
  141. require.Error(t, err)
  142. assert.Empty(t, newConfig.Version)
  143. }
  144. })
  145. }
  146. }