| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "errors" |
| 5 | "net/http" |
| 6 | "net/http/httptest" |
| 7 | "testing" |
| 8 | |
| 9 | "lchat/internal/apns" |
| 10 | ) |
| 11 | |
| 12 | // relaySender must map the relay's normalised 410 back to apns.ErrGone so |
| 13 | // apnsFanOut prunes the dead token — and must NOT treat any other non-2xx as |
| 14 | // gone (that would prune a live token on a transient relay error). |
| 15 | func TestRelaySenderClassifies(t *testing.T) { |
| 16 | var status int |
| 17 | stub := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 18 | if got := r.Header.Get("Authorization"); got != "Bearer tok" { |
| 19 | t.Errorf("missing bearer: %q", got) |
| 20 | } |
| 21 | w.WriteHeader(status) |
| 22 | })) |
| 23 | defer stub.Close() |
| 24 | rs := relaySender{url: stub.URL + "/api/push", token: "tok", http: http.DefaultClient} |
| 25 | |
| 26 | status = http.StatusOK |
| 27 | if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); err != nil { |
| 28 | t.Errorf("200: want nil, got %v", err) |
| 29 | } |
| 30 | status = http.StatusGone |
| 31 | if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); !errors.Is(err, apns.ErrGone) { |
| 32 | t.Errorf("410: want ErrGone, got %v", err) |
| 33 | } |
| 34 | status = http.StatusTooManyRequests |
| 35 | if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); err == nil || errors.Is(err, apns.ErrGone) { |
| 36 | t.Errorf("429: want a non-gone error, got %v", err) |
| 37 | } |
| 38 | status = http.StatusBadGateway |
| 39 | if err := rs.send("aabbccdd", false, "th", "blob", 1, 1); err == nil || errors.Is(err, apns.ErrGone) { |
| 40 | t.Errorf("502: want a non-gone error, got %v", err) |
| 41 | } |
| 42 | } |
| 43 | |