package main import ( "errors" "net/http" "net/http/httptest" "testing" "lchat/internal/apns" ) // relaySender must map the relay's normalised 410 back to apns.ErrGone so // apnsFanOut prunes the dead token — and must NOT treat any other non-2xx as // gone (that would prune a live token on a transient relay error). func TestRelaySenderClassifies(t *testing.T) { var status int stub := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if got := r.Header.Get("Authorization"); got != "Bearer tok" { t.Errorf("missing bearer: %q", got) } w.WriteHeader(status) })) defer stub.Close() rs := relaySender{url: stub.URL + "/api/push", token: "tok", http: http.DefaultClient} status = http.StatusOK if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); err != nil { t.Errorf("200: want nil, got %v", err) } status = http.StatusGone if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); !errors.Is(err, apns.ErrGone) { t.Errorf("410: want ErrGone, got %v", err) } status = http.StatusTooManyRequests if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); err == nil || errors.Is(err, apns.ErrGone) { t.Errorf("429: want a non-gone error, got %v", err) } status = http.StatusBadGateway if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); err == nil || errors.Is(err, apns.ErrGone) { t.Errorf("502: want a non-gone error, got %v", err) } }