xorm/tests/ydbtest/session_rows_test.go

189 lines
4.4 KiB
Go
Raw Normal View History

package ydb
import (
"database/sql"
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"xorm.io/xorm"
)
func TestRowsStruct(t *testing.T) {
assert.NoError(t, PrepareScheme(&Users{}))
engine, err := enginePool.GetDataQueryEngine()
assert.NoError(t, err)
assert.NotNil(t, engine)
users := getUsersData()
session := engine.NewSession()
defer session.Close()
_, err = session.Insert(users)
assert.NoError(t, err)
rows, err := session.Asc("user_id").Rows(&Users{})
assert.NoError(t, err)
defer rows.Close()
for i := 0; rows.Next(); i++ {
var user Users
assert.NoError(t, rows.Scan(&user))
assert.Equal(t, users[i].UserID, user.UserID)
assert.Equal(t, users[i].Number, user.Number)
}
}
func TestRowsCond(t *testing.T) {
assert.NoError(t, PrepareScheme(&Users{}))
engine, err := enginePool.GetDataQueryEngine()
assert.NoError(t, err)
assert.NotNil(t, engine)
users := getUsersData()
session := engine.NewSession()
defer session.Close()
_, err = session.Insert(users)
assert.NoError(t, err)
result, err := engine.Transaction(func(session *xorm.Session) (interface{}, error) {
rows, err := session.
Cols("user_id", "number", "name", "age").
Where("user_id >= ?", sql.NullInt64{Int64: 5, Valid: true}).
Where("user_id < ?", sql.NullInt64{Int64: 10, Valid: true}).
Asc("user_id").
Rows(&Users{})
if err != nil {
return nil, err
}
return rows, nil
})
assert.NoError(t, err)
rows, ok := result.(*xorm.Rows)
assert.True(t, ok)
assert.NotNil(t, rows)
defer rows.Close()
for i := 5; rows.Next(); i++ {
var (
userID int64
number string
name string
age uint32
)
assert.NoError(t, rows.Scan(&userID, &number, &name, &age))
assert.Equal(t, users[i].UserID.Int64, userID)
assert.Equal(t, users[i].Number, number)
assert.Equal(t, users[i].Name, name)
assert.Equal(t, users[i].Age, age)
}
}
func TestRowsRawYQL(t *testing.T) {
assert.NoError(t, PrepareScheme(&Users{}))
engine, err := enginePool.GetDataQueryEngine()
assert.NoError(t, err)
assert.NotNil(t, engine)
users := getUsersData()
session := engine.NewSession()
defer session.Close()
_, err = session.Insert(users)
assert.NoError(t, err)
rows, err := session.SQL(`
SELECT user_id, number, age, created_at FROM users
ORDER BY created_at DESC, age ASC
LIMIT 10 OFFSET 5;
`).
Rows(&Users{})
assert.NoError(t, err)
assert.NotNil(t, rows)
defer rows.Close()
for rows.Next() {
var user Users
assert.NoError(t, rows.Scan(&user))
}
}
func TestRowsOverManyResultSet(t *testing.T) {
assert.NoError(t, PrepareScheme(&Series{}, &Seasons{}, &Episodes{}))
engine, err := enginePool.GetDataQueryEngine()
assert.NoError(t, err)
assert.NotNil(t, engine)
session := engine.NewSession()
defer session.Close()
series, seasons, episodes := getData()
_, err = engine.Transaction(func(session *xorm.Session) (interface{}, error) {
_, err := session.Insert(&series)
if err != nil {
return nil, err
}
_, err = session.Insert(&seasons)
if err != nil {
return nil, err
}
_, err = session.Insert(&episodes)
if err != nil {
return nil, err
}
return nil, nil
})
assert.NoError(t, err)
query := fmt.Sprintf("SELECT * FROM `%s`; SELECT * FROM `%s`; SELECT * FROM `%s`;",
(&Series{}).TableName(),
(&Seasons{}).TableName(),
(&Episodes{}).TableName())
rows, err := session.DB().QueryContext(enginePool.ctx, query)
assert.NoError(t, err)
expectedColumns := [][]string{
{"series_id", "title", "series_info", "release_date", "comment"},
{"series_id", "season_id", "title", "first_aired", "last_aired"},
{"series_id", "season_id", "episode_id", "title", "air_date", "views"},
}
expectedTypes := [][]string{
{"String", "Utf8", "Utf8", "Timestamp", "Utf8"},
{"String", "String", "Utf8", "Timestamp", "Timestamp"},
{"String", "String", "String", "Utf8", "Timestamp", "Uint64"},
}
for i := 0; rows.NextResultSet(); i++ {
for rows.Next() {
columns, err := rows.Columns()
assert.NoError(t, err)
assert.ElementsMatch(t, expectedColumns[i], columns)
var types []string
li, err := rows.ColumnTypes()
assert.NoError(t, err)
for _, val := range li {
tp := val.DatabaseTypeName()
if strings.HasPrefix(tp, "Optional") {
tp = strings.TrimPrefix(tp, "Optional<")
tp = strings.TrimSuffix(tp, ">")
}
types = append(types, tp)
}
assert.ElementsMatch(t, expectedTypes[i], types)
}
}
}