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  }