mirror of https://github.com/pressly/goose.git
196 lines
5.3 KiB
Go
196 lines
5.3 KiB
Go
package integration
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/pressly/goose/v3/database"
|
|
"github.com/pressly/goose/v3/internal/testing/testdb"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestPostgres(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup, err := testdb.NewPostgres()
|
|
require.NoError(t, err)
|
|
t.Cleanup(cleanup)
|
|
require.NoError(t, db.Ping())
|
|
|
|
testDatabase(t, database.DialectPostgres, db, "testdata/migrations/postgres")
|
|
}
|
|
|
|
func TestClickhouse(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup, err := testdb.NewClickHouse()
|
|
require.NoError(t, err)
|
|
t.Cleanup(cleanup)
|
|
require.NoError(t, db.Ping())
|
|
|
|
testDatabase(t, database.DialectClickHouse, db, "testdata/migrations/clickhouse")
|
|
|
|
type result struct {
|
|
customerID string `db:"customer_id"`
|
|
timestamp time.Time `db:"time_stamp"`
|
|
clickEventType string `db:"click_event_type"`
|
|
countryCode string `db:"country_code"`
|
|
sourceID int64 `db:"source_id"`
|
|
}
|
|
rows, err := db.Query(`SELECT * FROM clickstream ORDER BY customer_id`)
|
|
require.NoError(t, err)
|
|
var results []result
|
|
for rows.Next() {
|
|
var r result
|
|
err = rows.Scan(&r.customerID, &r.timestamp, &r.clickEventType, &r.countryCode, &r.sourceID)
|
|
require.NoError(t, err)
|
|
results = append(results, r)
|
|
}
|
|
require.Equal(t, len(results), 3)
|
|
require.NoError(t, rows.Close())
|
|
require.NoError(t, rows.Err())
|
|
|
|
parseTime := func(t *testing.T, s string) time.Time {
|
|
t.Helper()
|
|
tm, err := time.Parse("2006-01-02", s)
|
|
require.NoError(t, err)
|
|
return tm
|
|
}
|
|
want := []result{
|
|
{"customer1", parseTime(t, "2021-10-02"), "add_to_cart", "US", 568239},
|
|
{"customer2", parseTime(t, "2021-10-30"), "remove_from_cart", "", 0},
|
|
{"customer3", parseTime(t, "2021-11-07"), "checkout", "", 307493},
|
|
}
|
|
for i, result := range results {
|
|
require.Equal(t, result.customerID, want[i].customerID)
|
|
require.Equal(t, result.timestamp, want[i].timestamp)
|
|
require.Equal(t, result.clickEventType, want[i].clickEventType)
|
|
if result.countryCode != "" && want[i].countryCode != "" {
|
|
require.Equal(t, result.countryCode, want[i].countryCode)
|
|
}
|
|
require.Equal(t, result.sourceID, want[i].sourceID)
|
|
}
|
|
}
|
|
|
|
func TestClickhouseRemote(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup, err := testdb.NewClickHouse()
|
|
require.NoError(t, err)
|
|
t.Cleanup(cleanup)
|
|
require.NoError(t, db.Ping())
|
|
testDatabase(t, database.DialectClickHouse, db, "testdata/migrations/clickhouse-remote")
|
|
|
|
// assert that the taxi_zone_dictionary table has been created and populated
|
|
var count int
|
|
err = db.QueryRow(`SELECT count(*) FROM taxi_zone_dictionary`).Scan(&count)
|
|
require.NoError(t, err)
|
|
require.Equal(t, 265, count)
|
|
}
|
|
|
|
func TestMySQL(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup, err := testdb.NewMariaDB()
|
|
require.NoError(t, err)
|
|
t.Cleanup(cleanup)
|
|
require.NoError(t, db.Ping())
|
|
|
|
testDatabase(t, database.DialectMySQL, db, "testdata/migrations/mysql")
|
|
}
|
|
|
|
func TestTurso(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup, err := testdb.NewTurso()
|
|
require.NoError(t, err)
|
|
t.Cleanup(cleanup)
|
|
require.NoError(t, db.Ping())
|
|
|
|
testDatabase(t, database.DialectTurso, db, "testdata/migrations/turso")
|
|
}
|
|
|
|
func TestVertica(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup, err := testdb.NewVertica()
|
|
require.NoError(t, err)
|
|
t.Cleanup(cleanup)
|
|
require.NoError(t, db.Ping())
|
|
|
|
testDatabase(t, database.DialectVertica, db, "testdata/migrations/vertica")
|
|
|
|
type result struct {
|
|
TestKey int64 `db:"test_key"`
|
|
TestID string `db:"test_id"`
|
|
ValidFrom time.Time `db:"valid_from"`
|
|
ValidTo time.Time `db:"valid_to"`
|
|
IsCurrent bool `db:"is_current"`
|
|
ExternalID string `db:"external_id"`
|
|
}
|
|
rows, err := db.Query(`SELECT * FROM testing.dim_test_scd ORDER BY test_key`)
|
|
require.NoError(t, err)
|
|
var results []result
|
|
for rows.Next() {
|
|
var r result
|
|
err = rows.Scan(&r.TestKey, &r.TestID, &r.ValidFrom, &r.ValidTo, &r.IsCurrent, &r.ExternalID)
|
|
require.NoError(t, err)
|
|
results = append(results, r)
|
|
}
|
|
require.Equal(t, len(results), 3)
|
|
require.NoError(t, rows.Close())
|
|
require.NoError(t, rows.Err())
|
|
|
|
parseTime := func(t *testing.T, s string) time.Time {
|
|
t.Helper()
|
|
tm, err := time.Parse("2006-01-02", s)
|
|
require.NoError(t, err)
|
|
return tm
|
|
}
|
|
want := []result{
|
|
{
|
|
TestKey: 1,
|
|
TestID: "575a0dd4-bd97-44ac-aae0-987090181da8",
|
|
ValidFrom: parseTime(t, "2021-10-02"),
|
|
ValidTo: parseTime(t, "2021-10-03"),
|
|
IsCurrent: false,
|
|
ExternalID: "123",
|
|
},
|
|
{
|
|
TestKey: 2,
|
|
TestID: "575a0dd4-bd97-44ac-aae0-987090181da8",
|
|
ValidFrom: parseTime(t, "2021-10-03"),
|
|
ValidTo: parseTime(t, "2021-10-04"),
|
|
IsCurrent: false,
|
|
ExternalID: "456",
|
|
},
|
|
{
|
|
TestKey: 3,
|
|
TestID: "575a0dd4-bd97-44ac-aae0-987090181da8",
|
|
ValidFrom: parseTime(t, "2021-10-04"),
|
|
ValidTo: parseTime(t, "9999-12-31"),
|
|
IsCurrent: true,
|
|
ExternalID: "789",
|
|
},
|
|
}
|
|
for i, result := range results {
|
|
require.Equal(t, result.TestKey, want[i].TestKey)
|
|
require.Equal(t, result.TestID, want[i].TestID)
|
|
require.Equal(t, result.ValidFrom, want[i].ValidFrom)
|
|
require.Equal(t, result.ValidTo, want[i].ValidTo)
|
|
require.Equal(t, result.IsCurrent, want[i].IsCurrent)
|
|
require.Equal(t, result.ExternalID, want[i].ExternalID)
|
|
}
|
|
}
|
|
|
|
func TestYDB(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
db, cleanup, err := testdb.NewYdb()
|
|
require.NoError(t, err)
|
|
t.Cleanup(cleanup)
|
|
require.NoError(t, db.Ping())
|
|
|
|
testDatabase(t, database.DialectYdB, db, "testdata/migrations/ydb")
|
|
}
|