github.com/kaleido-io/firefly@v0.0.0-20210622132723-8b4b6aacb971/internal/database/sqlcommon/provider_ql_test.go (about) 1 // Copyright © 2021 Kaleido, Inc. 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package sqlcommon 18 19 import ( 20 "context" 21 "database/sql" 22 "fmt" 23 "testing" 24 25 sq "github.com/Masterminds/squirrel" 26 migratedb "github.com/golang-migrate/migrate/v4/database" 27 "github.com/golang-migrate/migrate/v4/database/ql" 28 "github.com/kaleido-io/firefly/internal/config" 29 "github.com/kaleido-io/firefly/mocks/databasemocks" 30 "github.com/kaleido-io/firefly/pkg/database" 31 "github.com/stretchr/testify/assert" 32 33 // Import the QL driver 34 _ "modernc.org/ql/driver" 35 ) 36 37 // qlTestProvider uses QL in-memory database 38 type qlTestProvider struct { 39 SQLCommon 40 41 prefix config.Prefix 42 t *testing.T 43 callbacks *databasemocks.Callbacks 44 capabilities *database.Capabilities 45 } 46 47 // newTestProvider creates a real in-memory database provider for e2e testing 48 func newQLTestProvider(t *testing.T) *qlTestProvider { 49 tp := &qlTestProvider{ 50 t: t, 51 callbacks: &databasemocks.Callbacks{}, 52 capabilities: &database.Capabilities{}, 53 prefix: config.NewPluginConfig("unittest.db"), 54 } 55 tp.SQLCommon.InitPrefix(tp, tp.prefix) 56 tp.prefix.Set(SQLConfDatasourceURL, "memory://") 57 tp.prefix.Set(SQLConfMigrationsAuto, true) 58 tp.prefix.Set(SQLConfMigrationsDirectory, "../../../db/migrations/ql") 59 60 err := tp.Init(context.Background(), tp, tp.prefix, tp.callbacks, tp.capabilities) 61 assert.NoError(tp.t, err) 62 63 return tp 64 } 65 66 func (tp *qlTestProvider) Name() string { 67 return "ql" 68 } 69 70 func (tp *qlTestProvider) PlaceholderFormat() sq.PlaceholderFormat { 71 return sq.Dollar 72 } 73 74 func (tp *qlTestProvider) UpdateInsertForSequenceReturn(insert sq.InsertBuilder) (sq.InsertBuilder, bool) { 75 // Nothing required - QL supports the query for returning the generated ID, and we use that for the sequence 76 return insert, false 77 } 78 79 func (tp *qlTestProvider) SequenceField(tableName string) string { 80 return fmt.Sprintf("id(%s)", tableName) 81 } 82 83 func (tp *qlTestProvider) Open(url string) (*sql.DB, error) { 84 return sql.Open("ql", url) 85 } 86 87 func (tp *qlTestProvider) GetMigrationDriver(db *sql.DB) (migratedb.Driver, error) { 88 return ql.WithInstance(db, &ql.Config{}) 89 }