Files
preface-tools/internal/httpserver/server_test.go
T
2026-07-13 01:26:49 +08:00

61 lines
2.0 KiB
Go

package httpserver
import (
"io"
"log/slog"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
"git.michelsen.id/phill/preface-tools/internal/auth"
"git.michelsen.id/phill/preface-tools/internal/tools"
)
type testTool struct{}
func (testTool) Definition() tools.Definition { return tools.Definition{Key: "test", Name: "Test"} }
func (testTool) StudentHandler() http.Handler {
mux := http.NewServeMux()
mux.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte(`<section id="tool-fragment">Tool</section>`))
})
return mux
}
func (testTool) InstructorHandler() http.Handler { return testTool{}.StudentHandler() }
func TestNewWithToolRoutesDoesNotPanic(t *testing.T) {
registry := tools.NewRegistry()
if err := registry.Register(testTool{}); err != nil {
t.Fatal(err)
}
authService := auth.New("student", "instructor", string(make([]byte, 32)), time.Hour, false)
server := New(authService, registry, slog.New(slog.NewTextHandler(io.Discard, nil)))
if server.Handler() == nil {
t.Fatal("missing handler")
}
}
func TestToolRootUsesApplicationShell(t *testing.T) {
registry := tools.NewRegistry()
if err := registry.Register(testTool{}); err != nil {
t.Fatal(err)
}
authService := auth.New("student", "instructor", string(make([]byte, 32)), time.Hour, false)
claims, err := authService.Authenticate(auth.Student, "student", "test")
if err != nil {
t.Fatal(err)
}
server := New(authService, registry, slog.New(slog.NewTextHandler(io.Discard, nil)))
request := httptest.NewRequest(http.MethodGet, "/tools/test/", nil)
request.AddCookie(&http.Cookie{Name: auth.CookieName, Value: authService.Sign(claims)})
response := httptest.NewRecorder()
server.Handler().ServeHTTP(response, request)
for _, expected := range []string{"<!doctype html>", `data-theme="silk"`, "daisyui@5.6.3", "Preface Tools", `id="tool-fragment"`} {
if !strings.Contains(response.Body.String(), expected) {
t.Errorf("rendered tool page missing %q", expected)
}
}
}