package scopes import ( tbase "testing" "git.sr.ht/~cco/go-scopes/common/testing" "git.sr.ht/~cco/go-scopes/core/message" msgstore "git.sr.ht/~cco/go-scopes/storage/message" "git.sr.ht/~cco/go-scopes/storage/sql" _ "git.sr.ht/~cco/go-scopes/storage/sql/pgsql" _ "git.sr.ht/~cco/go-scopes/storage/sql/sqlite" "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) 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) { MsgstoreTest(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 MsgstoreTest(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.Exec(sqlite_create_table) } func resetPgsql(db *sql.Storage) { db.DropTable("test") 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)` )