package web import ( "encoding/json" "net/http" "net/http/httptest" "strings" "testing" "git.d-ma.be/mathias/cad-atlas/internal/atlas" ) func TestRootServesAtlas(t *testing.T) { srv := httptest.NewServer(NewHandler()) defer srv.Close() resp, err := http.Get(srv.URL + "/") if err != nil { t.Fatalf("GET /: %v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { t.Fatalf("GET / status = %d, want 200", resp.StatusCode) } buf := make([]byte, 4096) n, _ := resp.Body.Read(buf) if !strings.Contains(string(buf[:n]), "CAD") { t.Fatalf("GET / body missing atlas marker %q", "CAD") } } func TestAtlasJSON_ServesAtlasWithGeneratedCIStage(t *testing.T) { srv := httptest.NewServer(NewHandler()) defer srv.Close() resp, err := http.Get(srv.URL + "/api/atlas.json") if err != nil { t.Fatalf("GET /api/atlas.json: %v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { t.Fatalf("status = %d, want 200", resp.StatusCode) } var a atlas.Atlas if err := json.NewDecoder(resp.Body).Decode(&a); err != nil { t.Fatalf("decode atlas: %v", err) } if len(a.Stages) == 0 { t.Fatal("atlas has no stages") } // The generate:ci-jobs stage must be populated from the real cd.yml jobs. got := map[string]bool{} for _, s := range a.Stages { if s.No == "STAGE 06" { for _, n := range s.Nodes { got[n.Title] = true } } } for _, want := range []string{"guard", "check", "build", "deploy"} { if !got[want] { t.Fatalf("CI stage missing generated job %q (got %v)", want, got) } } } func TestUnknownPath404(t *testing.T) { srv := httptest.NewServer(NewHandler()) defer srv.Close() resp, err := http.Get(srv.URL + "/nope") if err != nil { t.Fatalf("GET /nope: %v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusNotFound { t.Fatalf("GET /nope status = %d, want 404", resp.StatusCode) } }