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)` )