package handlers
import (
"net/http"
"net/http/httptest"
"strings"
"testing"
"codeberg.org/mihna123/openstore/internal/config"
)
func newTestConfig() *config.Config {
return &config.Config{
Serve: config.Serve{Addr: ":3000"},
Instance: config.Instance{
Name: "TestStore",
ContactEmail: "test@store.com",
BaseURL: "https://test.store.com",
},
}
}
func get(t *testing.T, mux *http.ServeMux, method, path string) *httptest.ResponseRecorder {
t.Helper()
rec := httptest.NewRecorder()
mux.ServeHTTP(rec, httptest.NewRequest(method, path, nil))
return rec
}
func TestRoutes(t *testing.T) {
mux := Routes(newTestConfig())
tests := []struct {
name string
method string
path string
want int
}{
{"home", http.MethodGet, "/", http.StatusOK},
{"stylesheet", http.MethodGet, "/css/style.css", http.StatusOK},
{"missing stylesheet", http.MethodGet, "/css/nope.css", http.StatusNotFound},
{"templates not served", http.MethodGet, "/templates/index.html", http.StatusNotFound},
{"unknown path", http.MethodGet, "/nonsense", http.StatusNotFound},
{"wrong method on home", http.MethodPost, "/", http.StatusMethodNotAllowed},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
rec := get(t, mux, tt.method, tt.path)
if rec.Code != tt.want {
t.Errorf("%s %s: got status %d, want %d", tt.method, tt.path, rec.Code, tt.want)
}
})
}
}
func TestStylesheetIsServed(t *testing.T) {
mux := Routes(newTestConfig())
rec := get(t, mux, http.MethodGet, "/css/style.css")
if rec.Code != http.StatusOK {
t.Fatalf("got status %d, want 200", rec.Code)
}
if ct := rec.Header().Get("Content-Type"); !strings.HasPrefix(ct, "text/css") {
t.Errorf("got Content-Type %q, want text/css", ct)
}
if rec.Body.Len() == 0 {
t.Error("stylesheet served empty")
}
}
func TestHomeLinksServedStylesheet(t *testing.T) {
mux := Routes(newTestConfig())
body := get(t, mux, http.MethodGet, "/").Body.String()
if !strings.Contains(body, `href="/css/style.css"`) {
t.Fatalf("home does not link the stylesheet, got:\n%s", body)
}
if code := get(t, mux, http.MethodGet, "/css/style.css").Code; code != http.StatusOK {
t.Errorf("linked stylesheet returned %d, want 200", code)
}
}
func TestHomeRendersInstanceName(t *testing.T) {
cfg := newTestConfig()
cfg.Instance.Name = "Prodavnica123"
mux := Routes(cfg)
rec := get(t, mux, http.MethodGet, "/")
if rec.Code != http.StatusOK {
t.Fatalf("got status %d, want 200", rec.Code)
}
body := rec.Body.String()
if strings.Count(body, "Prodavnica123") != 2 {
t.Errorf("instance name should appear in title and heading, got:\n%s", body)
}
if ct := rec.Header().Get("Content-Type"); !strings.HasPrefix(ct, "text/html") {
t.Errorf("got Content-Type %q, want text/html", ct)
}
}
func TestHomeEscapesInstanceName(t *testing.T) {
cfg := newTestConfig()
cfg.Instance.Name = ``
mux := Routes(cfg)
body := get(t, mux, http.MethodGet, "/").Body.String()
if strings.Contains(body, "