pegasus/backend/app_test.go

215 lines
5.2 KiB
Go

package main
import (
"fmt"
"net/http"
"os"
"path/filepath"
"testing"
"scm.bstein.dev/bstein/Pegasus/backend/internal"
)
func TestMainDelegatesToRunApp(t *testing.T) {
origRun := run
origFatal := fatal
defer func() {
run = origRun
fatal = origFatal
}()
called := false
run = func() error {
called = true
return http.ErrNoCookie
}
fatal = func(args ...any) {
called = true
}
main()
if !called {
t.Fatalf("expected main to delegate to runApp")
}
}
func TestRunInitializesServer(t *testing.T) {
t.Setenv("PEGASUS_SESSION_KEY", "test-session-key")
origServeHTTP := serveHTTP
origMediaRoot := mediaRoot
origUserMapFile := userMapFile
origTusDir := tusDir
origDebug := internal.Debug
defer func() {
serveHTTP = origServeHTTP
mediaRoot = origMediaRoot
userMapFile = origUserMapFile
tusDir = origTusDir
internal.Debug = origDebug
}()
workDir := t.TempDir()
mediaRoot = filepath.Join(workDir, "media")
tusDir = filepath.Join(workDir, "tus")
userMapFile = filepath.Join(workDir, "user-map.yaml")
internal.Debug = false
if err := os.MkdirAll(filepath.Join(mediaRoot, "library"), 0o2775); err != nil {
t.Fatalf("mkdir media root: %v", err)
}
mapBody := "map:\n brad: library\n"
for i := 0; i < 11; i++ {
mapBody += fmt.Sprintf(" user%02d: library\n", i)
}
if err := os.WriteFile(userMapFile, []byte(mapBody), 0o644); err != nil {
t.Fatalf("write user map: %v", err)
}
var gotServer *http.Server
serveHTTP = func(srv *http.Server) error {
gotServer = srv
return nil
}
if err := run(); err != nil {
t.Fatalf("run returned error: %v", err)
}
if gotServer == nil {
t.Fatalf("expected server to be created")
}
if gotServer.Addr != ":8080" {
t.Fatalf("unexpected default address %q", gotServer.Addr)
}
if gotServer.Handler == nil {
t.Fatalf("expected handler to be configured")
}
if _, err := os.Stat(tusDir); err != nil {
t.Fatalf("expected tus dir to be created: %v", err)
}
}
func TestRunDebugLogging(t *testing.T) {
t.Setenv("PEGASUS_SESSION_KEY", "test-session-key")
origServeHTTP := serveHTTP
origMediaRoot := mediaRoot
origUserMapFile := userMapFile
origTusDir := tusDir
origDebug := internal.Debug
defer func() {
serveHTTP = origServeHTTP
mediaRoot = origMediaRoot
userMapFile = origUserMapFile
tusDir = origTusDir
internal.Debug = origDebug
}()
workDir := t.TempDir()
mediaRoot = filepath.Join(workDir, "media")
tusDir = filepath.Join(workDir, "tus")
userMapFile = filepath.Join(workDir, "user-map.yaml")
internal.Debug = true
if err := os.MkdirAll(filepath.Join(mediaRoot, "library"), 0o2775); err != nil {
t.Fatalf("mkdir media root: %v", err)
}
mapBody := "map:\n brad: library\n"
for i := 0; i < 11; i++ {
mapBody += fmt.Sprintf(" user%02d: library\n", i)
}
if err := os.WriteFile(userMapFile, []byte(mapBody), 0o644); err != nil {
t.Fatalf("write user map: %v", err)
}
serveHTTP = func(srv *http.Server) error { return nil }
if err := run(); err != nil {
t.Fatalf("run returned error: %v", err)
}
}
func TestRunRejectsMissingSessionKey(t *testing.T) {
t.Setenv("PEGASUS_SESSION_KEY", "")
origServeHTTP := serveHTTP
origMediaRoot := mediaRoot
origUserMapFile := userMapFile
origTusDir := tusDir
defer func() {
serveHTTP = origServeHTTP
mediaRoot = origMediaRoot
userMapFile = origUserMapFile
tusDir = origTusDir
}()
serveHTTP = func(srv *http.Server) error {
t.Fatalf("serveHTTP should not be called")
return nil
}
if err := run(); err == nil {
t.Fatalf("expected missing session key error")
}
}
func TestRunRejectsMissingUserMap(t *testing.T) {
t.Setenv("PEGASUS_SESSION_KEY", "test-session-key")
origServeHTTP := serveHTTP
origMediaRoot := mediaRoot
origUserMapFile := userMapFile
origTusDir := tusDir
defer func() {
serveHTTP = origServeHTTP
mediaRoot = origMediaRoot
userMapFile = origUserMapFile
tusDir = origTusDir
}()
workDir := t.TempDir()
mediaRoot = filepath.Join(workDir, "media")
tusDir = filepath.Join(workDir, "tus")
userMapFile = filepath.Join(workDir, "missing.yaml")
serveHTTP = func(srv *http.Server) error {
t.Fatalf("serveHTTP should not be called")
return nil
}
if err := run(); err == nil {
t.Fatalf("expected load user map error")
}
}
func TestRunRejectsTusDirCreationFailure(t *testing.T) {
t.Setenv("PEGASUS_SESSION_KEY", "test-session-key")
origServeHTTP := serveHTTP
origMediaRoot := mediaRoot
origUserMapFile := userMapFile
origTusDir := tusDir
origDebug := internal.Debug
defer func() {
serveHTTP = origServeHTTP
mediaRoot = origMediaRoot
userMapFile = origUserMapFile
tusDir = origTusDir
internal.Debug = origDebug
}()
workDir := t.TempDir()
mediaRoot = filepath.Join(workDir, "media")
userMapFile = filepath.Join(workDir, "user-map.yaml")
_ = os.WriteFile(userMapFile, []byte("map:\n brad: library\n"), 0o644)
filePath := filepath.Join(workDir, "not-a-dir")
_ = os.WriteFile(filePath, []byte("file"), 0o644)
tusDir = filepath.Join(filePath, "sub")
internal.Debug = false
serveHTTP = func(srv *http.Server) error {
t.Fatalf("serveHTTP should not be called")
return nil
}
if err := run(); err == nil {
t.Fatalf("expected tus dir creation error")
}
}
func TestMustDoesNotExitOnNil(t *testing.T) {
must(nil, "noop")
}