package infra import ( "net/http" "net/http/httptest" "os" "path/filepath" "testing" ) func TestFileServe(t *testing.T) { dir := t.TempDir() if err := os.WriteFile(filepath.Join(dir, "hello.txt"), []byte("hola mundo"), 0o644); err != nil { t.Fatalf("setup: %v", err) } handler := FileServe(dir, "/files/", 60) t.Run("sirve archivo existente con headers de cache", func(t *testing.T) { req := httptest.NewRequest("GET", "/files/hello.txt", nil) rec := httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("got %d, want 200", rec.Code) } if rec.Body.String() != "hola mundo" { t.Errorf("got body %q", rec.Body.String()) } if cc := rec.Header().Get("Cache-Control"); cc != "public, max-age=60" { t.Errorf("got Cache-Control %q", cc) } }) t.Run("responde 404 para archivo inexistente", func(t *testing.T) { req := httptest.NewRequest("GET", "/files/missing.txt", nil) rec := httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusNotFound { t.Errorf("got %d, want 404", rec.Code) } }) t.Run("rechaza path con .. con 400", func(t *testing.T) { req := httptest.NewRequest("GET", "/files/../etc/passwd", nil) rec := httptest.NewRecorder() handler.ServeHTTP(rec, req) if rec.Code != http.StatusBadRequest { t.Errorf("got %d, want 400", rec.Code) } }) }