bc57e9101744c6393d52f1a60c71c206d29347dd / internal/db/db_test.go · 3143 bytes · raw
package db
import (
"path/filepath"
"testing"
)
func TestOpenAppliesMigrations(t *testing.T) {
database, err := Open(filepath.Join(t.TempDir(), "test.db"))
if err != nil {
t.Fatalf("Open: %v", err)
}
defer database.Close()
for _, table := range []string{"users", "sessions", "repos", "tokens", "issues", "issue_comments", "pulls", "pull_comments", "releases", "release_assets", "schema_migrations"} {
var name string
err := database.QueryRow(
`SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`, table,
).Scan(&name)
if err != nil {
t.Errorf("table %s missing: %v", table, err)
}
}
var applied int
if err := database.QueryRow(`SELECT COUNT(*) FROM schema_migrations`).Scan(&applied); err != nil {
t.Fatalf("count migrations: %v", err)
}
if applied != 5 {
t.Errorf("applied migrations = %d, want 5", applied)
}
}
func TestOpenIsIdempotent(t *testing.T) {
path := filepath.Join(t.TempDir(), "test.db")
first, err := Open(path)
if err != nil {
t.Fatalf("first Open: %v", err)
}
first.Close()
second, err := Open(path)
if err != nil {
t.Fatalf("second Open: %v", err)
}
defer second.Close()
var applied int
if err := second.QueryRow(`SELECT COUNT(*) FROM schema_migrations`).Scan(&applied); err != nil {
t.Fatalf("count migrations: %v", err)
}
if applied != 5 {
t.Errorf("applied migrations after reopen = %d, want 5", applied)
}
}
func TestSchemaAcceptsRows(t *testing.T) {
database, err := Open(filepath.Join(t.TempDir(), "test.db"))
if err != nil {
t.Fatalf("Open: %v", err)
}
defer database.Close()
res, err := database.Exec(
`INSERT INTO users (username, password_hash) VALUES (?, ?)`, "josie", "x",
)
if err != nil {
t.Fatalf("insert user: %v", err)
}
userID, err := res.LastInsertId()
if err != nil {
t.Fatalf("last insert id: %v", err)
}
if _, err := database.Exec(
`INSERT INTO repos (owner_id, name) VALUES (?, ?)`, userID, "simplegit",
); err != nil {
t.Fatalf("insert repo: %v", err)
}
var visibility, branch string
var createdAt int64
if err := database.QueryRow(
`SELECT visibility, default_branch, created_at FROM repos WHERE owner_id = ? AND name = ?`,
userID, "simplegit",
).Scan(&visibility, &branch, &createdAt); err != nil {
t.Fatalf("select repo: %v", err)
}
if visibility != "private" {
t.Errorf("default visibility = %q, want private", visibility)
}
if branch != "main" {
t.Errorf("default branch = %q, want main", branch)
}
if createdAt <= 0 {
t.Errorf("created_at = %d, want > 0", createdAt)
}
}
func TestForeignKeysEnforced(t *testing.T) {
database, err := Open(filepath.Join(t.TempDir(), "test.db"))
if err != nil {
t.Fatalf("Open: %v", err)
}
defer database.Close()
var enabled int
if err := database.QueryRow(`PRAGMA foreign_keys`).Scan(&enabled); err != nil {
t.Fatalf("pragma foreign_keys: %v", err)
}
if enabled != 1 {
t.Fatalf("foreign_keys = %d, want 1", enabled)
}
if _, err := database.Exec(
`INSERT INTO repos (owner_id, name) VALUES (?, ?)`, 999, "orphan",
); err == nil {
t.Error("insert with missing owner_id succeeded, want foreign key error")
}
}