migrations_test.go 3.6 KB

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