mirror of
https://github.com/hanzoai/migrate.git
synced 2026-09-30 22:55:10 +00:00
* Add pkger source driver support As go-bindata has been abandoned [1] there are open requests, #116, for alternative sources with similar functionality. The Buffalo project [2] created packr and recently pkger [3] was announced [4] with the intention to supersede packr. This change adds support for using pkger as a source. The implementation relies on httpfs.PartialDriver for pretty much all functionality. [1] https://github.com/jteeuwen/go-bindata/issues/5 [2] https://gobuffalo.io/ [3] https://github.com/markbates/pkger [4] https://blog.gobuffalo.io/introducing-pkger-static-file-embedding-in-go-1ce76dc79c65 * pkger: rename Instance to Pkger * pkger: make WithInstance accept *Pkger * pkger: refactor and add access to global pkging.Pkger instance * pkger: fix typo and cleanup debug logging
197 lines
4.0 KiB
Go
197 lines
4.0 KiB
Go
package pkger
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/gobuffalo/here"
|
|
st "github.com/golang-migrate/migrate/v4/source/testing"
|
|
"github.com/markbates/pkger"
|
|
"github.com/markbates/pkger/pkging"
|
|
"github.com/markbates/pkger/pkging/mem"
|
|
)
|
|
|
|
func Test(t *testing.T) {
|
|
t.Run("WithInstance", func(t *testing.T) {
|
|
i := testInstance(t)
|
|
|
|
createPkgerFile(t, i, "/1_foobar.up.sql")
|
|
createPkgerFile(t, i, "/1_foobar.down.sql")
|
|
createPkgerFile(t, i, "/3_foobar.up.sql")
|
|
createPkgerFile(t, i, "/4_foobar.up.sql")
|
|
createPkgerFile(t, i, "/4_foobar.down.sql")
|
|
createPkgerFile(t, i, "/5_foobar.down.sql")
|
|
createPkgerFile(t, i, "/7_foobar.up.sql")
|
|
createPkgerFile(t, i, "/7_foobar.down.sql")
|
|
|
|
d, err := WithInstance(i, "/")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
st.Test(t, d)
|
|
})
|
|
|
|
t.Run("Open", func(t *testing.T) {
|
|
i := testInstance(t)
|
|
|
|
createPkgerFile(t, i, "/1_foobar.up.sql")
|
|
createPkgerFile(t, i, "/1_foobar.down.sql")
|
|
createPkgerFile(t, i, "/3_foobar.up.sql")
|
|
createPkgerFile(t, i, "/4_foobar.up.sql")
|
|
createPkgerFile(t, i, "/4_foobar.down.sql")
|
|
createPkgerFile(t, i, "/5_foobar.down.sql")
|
|
createPkgerFile(t, i, "/7_foobar.up.sql")
|
|
createPkgerFile(t, i, "/7_foobar.down.sql")
|
|
|
|
registerPackageLevelInstance(t, i)
|
|
|
|
d, err := (&Pkger{}).Open("pkger:///")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
st.Test(t, d)
|
|
})
|
|
|
|
}
|
|
|
|
func TestWithInstance(t *testing.T) {
|
|
t.Run("Subdir", func(t *testing.T) {
|
|
i := testInstance(t)
|
|
|
|
// Make sure the relative root exists so that httpfs.PartialDriver can
|
|
// initialize.
|
|
createPkgerSubdir(t, i, "/subdir")
|
|
|
|
_, err := WithInstance(i, "/subdir")
|
|
if err != nil {
|
|
t.Fatal("")
|
|
}
|
|
})
|
|
|
|
t.Run("NilInstance", func(t *testing.T) {
|
|
_, err := WithInstance(nil, "")
|
|
if err == nil {
|
|
t.Fatal(err)
|
|
}
|
|
})
|
|
|
|
t.Run("FailInit", func(t *testing.T) {
|
|
i := testInstance(t)
|
|
|
|
_, err := WithInstance(i, "/fail")
|
|
if err == nil {
|
|
t.Fatal(err)
|
|
}
|
|
})
|
|
|
|
t.Run("FailWithoutMigrations", func(t *testing.T) {
|
|
i := testInstance(t)
|
|
|
|
createPkgerSubdir(t, i, "/")
|
|
|
|
d, err := WithInstance(i, "/")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if _, err := d.First(); !errors.Is(err, os.ErrNotExist) {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
func TestOpen(t *testing.T) {
|
|
|
|
t.Run("InvalidURL", func(t *testing.T) {
|
|
_, err := (&Pkger{}).Open(":///")
|
|
if err == nil {
|
|
t.Fatal(err)
|
|
}
|
|
})
|
|
|
|
t.Run("Root", func(t *testing.T) {
|
|
_, err := (&Pkger{}).Open("pkger:///")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
})
|
|
|
|
t.Run("FailInit", func(t *testing.T) {
|
|
_, err := (&Pkger{}).Open("pkger:///subdir")
|
|
if err == nil {
|
|
t.Fatal(err)
|
|
}
|
|
})
|
|
|
|
i := testInstance(t)
|
|
createPkgerSubdir(t, i, "/subdir")
|
|
|
|
// Note that this registers the instance globally so anything run after
|
|
// this will have access to everything container in the registered
|
|
// instance.
|
|
registerPackageLevelInstance(t, i)
|
|
|
|
t.Run("Subdir", func(t *testing.T) {
|
|
_, err := (&Pkger{}).Open("pkger:///subdir")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestClose(t *testing.T) {
|
|
d, err := (&Pkger{}).Open("pkger:///")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := d.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func registerPackageLevelInstance(t *testing.T, pkg pkging.Pkger) {
|
|
if err := pkger.Apply(pkg, nil); err != nil {
|
|
t.Fatalf("failed to register pkger instance: %v\n", err)
|
|
}
|
|
}
|
|
|
|
func testInstance(t *testing.T) pkging.Pkger {
|
|
pkg, err := inMemoryPkger()
|
|
if err != nil {
|
|
t.Fatalf("failed to create an pkging.Pkger instance: %v\n", err)
|
|
}
|
|
|
|
return pkg
|
|
}
|
|
|
|
func createPkgerSubdir(t *testing.T, pkg pkging.Pkger, subdir string) {
|
|
if err := pkg.MkdirAll(subdir, os.ModePerm); err != nil {
|
|
t.Fatalf("failed to create pkger subdir %q: %v\n", subdir, err)
|
|
}
|
|
}
|
|
|
|
func createPkgerFile(t *testing.T, pkg pkging.Pkger, name string) {
|
|
_, err := pkg.Create(name)
|
|
if err != nil {
|
|
t.Fatalf("failed to create pkger file %q: %v\n", name, err)
|
|
}
|
|
}
|
|
|
|
func inMemoryPkger() (*mem.Pkger, error) {
|
|
info, err := here.New().Current()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
pkg, err := mem.New(info)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return pkg, nil
|
|
}
|