Skip to content

Commit 7dc3cc6

Browse files
committed
test: add CatalogDB/CatalogTx interface contract tests
1 parent ce0750d commit 7dc3cc6

1 file changed

Lines changed: 137 additions & 0 deletions

File tree

mdl/catalog/catalogdb_test.go

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
//go:build !js
4+
5+
package catalog
6+
7+
import (
8+
"database/sql"
9+
"testing"
10+
)
11+
12+
// TestCatalogDBContract verifies that SqliteCatalogDB satisfies the CatalogDB
13+
// interface contract: basic CRUD, transactions, and cleanup.
14+
func TestCatalogDBContract(t *testing.T) {
15+
db, err := NewSqliteCatalogDB()
16+
if err != nil {
17+
t.Fatalf("NewSqliteCatalogDB: %v", err)
18+
}
19+
defer db.Close()
20+
21+
// Exec — create a table.
22+
_, err = db.Exec("CREATE TABLE test_contract (id INTEGER PRIMARY KEY, name TEXT)")
23+
if err != nil {
24+
t.Fatalf("Exec CREATE TABLE: %v", err)
25+
}
26+
27+
// Exec — insert a row.
28+
res, err := db.Exec("INSERT INTO test_contract (id, name) VALUES (?, ?)", 1, "alpha")
29+
if err != nil {
30+
t.Fatalf("Exec INSERT: %v", err)
31+
}
32+
n, err := res.RowsAffected()
33+
if err != nil {
34+
t.Fatalf("RowsAffected: %v", err)
35+
}
36+
if n != 1 {
37+
t.Errorf("expected 1 row affected, got %d", n)
38+
}
39+
40+
// QueryRow — read it back.
41+
var name string
42+
row := db.QueryRow("SELECT name FROM test_contract WHERE id = ?", 1)
43+
if err := row.Scan(&name); err != nil {
44+
t.Fatalf("QueryRow Scan: %v", err)
45+
}
46+
if name != "alpha" {
47+
t.Errorf("expected alpha, got %q", name)
48+
}
49+
50+
// Query — list rows.
51+
rows, err := db.Query("SELECT id, name FROM test_contract ORDER BY id")
52+
if err != nil {
53+
t.Fatalf("Query: %v", err)
54+
}
55+
defer rows.Close()
56+
count := 0
57+
for rows.Next() {
58+
var id int
59+
var n string
60+
if err := rows.Scan(&id, &n); err != nil {
61+
t.Fatalf("rows.Scan: %v", err)
62+
}
63+
count++
64+
}
65+
if err := rows.Err(); err != nil {
66+
t.Fatalf("rows.Err: %v", err)
67+
}
68+
if count != 1 {
69+
t.Errorf("expected 1 row, got %d", count)
70+
}
71+
}
72+
73+
func TestCatalogTxContract(t *testing.T) {
74+
db, err := NewSqliteCatalogDB()
75+
if err != nil {
76+
t.Fatalf("NewSqliteCatalogDB: %v", err)
77+
}
78+
defer db.Close()
79+
80+
_, err = db.Exec("CREATE TABLE test_tx (id INTEGER PRIMARY KEY, val TEXT)")
81+
if err != nil {
82+
t.Fatalf("Exec CREATE TABLE: %v", err)
83+
}
84+
85+
// Begin + Prepare + Exec + Commit.
86+
tx, err := db.Begin()
87+
if err != nil {
88+
t.Fatalf("Begin: %v", err)
89+
}
90+
stmt, err := tx.Prepare("INSERT INTO test_tx (id, val) VALUES (?, ?)")
91+
if err != nil {
92+
t.Fatalf("Prepare: %v", err)
93+
}
94+
for i := 1; i <= 3; i++ {
95+
if _, err := stmt.Exec(i, "row"); err != nil {
96+
t.Fatalf("stmt.Exec(%d): %v", i, err)
97+
}
98+
}
99+
stmt.Close()
100+
if err := tx.Commit(); err != nil {
101+
t.Fatalf("Commit: %v", err)
102+
}
103+
104+
// Verify rows persisted.
105+
var count int
106+
if err := db.QueryRow("SELECT COUNT(*) FROM test_tx").Scan(&count); err != nil {
107+
t.Fatalf("QueryRow after commit: %v", err)
108+
}
109+
if count != 3 {
110+
t.Errorf("expected 3 rows after commit, got %d", count)
111+
}
112+
113+
// Begin + Rollback — rows should not persist.
114+
tx2, err := db.Begin()
115+
if err != nil {
116+
t.Fatalf("Begin (rollback): %v", err)
117+
}
118+
if _, err := tx2.Exec("INSERT INTO test_tx (id, val) VALUES (4, 'gone')"); err != nil {
119+
t.Fatalf("Exec in rollback tx: %v", err)
120+
}
121+
if err := tx2.Rollback(); err != nil {
122+
t.Fatalf("Rollback: %v", err)
123+
}
124+
125+
if err := db.QueryRow("SELECT COUNT(*) FROM test_tx").Scan(&count); err != nil {
126+
t.Fatalf("QueryRow after rollback: %v", err)
127+
}
128+
if count != 3 {
129+
t.Errorf("expected 3 rows after rollback, got %d", count)
130+
}
131+
}
132+
133+
// TestInterfaceSatisfaction verifies compile-time interface compliance.
134+
func TestInterfaceSatisfaction(t *testing.T) {
135+
var _ CatalogDB = (*SqliteCatalogDB)(nil)
136+
var _ CatalogTx = (*sql.Tx)(nil)
137+
}

0 commit comments

Comments
 (0)