Implement Phase 7: share link tests and expiry fix

- 4 tests: create/validate, expiry, revoke, list
- Fixed expiry check: negative durations now correctly expire links
  (was checking > 0 instead of != 0)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 19:57:03 -07:00
parent 37c2d35ceb
commit fedb5e3301
2 changed files with 106 additions and 1 deletions

View File

@@ -0,0 +1,105 @@
package share
import (
"path/filepath"
"testing"
"time"
"git.wntrmute.dev/kyle/eng-pad-server/internal/auth"
"git.wntrmute.dev/kyle/eng-pad-server/internal/db"
)
func setupTestDB(t *testing.T) (*db.TestDB, int64) {
t.Helper()
dir := t.TempDir()
database, err := db.Open(filepath.Join(dir, "test.db"))
if err != nil {
t.Fatalf("open: %v", err)
}
if err := db.Migrate(database); err != nil {
t.Fatalf("migrate: %v", err)
}
t.Cleanup(func() { _ = database.Close() })
userID, err := auth.CreateUser(database, "test", "pass", auth.DefaultParams)
if err != nil {
t.Fatalf("create user: %v", err)
}
_, err = database.Exec(
"INSERT INTO notebooks (user_id, remote_id, title, page_size, synced_at) VALUES (?, 1, 'Test', 'REGULAR', ?)",
userID, time.Now().UnixMilli(),
)
if err != nil {
t.Fatalf("insert notebook: %v", err)
}
return &db.TestDB{DB: database}, 1 // notebook ID
}
func TestCreateAndValidateLink(t *testing.T) {
tdb, notebookID := setupTestDB(t)
token, _, err := CreateLink(tdb.DB, notebookID, 0, "https://example.com")
if err != nil {
t.Fatalf("create: %v", err)
}
if token == "" {
t.Fatal("expected non-empty token")
}
nbID, err := ValidateLink(tdb.DB, token)
if err != nil {
t.Fatalf("validate: %v", err)
}
if nbID != notebookID {
t.Fatalf("expected notebook %d, got %d", notebookID, nbID)
}
}
func TestExpiredLink(t *testing.T) {
tdb, notebookID := setupTestDB(t)
token, _, err := CreateLink(tdb.DB, notebookID, -time.Hour, "https://example.com")
if err != nil {
t.Fatalf("create: %v", err)
}
_, err = ValidateLink(tdb.DB, token)
if err == nil {
t.Fatal("expected error for expired link")
}
}
func TestRevokeLink(t *testing.T) {
tdb, notebookID := setupTestDB(t)
token, _, err := CreateLink(tdb.DB, notebookID, 0, "https://example.com")
if err != nil {
t.Fatalf("create: %v", err)
}
if err := RevokeLink(tdb.DB, token); err != nil {
t.Fatalf("revoke: %v", err)
}
_, err = ValidateLink(tdb.DB, token)
if err == nil {
t.Fatal("expected error for revoked link")
}
}
func TestListLinks(t *testing.T) {
tdb, notebookID := setupTestDB(t)
_, _, _ = CreateLink(tdb.DB, notebookID, 0, "https://example.com")
_, _, _ = CreateLink(tdb.DB, notebookID, time.Hour, "https://example.com")
links, err := ListLinks(tdb.DB, notebookID, "https://example.com")
if err != nil {
t.Fatalf("list: %v", err)
}
if len(links) != 2 {
t.Fatalf("expected 2 links, got %d", len(links))
}
}