package scopes import ( tbase "testing" "time" lib "git.sr.ht/~cco/go-scopes" "git.sr.ht/~cco/go-scopes/common/testing" 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" "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.Tracks(db) cont.CreateTable() track := cont.NewTrack(lib.StrSlice{"t01", "john"}, lib.Map{}, nil) t.AssertEqual(track.TrackId(), lib.Ident(1)) t.AssertEqual(track.TimeStamp().Year(), time.Now().Year()) //fmt.Printf("%+v\n", track.TimeStamp()) tr2 := cont.Query(lib.StrSlice{"", "john"}) _ = tr2 } func MessageTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) { //msg := message.SimpleMessage("data") //msgstore.StoreDB(db, msg) cont := message.Messages(db) cont.CreateTable() msg := message.New(cont, "", "data") t.AssertEqual(msg.TrackId(), lib.Ident(1)) t.AssertEqual(msg.Domain(), "scopes") } func resetSqlite(db *sql.Storage) { db.DropTable("test") db.DropTable("tracks") db.DropTable("messages") db.Exec(sqlite_create_table) } func resetPgsql(db *sql.Storage) { db.DropTable("test") db.DropTable("testing.tracks") db.DropTable("testing.messages") 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)` )