Files
AnthoLume/api/v1/documents_test.go
2026-03-22 17:21:32 -04:00

164 lines
4.1 KiB
Go

package v1
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"reichard.io/antholume/database"
"reichard.io/antholume/pkg/ptr"
)
func TestAPIGetDocuments(t *testing.T) {
db := setupTestDB(t)
cfg := testConfig()
server := NewServer(db, cfg)
// Create user and login
createTestUser(t, db, "testuser", "testpass")
// Login first
reqBody := LoginRequest{Username: "testuser", Password: "testpass"}
body, _ := json.Marshal(reqBody)
loginReq := httptest.NewRequest(http.MethodPost, "/api/v1/auth/login", bytes.NewReader(body))
loginResp := httptest.NewRecorder()
server.ServeHTTP(loginResp, loginReq)
// Get session cookie
cookies := loginResp.Result().Cookies()
if len(cookies) == 0 {
t.Fatal("No session cookie returned")
}
// Get documents
req := httptest.NewRequest(http.MethodGet, "/api/v1/documents?page=1&limit=9", nil)
req.AddCookie(cookies[0])
w := httptest.NewRecorder()
server.ServeHTTP(w, req)
if w.Code != http.StatusOK {
t.Fatalf("Expected 200, got %d: %s", w.Code, w.Body.String())
}
var resp DocumentsResponse
if err := json.Unmarshal(w.Body.Bytes(), &resp); err != nil {
t.Fatalf("Failed to unmarshal response: %v", err)
}
if resp.Page != 1 {
t.Errorf("Expected page 1, got %d", resp.Page)
}
if resp.Limit != 9 {
t.Errorf("Expected limit 9, got %d", resp.Limit)
}
if resp.User.Username != "testuser" {
t.Errorf("Expected username 'testuser', got '%s'", resp.User.Username)
}
}
func TestAPIGetDocumentsUnauthenticated(t *testing.T) {
db := setupTestDB(t)
cfg := testConfig()
server := NewServer(db, cfg)
req := httptest.NewRequest(http.MethodGet, "/api/v1/documents", nil)
w := httptest.NewRecorder()
server.ServeHTTP(w, req)
if w.Code != http.StatusUnauthorized {
t.Fatalf("Expected 401, got %d", w.Code)
}
}
func TestAPIGetDocument(t *testing.T) {
db := setupTestDB(t)
cfg := testConfig()
server := NewServer(db, cfg)
// Create user
createTestUser(t, db, "testuser", "testpass")
// Create a document using UpsertDocument
docID := "test-doc-1"
_, err := db.Queries.UpsertDocument(t.Context(), database.UpsertDocumentParams{
ID: docID,
Title: ptr.Of("Test Document"),
Author: ptr.Of("Test Author"),
})
if err != nil {
t.Fatalf("Failed to create document: %v", err)
}
// Login
reqBody := LoginRequest{Username: "testuser", Password: "testpass"}
body, _ := json.Marshal(reqBody)
loginReq := httptest.NewRequest(http.MethodPost, "/api/v1/auth/login", bytes.NewReader(body))
loginResp := httptest.NewRecorder()
server.ServeHTTP(loginResp, loginReq)
cookies := loginResp.Result().Cookies()
if len(cookies) == 0 {
t.Fatal("No session cookie returned")
}
// Get document
req := httptest.NewRequest(http.MethodGet, "/api/v1/documents/"+docID, nil)
req.AddCookie(cookies[0])
w := httptest.NewRecorder()
server.ServeHTTP(w, req)
if w.Code != http.StatusOK {
t.Fatalf("Expected 200, got %d: %s", w.Code, w.Body.String())
}
var resp DocumentResponse
if err := json.Unmarshal(w.Body.Bytes(), &resp); err != nil {
t.Fatalf("Failed to unmarshal response: %v", err)
}
if resp.Document.ID != docID {
t.Errorf("Expected document ID '%s', got '%s'", docID, resp.Document.ID)
}
if *resp.Document.Title != "Test Document" {
t.Errorf("Expected title 'Test Document', got '%s'", *resp.Document.Title)
}
}
func TestAPIGetDocumentNotFound(t *testing.T) {
db := setupTestDB(t)
cfg := testConfig()
server := NewServer(db, cfg)
// Create user and login
createTestUser(t, db, "testuser", "testpass")
reqBody := LoginRequest{Username: "testuser", Password: "testpass"}
body, _ := json.Marshal(reqBody)
loginReq := httptest.NewRequest(http.MethodPost, "/api/v1/auth/login", bytes.NewReader(body))
loginResp := httptest.NewRecorder()
server.ServeHTTP(loginResp, loginReq)
cookies := loginResp.Result().Cookies()
if len(cookies) == 0 {
t.Fatal("No session cookie returned")
}
// Get non-existent document
req := httptest.NewRequest(http.MethodGet, "/api/v1/documents/non-existent", nil)
req.AddCookie(cookies[0])
w := httptest.NewRecorder()
server.ServeHTTP(w, req)
if w.Code != http.StatusNotFound {
t.Fatalf("Expected 404, got %d", w.Code)
}
}