bee1305a2b
Two small refactors make the handlers testable: - extract route registration into routes() http.Handler (was inline in main) - initDB(dsn) takes a DSN so tests use an isolated temp-file DB loginJitter var lets tests disable the anti-timing sleep for speed. endpoints_test.go covers the main flows via httptest + cookie jar: register/login/headerbar, empty-then-populated feed, create requires auth, voting (new/toggle/switch, per-user tallies), vote auth + invalid mode, and account deletion (wrong/correct password, login fails after). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
var db *sql.DB
|
|
|
|
const schema = `
|
|
CREATE TABLE IF NOT EXISTS user (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
uid INTEGER UNIQUE,
|
|
username TEXT UNIQUE,
|
|
password BLOB,
|
|
created_at INTEGER,
|
|
last_login INTEGER
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS session (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
uid INTEGER,
|
|
value TEXT UNIQUE,
|
|
created_at INTEGER,
|
|
expires INTEGER,
|
|
description TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS entry (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
pid INTEGER UNIQUE,
|
|
uid INTEGER,
|
|
created_at INTEGER,
|
|
content TEXT,
|
|
filepath TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS vote (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
uid INTEGER,
|
|
pid INTEGER,
|
|
mode TEXT,
|
|
UNIQUE(uid, pid)
|
|
);
|
|
`
|
|
|
|
func initDB(dsn string) error {
|
|
var err error
|
|
db, err = sql.Open("sqlite", dsn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err = db.Ping(); err != nil {
|
|
return err
|
|
}
|
|
_, err = db.Exec(schema)
|
|
return err
|
|
}
|