migrations_test.go 3.8 KB

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