dbmate/pkg/dbutil/dbutil_test.go
Adrian Macneil 61771e386d
Refactor drivers into separate packages (#179)
`dbmate` package was starting to get a bit polluted. This PR migrates each driver into a separate package, with clean separation between each.

In addition:

* Drivers are now initialized with a URL, avoiding the need to pass `*url.URL` to every method
* Sqlite supports a cleaner syntax for relative paths
* Driver tests now load their test URL from environment variables

Public API of `dbmate` package has not changed (no changes to `main` package).
2020-11-19 15:04:42 +13:00

58 lines
1.4 KiB
Go

package dbutil_test
import (
"database/sql"
"testing"
"github.com/amacneil/dbmate/pkg/dbutil"
_ "github.com/mattn/go-sqlite3" // database/sql driver
"github.com/stretchr/testify/require"
)
func TestDatabaseName(t *testing.T) {
t.Run("valid", func(t *testing.T) {
u := dbutil.MustParseURL("foo://host/dbname?query")
name := dbutil.DatabaseName(u)
require.Equal(t, "dbname", name)
})
t.Run("empty", func(t *testing.T) {
u := dbutil.MustParseURL("foo://host")
name := dbutil.DatabaseName(u)
require.Equal(t, "", name)
})
}
func TestTrimLeadingSQLComments(t *testing.T) {
in := "--\n" +
"-- foo\n\n" +
"-- bar\n\n" +
"real stuff\n" +
"-- end\n"
out, err := dbutil.TrimLeadingSQLComments([]byte(in))
require.NoError(t, err)
require.Equal(t, "real stuff\n-- end\n", string(out))
}
// connect to in-memory sqlite database for testing
const sqliteMemoryDB = "file:dbutil.sqlite3?mode=memory&cache=shared"
func TestQueryColumn(t *testing.T) {
db, err := sql.Open("sqlite3", sqliteMemoryDB)
require.NoError(t, err)
val, err := dbutil.QueryColumn(db, "select 'foo_' || val from (select ? as val union select ?)",
"hi", "there")
require.NoError(t, err)
require.Equal(t, []string{"foo_hi", "foo_there"}, val)
}
func TestQueryValue(t *testing.T) {
db, err := sql.Open("sqlite3", sqliteMemoryDB)
require.NoError(t, err)
val, err := dbutil.QueryValue(db, "select $1 + $2", "5", 2)
require.NoError(t, err)
require.Equal(t, "7", val)
}