A set of helpers to help to create and manage database migration tests
foundation.go | ||
foundation_test.go | ||
go.mod | ||
go.sum | ||
helpers_test.go | ||
Makefile | ||
README.md |
Foundation
A set of helpers to help to create and manage database migration tests.
Install
go get git.ctrlz.es/mgdelacroix/foundation
Usage
To start using foundation, you need to implement the Migrator
interface, describing how your tool manages migrations and what are
the intermediate steps (generally data migrations), if any, that need
to run at the end of each migration step:
type Migrator interface {
DB() *sql.DB
DriverName() string
Setup() error
MigrateToStep(step int) error
TearDown() error
}
interceptors := map[int]Interceptor{
// function that will run after step 6
6: func() err {
return myStore.RunDataMigration()
},
}
With the interface implemented, you can use foundation
in your tests
to load fixtures, set the database on a specific state and then run
your assertions:
t.Run("migration should link book 1 with its author", func(t *testing.T) {
f := foundation.New(t, migrator).
RegisterInterceptors(interceptors).
// runs migrations up to and including 5
MigrateToStep(5).
// loads the SQL of the file
ExecFile("./myfixtures.sql").
// runs migration 6 and its interceptor function
MigrateToStep(6)
defer f.TearDown()
book := struct{
ID int
AuthorID int
}{}
err = f.DB().Get(&book, "SELECT id, authorID FROM books")
require.NoError(t, err)
require.Equal(t, 1, book.ID)
require.Equal(t, 3, book.AuthorID)
})