Files
hnnsgstfssnandGitHub a7fbb937e9 Add pkger source driver support (#377)
* 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
2020-04-21 16:43:53 -07:00

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
}