1
0
mirror of https://github.com/VinGarcia/ksql.git synced 2025-04-28 05:32:47 +00:00

Refactor tests so the error descriptions are more clear

This commit is contained in:
Vinícius Garcia 2022-02-28 22:47:36 -03:00
parent ea4f56fadd
commit a51e9730c3

@ -94,15 +94,17 @@ func RunTestsForAdapter(t *testing.T, config testConfig) {
return db, close return db, close
} }
QueryTest(t, config, newDBAdapter) t.Run(config.adapterName+"."+config.driver, func(t *testing.T) {
QueryOneTest(t, config, newDBAdapter) QueryTest(t, config, newDBAdapter)
QueryOneTest(t, config, newDBAdapter) QueryOneTest(t, config, newDBAdapter)
InsertTest(t, config, newDBAdapter) QueryOneTest(t, config, newDBAdapter)
DeleteTest(t, config, newDBAdapter) InsertTest(t, config, newDBAdapter)
UpdateTest(t, config, newDBAdapter) DeleteTest(t, config, newDBAdapter)
QueryChunksTest(t, config, newDBAdapter) UpdateTest(t, config, newDBAdapter)
TransactionTest(t, config, newDBAdapter) QueryChunksTest(t, config, newDBAdapter)
ScanRowsTest(t, config, newDBAdapter) TransactionTest(t, config, newDBAdapter)
ScanRowsTest(t, config, newDBAdapter)
})
} }
func QueryTest( func QueryTest(
@ -110,7 +112,7 @@ func QueryTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run(config.driver, func(t *testing.T) { t.Run("QueryTest", func(t *testing.T) {
variations := []struct { variations := []struct {
desc string desc string
queryPrefix string queryPrefix string
@ -506,7 +508,7 @@ func QueryOneTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run(config.driver, func(t *testing.T) { t.Run("QueryOne", func(t *testing.T) {
variations := []struct { variations := []struct {
desc string desc string
queryPrefix string queryPrefix string
@ -685,7 +687,7 @@ func InsertTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run(config.driver, func(t *testing.T) { t.Run("Insert", func(t *testing.T) {
t.Run("success cases", func(t *testing.T) { t.Run("success cases", func(t *testing.T) {
t.Run("single primary key tables", func(t *testing.T) { t.Run("single primary key tables", func(t *testing.T) {
err := createTables(config.driver) err := createTables(config.driver)
@ -1021,7 +1023,7 @@ func DeleteTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run(config.driver, func(t *testing.T) { t.Run("Delete", func(t *testing.T) {
err := createTables(config.driver) err := createTables(config.driver)
if err != nil { if err != nil {
t.Fatal("could not create test table!, reason:", err.Error()) t.Fatal("could not create test table!, reason:", err.Error())
@ -1323,7 +1325,7 @@ func UpdateTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run(config.driver, func(t *testing.T) { t.Run("Update", func(t *testing.T) {
err := createTables(config.driver) err := createTables(config.driver)
if err != nil { if err != nil {
t.Fatal("could not create test table!, reason:", err.Error()) t.Fatal("could not create test table!, reason:", err.Error())
@ -1508,7 +1510,7 @@ func QueryChunksTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run(config.driver, func(t *testing.T) { t.Run("QueryChunks", func(t *testing.T) {
variations := []struct { variations := []struct {
desc string desc string
queryPrefix string queryPrefix string
@ -2022,7 +2024,7 @@ func TransactionTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run(config.driver, func(t *testing.T) { t.Run("Transaction", func(t *testing.T) {
t.Run("should query a single row correctly", func(t *testing.T) { t.Run("should query a single row correctly", func(t *testing.T) {
err := createTables(config.driver) err := createTables(config.driver)
if err != nil { if err != nil {
@ -2094,134 +2096,136 @@ func ScanRowsTest(
config testConfig, config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer), newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) { ) {
t.Run("should scan users correctly", func(t *testing.T) { t.Run("ScanRows", func(t *testing.T) {
err := createTables(config.driver) t.Run("should scan users correctly", func(t *testing.T) {
if err != nil { err := createTables(config.driver)
t.Fatal("could not create test table!, reason:", err.Error()) if err != nil {
} t.Fatal("could not create test table!, reason:", err.Error())
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
c := newTestDB(db, config.driver)
_ = c.Insert(ctx, UsersTable, &User{Name: "User1", Age: 22})
_ = c.Insert(ctx, UsersTable, &User{Name: "User2", Age: 14})
_ = c.Insert(ctx, UsersTable, &User{Name: "User3", Age: 43})
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
assert.Equal(t, nil, err)
defer rows.Close()
assert.Equal(t, true, rows.Next())
var u User
err = scanRows(dialect, rows, &u)
assert.Equal(t, nil, err)
assert.Equal(t, "User2", u.Name)
assert.Equal(t, 14, u.Age)
})
t.Run("should ignore extra columns from query", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
c := newTestDB(db, config.driver)
_ = c.Insert(ctx, UsersTable, &User{Name: "User1", Age: 22})
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User1'")
assert.Equal(t, nil, err)
defer rows.Close()
assert.Equal(t, true, rows.Next())
var user struct {
ID int `ksql:"id"`
Age int `ksql:"age"`
// Omitted for testing purposes:
// Name string `ksql:"name"`
}
err = scanRows(dialect, rows, &user)
assert.Equal(t, nil, err)
assert.Equal(t, 22, user.Age)
})
t.Run("should report error for closed rows", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
assert.Equal(t, nil, err)
var u User
err = rows.Close()
assert.Equal(t, nil, err)
err = scanRows(dialect, rows, &u)
assert.NotEqual(t, nil, err)
})
t.Run("should report if record is not a pointer", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
tt.AssertNoErr(t, err)
// Some drivers will hang forever if Next() is not called:
defer func() {
for rows.Next() {
} }
}()
var u User dialect := supportedDialects[config.driver]
err = scanRows(dialect, rows, u) ctx := context.TODO()
tt.AssertErrContains(t, err, "ksql", "expected", "pointer to struct", "User") db, closer := newDBAdapter(t)
}) defer closer.Close()
c := newTestDB(db, config.driver)
_ = c.Insert(ctx, UsersTable, &User{Name: "User1", Age: 22})
_ = c.Insert(ctx, UsersTable, &User{Name: "User2", Age: 14})
_ = c.Insert(ctx, UsersTable, &User{Name: "User3", Age: 43})
t.Run("should report if record is not a pointer to struct", func(t *testing.T) { rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
err := createTables(config.driver) assert.Equal(t, nil, err)
if err != nil { defer rows.Close()
t.Fatal("could not create test table!, reason:", err.Error())
}
dialect := supportedDialects[config.driver] assert.Equal(t, true, rows.Next())
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'") var u User
tt.AssertNoErr(t, err) err = scanRows(dialect, rows, &u)
// Some drivers will hang forever if Next() is not called: assert.Equal(t, nil, err)
defer func() {
for rows.Next() { assert.Equal(t, "User2", u.Name)
assert.Equal(t, 14, u.Age)
})
t.Run("should ignore extra columns from query", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
} }
}()
var u map[string]interface{} dialect := supportedDialects[config.driver]
err = scanRows(dialect, rows, &u) ctx := context.TODO()
tt.AssertErrContains(t, err, "ksql", "expected", "pointer to struct", "map[string]interface") db, closer := newDBAdapter(t)
defer closer.Close()
c := newTestDB(db, config.driver)
_ = c.Insert(ctx, UsersTable, &User{Name: "User1", Age: 22})
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User1'")
assert.Equal(t, nil, err)
defer rows.Close()
assert.Equal(t, true, rows.Next())
var user struct {
ID int `ksql:"id"`
Age int `ksql:"age"`
// Omitted for testing purposes:
// Name string `ksql:"name"`
}
err = scanRows(dialect, rows, &user)
assert.Equal(t, nil, err)
assert.Equal(t, 22, user.Age)
})
t.Run("should report error for closed rows", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
assert.Equal(t, nil, err)
var u User
err = rows.Close()
assert.Equal(t, nil, err)
err = scanRows(dialect, rows, &u)
assert.NotEqual(t, nil, err)
})
t.Run("should report if record is not a pointer", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
tt.AssertNoErr(t, err)
// Some drivers will hang forever if Next() is not called:
defer func() {
for rows.Next() {
}
}()
var u User
err = scanRows(dialect, rows, u)
tt.AssertErrContains(t, err, "ksql", "expected", "pointer to struct", "User")
})
t.Run("should report if record is not a pointer to struct", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
tt.AssertNoErr(t, err)
// Some drivers will hang forever if Next() is not called:
defer func() {
for rows.Next() {
}
}()
var u map[string]interface{}
err = scanRows(dialect, rows, &u)
tt.AssertErrContains(t, err, "ksql", "expected", "pointer to struct", "map[string]interface")
})
}) })
} }