migrations_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. Logger: text.NewLogger(io.Discard, io.Discard, strings.NewReader(""), false, "test"),
  25. },
  26. }
  27. // Run Migration
  28. err = config.RunMigrations(DefaultMigrations(), testFilePath, "20.0.0")
  29. require.NoError(t, err)
  30. // Check file contents if wantSave otherwise check file empty
  31. cfile, err := os.Open(testFilePath)
  32. require.NoError(t, err)
  33. defer cfile.Close()
  34. decoder := json.NewDecoder(cfile)
  35. newConfig := Configuration{}
  36. err = decoder.Decode(&newConfig)
  37. require.Error(t, err)
  38. assert.Empty(t, newConfig.Version)
  39. }
  40. func TestProvidesMigrationDo(t *testing.T) {
  41. migration := &configProviderMigration{}
  42. config := Configuration{
  43. Provides: true,
  44. Runtime: &Runtime{
  45. Logger: text.NewLogger(io.Discard, io.Discard, strings.NewReader(""), false, "test"),
  46. },
  47. }
  48. assert.True(t, migration.Do(&config))
  49. falseConfig := Configuration{Provides: false}
  50. assert.False(t, migration.Do(&falseConfig))
  51. }
  52. func TestProvidesMigration(t *testing.T) {
  53. t.Parallel()
  54. type testCase struct {
  55. desc string
  56. testConfig *Configuration
  57. newVersion string
  58. wantSave bool
  59. }
  60. testCases := []testCase{
  61. {
  62. desc: "to upgrade",
  63. testConfig: &Configuration{
  64. Version: "11.0.1",
  65. Provides: true,
  66. },
  67. newVersion: "11.2.1",
  68. wantSave: true,
  69. },
  70. {
  71. desc: "to upgrade-git",
  72. testConfig: &Configuration{
  73. Version: "11.2.0.r7.g6f60892",
  74. Provides: true,
  75. },
  76. newVersion: "11.2.1",
  77. wantSave: true,
  78. },
  79. {
  80. desc: "to not upgrade",
  81. testConfig: &Configuration{
  82. Version: "11.2.0",
  83. Provides: false,
  84. },
  85. newVersion: "11.2.1",
  86. wantSave: false,
  87. },
  88. {
  89. desc: "to not upgrade - target version",
  90. testConfig: &Configuration{
  91. Version: "11.2.1",
  92. Provides: true,
  93. },
  94. newVersion: "11.2.1",
  95. wantSave: false,
  96. },
  97. {
  98. desc: "to not upgrade - new version",
  99. testConfig: &Configuration{
  100. Version: "11.3.0",
  101. Provides: true,
  102. },
  103. newVersion: "11.3.0",
  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, io.Discard, strings.NewReader(""), false, "test"),
  121. },
  122. }
  123. // Run Migration
  124. err = tcConfig.RunMigrations(
  125. []configMigration{&configProviderMigration{}},
  126. testFilePath, tc.newVersion)
  127. require.NoError(t, err)
  128. // Check file contents if wantSave otherwise check file empty
  129. cfile, err := os.Open(testFilePath)
  130. require.NoError(t, err)
  131. defer cfile.Close()
  132. decoder := json.NewDecoder(cfile)
  133. newConfig := Configuration{}
  134. err = decoder.Decode(&newConfig)
  135. if tc.wantSave {
  136. require.NoError(t, err)
  137. assert.Equal(t, tc.newVersion, newConfig.Version)
  138. assert.Equal(t, false, newConfig.Provides)
  139. } else {
  140. require.Error(t, err)
  141. assert.Empty(t, newConfig.Version)
  142. }
  143. })
  144. }
  145. }