go-scopes/tests/storage_test.go

111 lines
2.8 KiB
Go

package scopes
import (
tbase "testing"
lib "git.sr.ht/~cco/go-scopes"
"git.sr.ht/~cco/go-scopes/common/testing"
"git.sr.ht/~cco/go-scopes/core/message"
sql "git.sr.ht/~cco/go-scopes/storage"
"git.sr.ht/~cco/go-scopes/storage/db/pgsql"
_ "git.sr.ht/~cco/go-scopes/storage/db/sqlite"
msgstore "git.sr.ht/~cco/go-scopes/storage/message"
"git.sr.ht/~cco/go-scopes/storage/tracking"
"git.sr.ht/~cco/go-scopes/tests/etc"
)
func TestSqlite(tb *tbase.T) {
t := testing.SetUp(tb)
cfg := etc.ConfigSqlite()
db := sql.Open(cfg)
resetSqlite(db)
DoTests(t, cfg, db)
}
func TestPgsql(tb *tbase.T) {
t := testing.SetUp(tb)
cfg := etc.ConfigPgsql()
db := sql.Open(cfg)
db.Params["idType"] = pgsql.IdType
db.Params["jsonType"] = pgsql.JsonType
resetPgsql(db)
DoTests(t, cfg, db)
}
func DoTests(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
t.Run("base", func(t *testing.T) { BaseTest(t, cfg, db) })
t.Run("message", func(t *testing.T) { MessageTest(t, cfg, db) })
t.Run("tracking", func(t *testing.T) { TrackingTest(t, cfg, db) })
}
type greet struct {
id int64
label string
}
func (g greet) Scan(rows *sql.Rows) (greet, error) {
err := rows.Scan(&g.id, &g.label)
return g, err
}
func (g *greet) ScanP(rows *sql.Rows) error {
return rows.Scan(&g.id, &g.label)
}
func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
db.Exec(sql_insert)
//data := sql.QueryCol[string](db, query, 2)
data := sql.QueryData[greet](db, sql_query)
t.AssertEqual(len(data), 2)
t.AssertEqual(data[0].label, "Hello World")
t.AssertEqual(data[1].label, "Good Afternoon")
data = sql.QueryDataP[*greet](db, sql_query)
t.AssertEqual(len(data), 2)
t.AssertEqual(data[0].label, "Hello World")
t.AssertEqual(data[1].label, "Good Afternoon")
}
func TrackingTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
cont := tracking.SimpleContainer(db)
cont.CreateTable()
track := tracking.SimpleTrack("t01", "john", lib.Map{})
cont.Insert(&track)
t.AssertEqual(track.TrackId(), lib.Ident(1))
}
func MessageTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
msg := message.SimpleMessage("data")
msgstore.StoreDB(db, msg)
}
func resetSqlite(db *sql.Storage) {
db.DropTable("test")
db.DropTable("tracks")
db.Exec(sqlite_create_table)
}
func resetPgsql(db *sql.Storage) {
db.DropTable("test")
db.DropTable("testing.tracks")
db.Exec(pgsql_create_table)
}
// SQL statements
const (
sql_insert = `insert into test (label) values
('Hello World'),
('Good Afternoon')`
sql_query = `select id, label from test ` //where id = $1`
// database-specific SQL statements
// note: ... integer ... primary key ... automatically fills row sequentially
sqlite_create_table = `create table test (
id integer not null primary key,
label text)`
pgsql_create_table = `create table test (
id serial not null primary key,
label text)`
)