Skip to content

Commit feb4ad0

Browse files
authored
Merge pull request #4 from SpaceTent/test/add-record-test
add record_test.go / create test funcs for recordInsert and recordUpdate
2 parents 47f846d + 4948c0e commit feb4ad0

1 file changed

Lines changed: 201 additions & 0 deletions

File tree

gsdb/Record_test.go

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
package gsdb
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log/slog"
7+
"os"
8+
"strconv"
9+
"strings"
10+
"testing"
11+
"time"
12+
)
13+
14+
func TestRecordUpdate(t *testing.T) {
15+
textHandler := slog.NewTextHandler(os.Stdout, nil)
16+
l := slog.New(textHandler)
17+
NewSQLite3("test.db", l, context.Background())
18+
19+
type TestPerson struct {
20+
Id int `db:"column=id primarykey=yes table=Test"`
21+
Name string `db:"column=name"`
22+
Dtadded time.Time `db:"column=dtadded"`
23+
Status int `db:"column=status"`
24+
Ignored int `db:"column=ignored omit=yes"`
25+
}
26+
27+
tableCreate := `
28+
CREATE TABLE IF NOT EXISTS test (
29+
id INTEGER PRIMARY KEY AUTOINCREMENT,
30+
name TEXT NOT NULL,
31+
dtadded DATETIME DEFAULT CURRENT_TIMESTAMP,
32+
status INTEGER NOT NULL,
33+
ignored INTEGER
34+
);`
35+
36+
_, err := DB.dbConnection.Exec("DROP TABLE IF EXISTS test;")
37+
if err != nil {
38+
t.Fatalf("failed to execute drop table prior to tests: %v", err)
39+
}
40+
41+
_, err = DB.dbConnection.Exec(tableCreate)
42+
if err != nil {
43+
t.Fatalf("failed to execute tableCreate SQL prior to tests: %v", err)
44+
}
45+
46+
tests := []struct {
47+
name string
48+
entry TestPerson
49+
initialFieldValue any
50+
updateColumn string
51+
updateColumnValue string
52+
}{
53+
{
54+
name: "Successfully update a single string record field",
55+
entry: TestPerson{
56+
Name: "Ronald McDonald",
57+
Dtadded: time.Now().UTC(),
58+
Status: 1,
59+
},
60+
updateColumn: "name",
61+
updateColumnValue: "Colonel Sanders",
62+
},
63+
{
64+
name: "Successfully update an integer record field",
65+
entry: TestPerson{
66+
Name: "Yosemite Sam",
67+
Dtadded: time.Now().UTC(),
68+
Status: 0,
69+
},
70+
updateColumn: "Status",
71+
updateColumnValue: "1",
72+
},
73+
}
74+
75+
for _, tc := range tests {
76+
t.Run(tc.name, func(t *testing.T) {
77+
insertSQL, err := DB.Insert(tc.entry)
78+
if err != nil {
79+
t.Fatalf("failed to generate Insert SQL: %v", err)
80+
}
81+
82+
lastInsertedID, _, err := DB.Execute(insertSQL)
83+
if err != nil {
84+
t.Fatalf("failed to execture insert during test: %s: %v", tc.name, err)
85+
}
86+
87+
updateRecord := Record{
88+
tc.updateColumn: Field{Value: tc.updateColumnValue},
89+
}
90+
91+
rowsAffected, err := DB.RecordUpdate(updateRecord, "test", "id", fmt.Sprintf("%d", lastInsertedID))
92+
if err != nil {
93+
t.Fatalf("failed to RecordUpdate during test: %s: %v", tc.name, err)
94+
}
95+
if rowsAffected != 1 {
96+
t.Fatalf("expected rowsAffected to be 1 but got %d", rowsAffected)
97+
}
98+
99+
query := fmt.Sprintf("SELECT * FROM test WHERE id = %d", lastInsertedID)
100+
result, err := QuerySingleStruct[TestPerson](query)
101+
if err != nil {
102+
t.Fatalf("QuerySingleStruct failed during %s: %v", tc.name, err)
103+
}
104+
105+
switch strings.ToLower(tc.updateColumn) {
106+
case "name":
107+
if result.Name != tc.updateColumnValue {
108+
t.Errorf("expected updated name to be: %s, got: %s", tc.updateColumnValue, result.Name)
109+
}
110+
case "status":
111+
expected, err := strconv.Atoi(tc.updateColumnValue)
112+
if err != nil {
113+
t.Fatalf("failed to convert int status to string")
114+
}
115+
if result.Status != expected {
116+
t.Errorf("expected updated status to be: %d, got: %d", expected, result.Status)
117+
}
118+
default:
119+
t.Fatalf("currently unhandled updateColumn: %s", tc.updateColumn)
120+
}
121+
})
122+
}
123+
}
124+
125+
func TestRecordInsert(t *testing.T) {
126+
textHandler := slog.NewTextHandler(os.Stdout, nil)
127+
l := slog.New(textHandler)
128+
NewSQLite3("test.db", l, context.Background())
129+
130+
type TestPerson struct {
131+
Id int `db:"column=id primarykey=yes table=Test"`
132+
Name string `db:"column=name"`
133+
Dtadded time.Time `db:"column=dtadded"`
134+
Status int `db:"column=status"`
135+
Ignored int `db:"column=ignored omit=yes"`
136+
}
137+
138+
tableCreate := `
139+
CREATE TABLE IF NOT EXISTS test (
140+
id INTEGER PRIMARY KEY AUTOINCREMENT,
141+
name TEXT NOT NULL,
142+
dtadded DATETIME DEFAULT CURRENT_TIMESTAMP,
143+
status INTEGER NOT NULL,
144+
ignored INTEGER
145+
);`
146+
147+
_, err := DB.dbConnection.Exec("DROP TABLE IF EXISTS test;")
148+
if err != nil {
149+
t.Fatalf("failed to execute drop table prior to tests: %v", err)
150+
}
151+
152+
_, err = DB.dbConnection.Exec(tableCreate)
153+
if err != nil {
154+
t.Fatalf("failed to execute tableCreate SQL prior to tests: %v", err)
155+
}
156+
157+
tests := []struct {
158+
name string
159+
entry Record
160+
}{
161+
{
162+
name: "Successfully insert a record",
163+
entry: Record{
164+
"name": Field{Value: "Ronald McDonald"},
165+
"dtAdded": Field{Value: time.Now().UTC()},
166+
"status": Field{Value: 1},
167+
},
168+
},
169+
{
170+
name: "Successfully insert a record with missing field - expecting go zero values to fill missing fields",
171+
entry: Record{
172+
"name": Field{Value: "Colonel Sanders"},
173+
"status": Field{Value: 0},
174+
},
175+
},
176+
}
177+
178+
for _, tc := range tests {
179+
t.Run(tc.name, func(t *testing.T) {
180+
lastInsertedID, err := DB.RecordInsert(tc.entry, "test")
181+
if err != nil {
182+
t.Fatalf("failed to insert record during test: %s: %v", tc.name, err)
183+
}
184+
185+
result, err := QuerySingleStruct[TestPerson](`
186+
SELECT name, id FROM test ORDER BY id DESC LIMIT 1;
187+
`)
188+
if err != nil {
189+
t.Fatalf("error during QuerySingleStruct during test: %s: %v", tc.name, err)
190+
}
191+
192+
switch {
193+
case result.Name != tc.entry["name"].Value:
194+
t.Fatalf("unexpected name value after insert - want: %s got: %s", tc.entry["name"], result.Name)
195+
196+
case result.Id != int(lastInsertedID):
197+
t.Fatalf("last inserted ID does not match fetched record ID - want: %d got: %d", lastInsertedID, result.Id)
198+
}
199+
})
200+
}
201+
}

0 commit comments

Comments
 (0)