You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Covers push/push_device_registrations.md, push_channel_subscriptions.md,
push_channels.md, push_admin_publish.md, batch_publish.md and
batch_presence.md, completing the REST unit tier.
The batch REST API and PushChannel are not implemented, so fifty-one tests
carry the deviation mark with the assertion the specification calls for:
forty-one for batch publish and presence, ten for PushChannel. Removing the
mark is all that is needed once each lands. The push admin surface does
exist, and a fifty-second test records that device ids are interpolated into
push paths unescaped, where channel names are quoted.
deviations.md now carries the totals for the tier: of 581 derived tests, 465
pass, 110 are gated behind RUN_DEVIATIONS and 6 cannot be run at all.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
| RSH7, RSH7a–e, RSH6, RSH8 |`PushChannel`: `channel.push`, `client.device`, `LocalDevice`. The push *admin* surface (RSH1) does exist | 10 |
183
201
| RSL7 |`RestChannel#setOptions`. The realtime channel implements it; the REST `options` setter expects the kwargs dict `Channels.get` collected, so a `ChannelOptions` raises `TypeError`| 2 |
184
202
| RSP3a2, RSP3a3 |`clientId` and `connectionId` filters on `RestPresence#get`. `Presence.get` takes only `limit`, while `Presence.history` does take its documented params | 3 |
185
203
| TP5 |`size` on `PresenceMessage`. The related `maxMessageSize` gap is adapted rather than gated, below; `features.md` TM6 has no UTS test | 1 |
@@ -215,6 +233,7 @@ the mark is the only change needed once the SDK behaviour lands.
215
233
| Spec points | Behaviour |
216
234
|---|---|
217
235
| RSC19b | Caller-supplied headers override the configured `Authorization`, because `Http.make_request` applies `headers` after `auth_headers`. RSC19b says requests "unconditionally" use the configured mechanism |
236
+
| RSH1b1 | Device ids are interpolated raw into push paths (`ably/rest/push.py` lines 82, 106, 118), so an id containing `/` addresses a different resource and `:` is unescaped. `ably/rest/channel.py` does quote channel names, so the SDK is inconsistent with itself |
218
237
219
238
## Adapted Tests
220
239
@@ -230,7 +249,7 @@ comment above. These run, so they guard against regression.
230
249
| RSC18 | The constructor rejects basic auth over HTTP | Construction succeeds; 40103 is raised from `make_request` when a request needing Basic Auth is attempted, and no request goes out. RSA1/RSC18 say only "any attempt to use" | Compliant; the UTS is stricter than its source |
231
250
| REC1b1, REC1c1 | Code 40000, or a message containing "invalid" or "conflict" | 400/40106 with a specific message. The features spec mandates no code | Cosmetic |
232
251
| RSAN1a3 | Code 40003 for a missing `Annotation.type`| 400/40000 | Cosmetic; worth aligning cross-SDK |
233
-
252
+
| RSH1a | Empty `recipient` or `data` rejected with code 40000 |`TypeError` / `ValueError`, not an `AblyException`. The "no HTTP request" half is satisfied | Open bug, minor |
234
253
| HP6 |`errorCode` is a number | The raw header string, `'40101'`| Open bug, trivial |
235
254
| HP8 |`headers` is a map | A list of `(name, value)` pairs, so the lookup the spec describes is impossible without converting, and case-insensitivity is lost | Open bug; changing the return type is breaking |
236
255
| RSC19e | An error indicated idiomatically |`httpx.ConnectError` / `ReadTimeout` reach the caller unwrapped, because `AblyRest.request` carries no `@catch_all` unlike `time()` and `stats()`. The messages do name the failure | Borderline; defensible under RSC19e |
0 commit comments