From 868be73d5b8923ba1c89b66eb012a6ca3305261d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Sun, 18 Oct 2020 01:09:12 +0200 Subject: [PATCH] Making the migrations embeded, and add an initial store test --- server/go.mod | 4 + server/go.sum | 10 ++ server/services/store/sqlstore/blocks_test.go | 38 ++++++ server/services/store/sqlstore/migrate.go | 28 ++++- .../store/sqlstore/migrations/migrations.go | 3 + .../sqlstore/migrations/postgres/bindata.go | 115 ++++++++++++++++++ .../000001_init.down.sql | 0 .../000001_init.up.sql | 0 .../sqlstore/migrations/sqlite/bindata.go | 115 ++++++++++++++++++ .../000001_init.down.sql | 0 .../000001_init.up.sql | 0 server/services/store/sqlstore/sqlstore.go | 1 - .../services/store/sqlstore/sqlstore_test.go | 27 ++++ 13 files changed, 335 insertions(+), 6 deletions(-) create mode 100644 server/services/store/sqlstore/blocks_test.go create mode 100644 server/services/store/sqlstore/migrations/migrations.go create mode 100644 server/services/store/sqlstore/migrations/postgres/bindata.go rename server/services/store/sqlstore/migrations/{postgres => postgres_files}/000001_init.down.sql (100%) rename server/services/store/sqlstore/migrations/{postgres => postgres_files}/000001_init.up.sql (100%) create mode 100644 server/services/store/sqlstore/migrations/sqlite/bindata.go rename server/services/store/sqlstore/migrations/{sqlite => sqlite_files}/000001_init.down.sql (100%) rename server/services/store/sqlstore/migrations/{sqlite => sqlite_files}/000001_init.up.sql (100%) create mode 100644 server/services/store/sqlstore/sqlstore_test.go diff --git a/server/go.mod b/server/go.mod index 00efa45b4..02fd6413a 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,14 +3,18 @@ module github.com/mattermost/mattermost-octo-tasks/server go 1.15 require ( + github.com/golang-migrate/migrate v3.5.4+incompatible github.com/golang-migrate/migrate/v4 v4.13.0 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.4.2 + github.com/jteeuwen/go-bindata v3.0.7+incompatible // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.8.0 github.com/mattermost/mattermost-server/v5 v5.28.0 github.com/mattn/go-sqlite3 v2.0.3+incompatible github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/spf13/viper v1.7.1 + github.com/stretchr/testify v1.6.1 + golang.org/x/tools v0.0.0-20201017001424-6003fad69a88 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect ) diff --git a/server/go.sum b/server/go.sum index a925e73f9..1aa995a8f 100644 --- a/server/go.sum +++ b/server/go.sum @@ -283,6 +283,9 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-migrate/migrate v1.3.2 h1:QAlFV1QF9zdkzy/jujlBVkVu+L/+k18cg8tuY1/4JDY= +github.com/golang-migrate/migrate v3.5.4+incompatible h1:R7OzwvCJTCgwapPCiX6DyBiu2czIUMDCB118gFTKTUA= +github.com/golang-migrate/migrate v3.5.4+incompatible/go.mod h1:IsVUlFN5puWOmXrqjgGUfIRIbU7mr8oNBE2tyERd9Wk= github.com/golang-migrate/migrate/v4 v4.13.0 h1:5S7HMjiq9u50X3+WXpzXPbUj1qUFuZRm8NCsX989Tn4= github.com/golang-migrate/migrate/v4 v4.13.0/go.mod h1:RUEXGkgYXTOdBY9Rbs9izc/SOalUK+dDi7YphFV/CUI= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= @@ -484,6 +487,8 @@ github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jteeuwen/go-bindata v3.0.7+incompatible h1:91Uy4d9SYVr1kyTJ15wJsog+esAZZl7JmEfTkwmhJts= +github.com/jteeuwen/go-bindata v3.0.7+incompatible/go.mod h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= @@ -921,6 +926,7 @@ github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= @@ -1069,6 +1075,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1223,6 +1231,8 @@ golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200817023811-d00afeaade8f/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200818005847-188abfa75333 h1:a6ryybeZHQf5qnBc6IwRfVnI/75UmdtJo71f0//8Dqo= golang.org/x/tools v0.0.0-20200818005847-188abfa75333/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201017001424-6003fad69a88 h1:ZB1XYzdDo7c/O48jzjMkvIjnC120Z9/CwgDWhePjQdQ= +golang.org/x/tools v0.0.0-20201017001424-6003fad69a88/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/server/services/store/sqlstore/blocks_test.go b/server/services/store/sqlstore/blocks_test.go new file mode 100644 index 000000000..882d2c567 --- /dev/null +++ b/server/services/store/sqlstore/blocks_test.go @@ -0,0 +1,38 @@ +package sqlstore + +import ( + "testing" + "time" + + "github.com/mattermost/mattermost-octo-tasks/server/model" + "github.com/stretchr/testify/require" +) + +func TestInsertBlock(t *testing.T) { + store, tearDown := SetupTests(t) + defer tearDown() + + blocks, err := store.GetAllBlocks() + require.NoError(t, err) + require.Empty(t, blocks) + + block := model.Block{ + ID: "id-test", + } + + err = store.InsertBlock(block) + require.NoError(t, err) + + blocks, err = store.GetAllBlocks() + require.NoError(t, err) + require.Len(t, blocks, 1) + + // Wait for not colliding the ID+insert_at key + time.Sleep(1 * time.Millisecond) + err = store.DeleteBlock(block.ID) + require.NoError(t, err) + + blocks, err = store.GetAllBlocks() + require.NoError(t, err) + require.Empty(t, blocks) +} diff --git a/server/services/store/sqlstore/migrate.go b/server/services/store/sqlstore/migrate.go index d0b2a2e7a..a027b3b54 100644 --- a/server/services/store/sqlstore/migrate.go +++ b/server/services/store/sqlstore/migrate.go @@ -1,31 +1,49 @@ package sqlstore import ( + "fmt" + "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/postgres" "github.com/golang-migrate/migrate/v4/database/sqlite3" _ "github.com/golang-migrate/migrate/v4/source/file" + bindata "github.com/golang-migrate/migrate/v4/source/go_bindata" _ "github.com/lib/pq" + pgmigrations "github.com/mattermost/mattermost-octo-tasks/server/services/store/sqlstore/migrations/postgres" + "github.com/mattermost/mattermost-octo-tasks/server/services/store/sqlstore/migrations/sqlite" ) func (s *SQLStore) Migrate() error { + fmt.Println("HOLA") var driver database.Driver var err error - var migrationsDir string + var bresource *bindata.AssetSource if s.dbType == "sqlite3" { driver, err = sqlite3.WithInstance(s.db, &sqlite3.Config{}) - migrationsDir = "file://./server/services/store/sqlstore/migrations/sqlite" + fmt.Println(pgmigrations.AssetNames()) + bresource = bindata.Resource(sqlite.AssetNames(), + func(name string) ([]byte, error) { + return sqlite.Asset(name) + }) } if s.dbType == "postgres" { driver, err = postgres.WithInstance(s.db, &postgres.Config{}) - migrationsDir = "file://./server/services/store/sqlstore/migrations/postgres" + bresource = bindata.Resource(pgmigrations.AssetNames(), + func(name string) ([]byte, error) { + return pgmigrations.Asset(name) + }) } - m, err := migrate.NewWithDatabaseInstance(migrationsDir, s.dbType, driver) + + d, err := bindata.WithInstance(bresource) + if err != nil { + return err + } + + m, err := migrate.NewWithInstance("go-bindata", d, s.dbType, driver) if err != nil { return err } - // defer m.Close() err = m.Up() if err != nil && err != migrate.ErrNoChange { diff --git a/server/services/store/sqlstore/migrations/migrations.go b/server/services/store/sqlstore/migrations/migrations.go new file mode 100644 index 000000000..27ad70a64 --- /dev/null +++ b/server/services/store/sqlstore/migrations/migrations.go @@ -0,0 +1,3 @@ +//go:generate go-bindata -prefix postgres_files/ -pkg postgres -o postgres/bindata.go ./postgres_files +//go:generate go-bindata -prefix sqlite_files/ -pkg sqlite -o sqlite/bindata.go ./sqlite_files +package migrations diff --git a/server/services/store/sqlstore/migrations/postgres/bindata.go b/server/services/store/sqlstore/migrations/postgres/bindata.go new file mode 100644 index 000000000..075e107ce --- /dev/null +++ b/server/services/store/sqlstore/migrations/postgres/bindata.go @@ -0,0 +1,115 @@ +package postgres + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "strings" +) + +func bindata_read(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + return buf.Bytes(), nil +} + +var __000001_init_down_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\x09\xf2\x0f\x50\x08\x71\x74\xf2\x71\x55\x48\xca\xc9\x4f\xce\x2e\xb6\xe6\x02\x04\x00\x00\xff\xff\x45\xbe\x01\x0f\x13\x00\x00\x00") + +func _000001_init_down_sql() ([]byte, error) { + return bindata_read( + __000001_init_down_sql, + "000001_init.down.sql", + ) +} + +var __000001_init_up_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x8f\xb1\x4e\xc3\x30\x10\x86\xe7\xf8\x29\x6e\x74\xa4\x6c\x48\x2c\x4c\x6e\xb9\x82\x85\xe3\x56\xce\x15\x5a\x96\xca\xc4\x87\xb0\x30\x25\x8a\xcd\xc0\xdb\xa3\x46\x22\x43\xba\xdd\xff\xe9\xbe\x3b\xfd\x6b\x87\x8a\x10\x48\xad\x0c\x82\xde\x80\xdd\x12\xe0\x41\x77\xd4\xc1\x5b\xfa\xee\x3f\x33\x48\x51\xc5\x00\xcf\xca\xad\x1f\x95\x93\x37\xb7\x75\x23\xaa\x78\xce\x3c\x96\x93\x2f\x40\xba\xc5\x8e\x54\xbb\xa3\xd7\xc9\xb5\x7b\x63\xe0\x1e\x37\x6a\x6f\x08\xec\xf6\x45\x5e\xd6\x07\x3f\xf2\xb9\x9c\xae\xce\xe4\xfe\x83\xbf\x3c\xac\xf4\x83\xb6\xd4\x88\xaa\xfc\x0e\x0c\x84\x87\x69\x8e\x25\xcd\xe1\x3d\x72\x0a\xf9\x3f\xf5\x23\xfb\xc2\x97\xef\xb3\xf9\x33\x84\x25\x0a\x9c\x78\x81\x76\x4e\xb7\xca\x1d\xe1\x09\x8f\x20\x63\x68\x60\xee\x51\x8b\xfa\x4e\xfc\x05\x00\x00\xff\xff\xf7\x74\x9c\xd5\x0c\x01\x00\x00") + +func _000001_init_up_sql() ([]byte, error) { + return bindata_read( + __000001_init_up_sql, + "000001_init.up.sql", + ) +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + return f() + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() ([]byte, error){ + "000001_init.down.sql": _000001_init_down_sql, + "000001_init.up.sql": _000001_init_up_sql, +} +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for name := range node.Children { + rv = append(rv, name) + } + return rv, nil +} + +type _bintree_t struct { + Func func() ([]byte, error) + Children map[string]*_bintree_t +} +var _bintree = &_bintree_t{nil, map[string]*_bintree_t{ + "000001_init.down.sql": &_bintree_t{_000001_init_down_sql, map[string]*_bintree_t{ + }}, + "000001_init.up.sql": &_bintree_t{_000001_init_up_sql, map[string]*_bintree_t{ + }}, +}} diff --git a/server/services/store/sqlstore/migrations/postgres/000001_init.down.sql b/server/services/store/sqlstore/migrations/postgres_files/000001_init.down.sql similarity index 100% rename from server/services/store/sqlstore/migrations/postgres/000001_init.down.sql rename to server/services/store/sqlstore/migrations/postgres_files/000001_init.down.sql diff --git a/server/services/store/sqlstore/migrations/postgres/000001_init.up.sql b/server/services/store/sqlstore/migrations/postgres_files/000001_init.up.sql similarity index 100% rename from server/services/store/sqlstore/migrations/postgres/000001_init.up.sql rename to server/services/store/sqlstore/migrations/postgres_files/000001_init.up.sql diff --git a/server/services/store/sqlstore/migrations/sqlite/bindata.go b/server/services/store/sqlstore/migrations/sqlite/bindata.go new file mode 100644 index 000000000..6c9f047ae --- /dev/null +++ b/server/services/store/sqlstore/migrations/sqlite/bindata.go @@ -0,0 +1,115 @@ +package sqlite + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "strings" +) + +func bindata_read(data []byte, name string) ([]byte, error) { + gz, err := gzip.NewReader(bytes.NewBuffer(data)) + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + var buf bytes.Buffer + _, err = io.Copy(&buf, gz) + gz.Close() + + if err != nil { + return nil, fmt.Errorf("Read %q: %v", name, err) + } + + return buf.Bytes(), nil +} + +var __000001_init_down_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x72\x09\xf2\x0f\x50\x08\x71\x74\xf2\x71\x55\x48\xca\xc9\x4f\xce\x2e\xb6\xe6\x02\x04\x00\x00\xff\xff\x45\xbe\x01\x0f\x13\x00\x00\x00") + +func _000001_init_down_sql() ([]byte, error) { + return bindata_read( + __000001_init_down_sql, + "000001_init.down.sql", + ) +} + +var __000001_init_up_sql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x64\x8f\xbf\x6e\x83\x30\x10\x87\x67\xfc\x14\xb7\x58\x18\x89\x4c\x95\x3a\xa4\x93\x93\x1c\x8d\x55\x20\x95\xb9\xb4\x61\x8a\x28\xbe\xa8\x56\x49\x8a\xc0\x1d\xfa\xf6\x15\x91\xca\x90\x6c\xf7\xfb\x4e\xdf\xfd\x59\x5b\xd4\x84\x40\x7a\x95\x23\x98\x0c\xca\x1d\x01\x1e\x4c\x45\x15\x7c\x74\xdf\xed\xd7\x08\x4a\x44\xde\xc1\x9b\xb6\xeb\xad\xb6\xea\xe1\x31\x49\x45\xe4\x2f\x23\x0f\xe1\xd8\x04\xd8\x68\x42\x32\x05\x5e\xc5\x72\x9f\xe7\xb0\xc1\x4c\xef\x73\x52\x15\xd9\x6c\xea\xa8\x58\xd6\x0b\x79\x5e\x48\x07\x72\xbb\x94\xc5\x52\x9e\xe2\x14\xe2\x72\xf7\x1e\x27\xd3\xac\xbe\x19\xf8\x12\x8e\x77\x3b\xc6\xf6\x93\xcf\x0d\xac\xcc\xb3\x29\x29\x15\x51\xf8\xed\x19\x08\x0f\xd7\xda\x87\x6e\x0e\x27\xcf\x9d\x1b\xff\x53\x3b\x70\x13\x78\x3a\x6d\x36\x7f\x7a\x77\x8b\x1c\x77\x7c\x83\x5e\xad\x29\xb4\xad\xe1\x05\x6b\x50\xde\xa5\x30\x3f\x99\x88\xe4\x49\xfc\x05\x00\x00\xff\xff\xa2\x33\x30\x8e\x29\x01\x00\x00") + +func _000001_init_up_sql() ([]byte, error) { + return bindata_read( + __000001_init_up_sql, + "000001_init.up.sql", + ) +} + +// Asset loads and returns the asset for the given name. +// It returns an error if the asset could not be found or +// could not be loaded. +func Asset(name string) ([]byte, error) { + cannonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[cannonicalName]; ok { + return f() + } + return nil, fmt.Errorf("Asset %s not found", name) +} + +// AssetNames returns the names of the assets. +func AssetNames() []string { + names := make([]string, 0, len(_bindata)) + for name := range _bindata { + names = append(names, name) + } + return names +} + +// _bindata is a table, holding each asset generator, mapped to its name. +var _bindata = map[string]func() ([]byte, error){ + "000001_init.down.sql": _000001_init_down_sql, + "000001_init.up.sql": _000001_init_up_sql, +} +// AssetDir returns the file names below a certain +// directory embedded in the file by go-bindata. +// For example if you run go-bindata on data/... and data contains the +// following hierarchy: +// data/ +// foo.txt +// img/ +// a.png +// b.png +// then AssetDir("data") would return []string{"foo.txt", "img"} +// AssetDir("data/img") would return []string{"a.png", "b.png"} +// AssetDir("foo.txt") and AssetDir("notexist") would return an error +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + cannonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(cannonicalName, "/") + for _, p := range pathList { + node = node.Children[p] + if node == nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + } + } + if node.Func != nil { + return nil, fmt.Errorf("Asset %s not found", name) + } + rv := make([]string, 0, len(node.Children)) + for name := range node.Children { + rv = append(rv, name) + } + return rv, nil +} + +type _bintree_t struct { + Func func() ([]byte, error) + Children map[string]*_bintree_t +} +var _bintree = &_bintree_t{nil, map[string]*_bintree_t{ + "000001_init.down.sql": &_bintree_t{_000001_init_down_sql, map[string]*_bintree_t{ + }}, + "000001_init.up.sql": &_bintree_t{_000001_init_up_sql, map[string]*_bintree_t{ + }}, +}} diff --git a/server/services/store/sqlstore/migrations/sqlite/000001_init.down.sql b/server/services/store/sqlstore/migrations/sqlite_files/000001_init.down.sql similarity index 100% rename from server/services/store/sqlstore/migrations/sqlite/000001_init.down.sql rename to server/services/store/sqlstore/migrations/sqlite_files/000001_init.down.sql diff --git a/server/services/store/sqlstore/migrations/sqlite/000001_init.up.sql b/server/services/store/sqlstore/migrations/sqlite_files/000001_init.up.sql similarity index 100% rename from server/services/store/sqlstore/migrations/sqlite/000001_init.up.sql rename to server/services/store/sqlstore/migrations/sqlite_files/000001_init.up.sql diff --git a/server/services/store/sqlstore/sqlstore.go b/server/services/store/sqlstore/sqlstore.go index 457ad5bb4..9c6715212 100644 --- a/server/services/store/sqlstore/sqlstore.go +++ b/server/services/store/sqlstore/sqlstore.go @@ -33,7 +33,6 @@ func New(dbType, connectionString string) (*SQLStore, error) { dbType: dbType, } - // err = store.createTablesIfNotExists() err = store.Migrate() if err != nil { log.Println(`Table creation failed`) diff --git a/server/services/store/sqlstore/sqlstore_test.go b/server/services/store/sqlstore/sqlstore_test.go new file mode 100644 index 000000000..a2166739e --- /dev/null +++ b/server/services/store/sqlstore/sqlstore_test.go @@ -0,0 +1,27 @@ +package sqlstore + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func SetupTests(t *testing.T) (*SQLStore, func()) { + dbType := os.Getenv("OT_STORE_TEST_DB_TYPE") + if dbType == "" { + dbType = "sqlite3" + } + connectionString := os.Getenv("OT_STORE_TEST_CONN_STRING") + if connectionString == "" { + connectionString = ":memory:" + } + + store, err := New(dbType, connectionString) + require.Nil(t, err) + + tearDown := func() { + store.Shutdown() + } + return store, tearDown +}