Refactor tests so the error descriptions are more clear

pull/16/head
Vinícius Garcia 2022-02-28 22:47:36 -03:00
parent ea4f56fadd
commit a51e9730c3
1 changed files with 141 additions and 137 deletions

View File

@ -94,15 +94,17 @@ func RunTestsForAdapter(t *testing.T, config testConfig) {
return db, close
}
QueryTest(t, config, newDBAdapter)
QueryOneTest(t, config, newDBAdapter)
QueryOneTest(t, config, newDBAdapter)
InsertTest(t, config, newDBAdapter)
DeleteTest(t, config, newDBAdapter)
UpdateTest(t, config, newDBAdapter)
QueryChunksTest(t, config, newDBAdapter)
TransactionTest(t, config, newDBAdapter)
ScanRowsTest(t, config, newDBAdapter)
t.Run(config.adapterName+"."+config.driver, func(t *testing.T) {
QueryTest(t, config, newDBAdapter)
QueryOneTest(t, config, newDBAdapter)
QueryOneTest(t, config, newDBAdapter)
InsertTest(t, config, newDBAdapter)
DeleteTest(t, config, newDBAdapter)
UpdateTest(t, config, newDBAdapter)
QueryChunksTest(t, config, newDBAdapter)
TransactionTest(t, config, newDBAdapter)
ScanRowsTest(t, config, newDBAdapter)
})
}
func QueryTest(
@ -110,7 +112,7 @@ func QueryTest(
config testConfig,
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 {
desc string
queryPrefix string
@ -506,7 +508,7 @@ func QueryOneTest(
config testConfig,
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 {
desc string
queryPrefix string
@ -685,7 +687,7 @@ func InsertTest(
config testConfig,
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("single primary key tables", func(t *testing.T) {
err := createTables(config.driver)
@ -1021,7 +1023,7 @@ func DeleteTest(
config testConfig,
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)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
@ -1323,7 +1325,7 @@ func UpdateTest(
config testConfig,
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)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
@ -1508,7 +1510,7 @@ func QueryChunksTest(
config testConfig,
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 {
desc string
queryPrefix string
@ -2022,7 +2024,7 @@ func TransactionTest(
config testConfig,
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) {
err := createTables(config.driver)
if err != nil {
@ -2094,134 +2096,136 @@ func ScanRowsTest(
config testConfig,
newDBAdapter func(t *testing.T) (DBAdapter, io.Closer),
) {
t.Run("should scan users correctly", 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})
_ = 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() {
t.Run("ScanRows", func(t *testing.T) {
t.Run("should scan users correctly", func(t *testing.T) {
err := createTables(config.driver)
if err != nil {
t.Fatal("could not create test table!, reason:", err.Error())
}
}()
var u User
err = scanRows(dialect, rows, u)
tt.AssertErrContains(t, err, "ksql", "expected", "pointer to struct", "User")
})
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})
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())
}
rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'")
assert.Equal(t, nil, err)
defer rows.Close()
dialect := supportedDialects[config.driver]
ctx := context.TODO()
db, closer := newDBAdapter(t)
defer closer.Close()
assert.Equal(t, true, rows.Next())
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)
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())
}
}()
var u map[string]interface{}
err = scanRows(dialect, rows, &u)
tt.AssertErrContains(t, err, "ksql", "expected", "pointer to struct", "map[string]interface")
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
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")
})
})
}