package handlers import ( "fmt" "net/http" "net/http/httptest" "net/url" "strings" "testing" ) func TestLoginReadinessRequiresSuccessfulStartupAndPolicy(t *testing.T) { for _, tc := range []struct { name, startup string policy int ready bool }{ {"pending", `{"ready":false,"state":"starting","completed":1,"total":3}`, 200, false}, {"failed", `{"ready":false,"state":"failed","stages":[{"label":"serial","state":"failed"}]}`, 200, false}, {"malformed", `{`, 200, false}, {"policy failure", `{"ready":true,"state":"ready"}`, 503, false}, {"ready", `{"ready":true,"state":"ready","elapsed_ms":2500}`, 200, true}, } { t.Run(tc.name, func(t *testing.T) { policyCalls := 0 upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/api/v1/auth/startup" { fmt.Fprint(w, tc.startup) return } policyCalls++ w.WriteHeader(tc.policy) fmt.Fprint(w, `{"captcha_enabled":true}`) })) defer upstream.Close() target, _ := url.Parse(upstream.URL) h := &DeviceHandler{apiTarget: target, apiClient: upstream.Client()} response := httptest.NewRecorder() h.handleLoginBackendStatus(response, httptest.NewRequest("GET", "/login/backend-status", nil)) if strings.Contains(response.Body.String(), `"ready":true`) != tc.ready { t.Fatal(response.Body.String()) } if !strings.Contains(tc.startup, `"ready":true`) && policyCalls != 0 { t.Fatal("policy requested before readiness") } if tc.name == "failed" && !strings.Contains(response.Body.String(), `"state":"failed"`) { t.Fatal("failure lost") } }) } }