github.com/adharshmk96/stk@v1.2.3/pkg/sqlMigrator/generator_test.go (about) 1 package sqlmigrator_test 2 3 import ( 4 "testing" 5 6 sqlmigrator "github.com/adharshmk96/stk/pkg/sqlMigrator" 7 "github.com/adharshmk96/stk/testutils" 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestGenerate(t *testing.T) { 12 t.Run("generator generates correct number of migrations", func(t *testing.T) { 13 numToGenerate := 3 14 expectedNumFiles := (numToGenerate * 2) + 1 15 16 tempDir, removeDir := testutils.CreateTempDirectory(t) 17 18 _, db, logfile := sqlmigrator.DefaultContextConfig() 19 ctx := sqlmigrator.NewContext(tempDir, db, logfile, false) 20 defer removeDir() 21 22 generator := sqlmigrator.NewGenerator("user_table", numToGenerate, false) 23 24 generatedFiles, err := generator.Generate(ctx) 25 26 assert.NoError(t, err) 27 assert.Equal(t, expectedNumFiles, testutils.GetNumberOfFilesInFolder(t, tempDir)) 28 assert.Equal(t, expectedNumFiles-1, len(generatedFiles)) 29 30 }) 31 32 t.Run("generator fills file with content on fill flag", func(t *testing.T) { 33 numToGenerate := 3 34 35 tempDir, removeDir := testutils.CreateTempDirectory(t) 36 37 _, db, logfile := sqlmigrator.DefaultContextConfig() 38 ctx := sqlmigrator.NewContext(tempDir, db, logfile, false) 39 defer removeDir() 40 41 generator := sqlmigrator.NewGenerator("user_table", numToGenerate, true) 42 43 generatedFiles, err := generator.Generate(ctx) 44 45 assert.NoError(t, err) 46 47 for _, file := range generatedFiles { 48 content := testutils.GetFileContent(t, file) 49 assert.NotEmpty(t, content) 50 } 51 52 }) 53 54 t.Run("generator doesn't generate files on dry run", func(t *testing.T) { 55 numToGenerate := 3 56 57 tempDir, removeDir := testutils.CreateTempDirectory(t) 58 59 _, db, logfile := sqlmigrator.DefaultContextConfig() 60 ctx := sqlmigrator.NewContext(tempDir, db, logfile, true) 61 defer removeDir() 62 63 generator := sqlmigrator.NewGenerator("user_table", numToGenerate, true) 64 65 generatedFiles, err := generator.Generate(ctx) 66 67 assert.NoError(t, err) 68 assert.Empty(t, generatedFiles) 69 assert.Equal(t, 1, testutils.GetNumberOfFilesInFolder(t, tempDir)) 70 }) 71 72 t.Run("generator updates ctx migrations", func(t *testing.T) { 73 numToGenerate := 3 74 75 tempDir, removeDir := testutils.CreateTempDirectory(t) 76 77 _, db, logfile := sqlmigrator.DefaultContextConfig() 78 ctx := sqlmigrator.NewContext(tempDir, db, logfile, false) 79 80 defer removeDir() 81 82 existingMigrations := len(ctx.Migrations) 83 84 generator := sqlmigrator.NewGenerator("user_table", numToGenerate, true) 85 _, err := generator.Generate(ctx) 86 assert.NoError(t, err) 87 88 assert.Equal(t, existingMigrations+numToGenerate, len(ctx.Migrations)) 89 90 }) 91 } 92 93 func TestGenerateNextMigrations(t *testing.T) { 94 t.Run("generates next migrations", func(t *testing.T) { 95 lastMigration := sqlmigrator.MigrationFileEntry{ 96 Number: 1, 97 Name: "create_users_table", 98 } 99 100 migrations := []sqlmigrator.MigrationFileEntry{ 101 { 102 Number: 2, 103 }, 104 { 105 Number: 3, 106 }, 107 } 108 109 nextMigrations := sqlmigrator.GenerateNextMigrations(lastMigration.Number, "", len(migrations)) 110 111 for i, migration := range nextMigrations { 112 assert.Equal(t, migrations[i].Number, migration.Number) 113 } 114 115 }) 116 } 117 118 func TestClean(t *testing.T) { 119 t.Run("clean removes files and updates ctx", func(t *testing.T) { 120 tempDir, removeDir := testutils.CreateTempDirectory(t) 121 122 _, db, logfile := sqlmigrator.DefaultContextConfig() 123 ctx := sqlmigrator.NewContext(tempDir, db, logfile, false) 124 defer removeDir() 125 126 generator := sqlmigrator.NewGenerator("user_table", 3, true) 127 generatedFiles, err := generator.Generate(ctx) 128 assert.NoError(t, err) 129 130 for _, migration := range ctx.Migrations { 131 migration.Committed = true 132 } 133 134 expectedNumFiles := 1 + len(generatedFiles) 135 exptctedNumMigrations := (expectedNumFiles - 1) / 2 136 137 assert.Equal(t, expectedNumFiles, testutils.GetNumberOfFilesInFolder(t, tempDir)) 138 assert.Equal(t, exptctedNumMigrations, len(ctx.Migrations)) 139 140 generator = sqlmigrator.NewGenerator("groups_table", 4, true) 141 uncommitedFiles, err := generator.Generate(ctx) 142 assert.NoError(t, err) 143 144 expectedNumFiles = 1 + len(generatedFiles) + len(uncommitedFiles) 145 exptctedNumMigrations = (expectedNumFiles - 1) / 2 146 147 assert.Equal(t, expectedNumFiles, testutils.GetNumberOfFilesInFolder(t, tempDir)) 148 assert.Equal(t, exptctedNumMigrations, len(ctx.Migrations)) 149 150 for _, migration := range ctx.Migrations { 151 assert.FileExists(t, migration.UpFilePath) 152 assert.FileExists(t, migration.DownFilePath) 153 } 154 155 err = ctx.WriteMigrationEntries() 156 assert.NoError(t, err) 157 158 removedFiles, err := generator.Clean(ctx) 159 assert.NoError(t, err) 160 161 assert.Equal(t, len(uncommitedFiles), len(removedFiles)) 162 163 expectedNumFiles = 1 + len(generatedFiles) 164 exptctedNumMigrations = (expectedNumFiles - 1) / 2 165 166 assert.Equal(t, expectedNumFiles, testutils.GetNumberOfFilesInFolder(t, tempDir)) 167 assert.Equal(t, exptctedNumMigrations, len(ctx.Migrations)) 168 169 for _, migration := range ctx.Migrations { 170 assert.FileExists(t, migration.UpFilePath) 171 assert.FileExists(t, migration.DownFilePath) 172 } 173 174 }) 175 176 t.Run("clean doesn't remove files on dry run", func(t *testing.T) { 177 tempDir, removeDir := testutils.CreateTempDirectory(t) 178 179 _, db, logfile := sqlmigrator.DefaultContextConfig() 180 ctx := sqlmigrator.NewContext(tempDir, db, logfile, false) 181 defer removeDir() 182 183 generator := sqlmigrator.NewGenerator("user_table", 3, true) 184 generatedFiles, err := generator.Generate(ctx) 185 assert.NoError(t, err) 186 187 for _, migration := range ctx.Migrations { 188 assert.FileExists(t, migration.UpFilePath) 189 assert.FileExists(t, migration.DownFilePath) 190 migration.Committed = true 191 } 192 193 generator = sqlmigrator.NewGenerator("groups_table", 4, true) 194 uncommitedFiles, err := generator.Generate(ctx) 195 assert.NoError(t, err) 196 197 ctx.DryRun = true 198 199 removedFiles, err := generator.Clean(ctx) 200 assert.NoError(t, err) 201 202 expectedFiles := len(uncommitedFiles) + len(generatedFiles) + 1 203 expectedMigrations := (len(uncommitedFiles) + len(generatedFiles)) / 2 204 205 assert.Empty(t, removedFiles) 206 assert.Equal(t, expectedFiles, testutils.GetNumberOfFilesInFolder(t, tempDir)) 207 assert.Equal(t, expectedMigrations, len(ctx.Migrations)) 208 }) 209 210 t.Run("clean works in empty directory", func(t *testing.T) { 211 tempDir, removeDir := testutils.CreateTempDirectory(t) 212 213 _, db, logfile := sqlmigrator.DefaultContextConfig() 214 ctx := sqlmigrator.NewContext(tempDir, db, logfile, false) 215 defer removeDir() 216 217 generator := sqlmigrator.NewGenerator("user_table", 3, true) 218 removedFiles, err := generator.Clean(ctx) 219 assert.NoError(t, err) 220 221 assert.Empty(t, removedFiles) 222 assert.Equal(t, 1, testutils.GetNumberOfFilesInFolder(t, tempDir)) 223 assert.Equal(t, 0, len(ctx.Migrations)) 224 }) 225 }