You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.0 KiB
Go
153 lines
3.0 KiB
Go
package dbi
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"math/rand"
|
|
"testing"
|
|
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
func testDB(t *testing.T) *sql.DB {
|
|
t.Helper()
|
|
db, err := sql.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("open in-memory db: %v", err)
|
|
}
|
|
if _, err := db.Exec(ActivityReportSchema); err != nil {
|
|
t.Fatalf("apply schema: %v", err)
|
|
}
|
|
t.Cleanup(func() { db.Close() })
|
|
return db
|
|
}
|
|
|
|
func testConn(t *testing.T, db *sql.DB) *sql.Conn {
|
|
t.Helper()
|
|
conn, err := db.Conn(context.Background())
|
|
if err != nil {
|
|
t.Fatalf("get conn: %v", err)
|
|
}
|
|
t.Cleanup(func() { conn.Close() })
|
|
return conn
|
|
}
|
|
|
|
func randString(n int) string {
|
|
const letters = "abcdefghijklmnopqrstuvwxyz"
|
|
b := make([]byte, n)
|
|
for i := range b {
|
|
b[i] = letters[rand.Intn(len(letters))]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func genUser() User {
|
|
return User{
|
|
APIKey: randString(16),
|
|
FirstName: randString(8),
|
|
LastName: randString(8),
|
|
Password: randString(20),
|
|
Status: "faculty",
|
|
Username: randString(10),
|
|
}
|
|
}
|
|
|
|
func TestCreateUser(t *testing.T) {
|
|
conn := testConn(t, testDB(t))
|
|
u := genUser()
|
|
|
|
if err := CreateUser(conn, &u); err != nil {
|
|
t.Fatalf("CreateUser: %v", err)
|
|
}
|
|
|
|
got, err := GetUser(conn, u.Username)
|
|
if err != nil {
|
|
t.Fatalf("GetUser after create: %v", err)
|
|
}
|
|
if got != u {
|
|
t.Errorf("got %+v, want %+v", got, u)
|
|
}
|
|
}
|
|
|
|
func TestCreateUserDuplicateUsername(t *testing.T) {
|
|
conn := testConn(t, testDB(t))
|
|
u := genUser()
|
|
|
|
if err := CreateUser(conn, &u); err != nil {
|
|
t.Fatalf("first CreateUser: %v", err)
|
|
}
|
|
if err := CreateUser(conn, &u); err == nil {
|
|
t.Error("expected error on duplicate username, got nil")
|
|
}
|
|
}
|
|
|
|
func TestGetUser(t *testing.T) {
|
|
conn := testConn(t, testDB(t))
|
|
u := genUser()
|
|
|
|
if err := CreateUser(conn, &u); err != nil {
|
|
t.Fatalf("CreateUser: %v", err)
|
|
}
|
|
|
|
got, err := GetUser(conn, u.Username)
|
|
if err != nil {
|
|
t.Fatalf("GetUser: %v", err)
|
|
}
|
|
if got != u {
|
|
t.Errorf("got %+v, want %+v", got, u)
|
|
}
|
|
}
|
|
|
|
func TestGetUserNotFound(t *testing.T) {
|
|
conn := testConn(t, testDB(t))
|
|
|
|
_, err := GetUser(conn, randString(10))
|
|
if err == nil {
|
|
t.Error("expected error for missing user, got nil")
|
|
}
|
|
}
|
|
|
|
func TestUpdateUser(t *testing.T) {
|
|
conn := testConn(t, testDB(t))
|
|
u := genUser()
|
|
|
|
if err := CreateUser(conn, &u); err != nil {
|
|
t.Fatalf("CreateUser: %v", err)
|
|
}
|
|
|
|
u.FirstName = randString(8)
|
|
u.LastName = randString(8)
|
|
u.APIKey = randString(16)
|
|
u.Status = "admin"
|
|
|
|
if err := UpdateUser(conn, &u); err != nil {
|
|
t.Fatalf("UpdateUser: %v", err)
|
|
}
|
|
|
|
got, err := GetUser(conn, u.Username)
|
|
if err != nil {
|
|
t.Fatalf("GetUser after update: %v", err)
|
|
}
|
|
if got != u {
|
|
t.Errorf("got %+v, want %+v", got, u)
|
|
}
|
|
}
|
|
|
|
func TestDeleteUser(t *testing.T) {
|
|
conn := testConn(t, testDB(t))
|
|
u := genUser()
|
|
|
|
if err := CreateUser(conn, &u); err != nil {
|
|
t.Fatalf("CreateUser: %v", err)
|
|
}
|
|
|
|
if err := DeleteUser(conn, u.Username); err != nil {
|
|
t.Fatalf("DeleteUser: %v", err)
|
|
}
|
|
|
|
_, err := GetUser(conn, u.Username)
|
|
if err == nil {
|
|
t.Error("expected error after delete, got nil")
|
|
}
|
|
}
|