|
18 | 18 | DecodeError, |
19 | 19 | ForbiddenError, |
20 | 20 | InternalServerError, |
| 21 | + MissingDecoderError, |
21 | 22 | NetworkError, |
22 | 23 | NotFoundError, |
23 | 24 | RateLimitedError, |
@@ -305,3 +306,54 @@ def test_decode_error_pickleable() -> None: |
305 | 306 | assert isinstance(restored.original, ValueError) |
306 | 307 | assert str(restored.original) == "bad payload" |
307 | 308 | assert restored.response.status_code == HTTPStatus.OK |
| 309 | + |
| 310 | + |
| 311 | +class _Foo: |
| 312 | + pass |
| 313 | + |
| 314 | + |
| 315 | +def test_missing_decoder_error_carries_model() -> None: |
| 316 | + exc = MissingDecoderError(model=_Foo, registered_names=()) |
| 317 | + assert exc.model is _Foo |
| 318 | + |
| 319 | + |
| 320 | +def test_missing_decoder_error_carries_registered_names() -> None: |
| 321 | + exc = MissingDecoderError(model=_Foo, registered_names=("PydanticDecoder",)) |
| 322 | + assert exc.registered_names == ("PydanticDecoder",) |
| 323 | + |
| 324 | + |
| 325 | +def test_missing_decoder_error_no_registered_message() -> None: |
| 326 | + exc = MissingDecoderError(model=_Foo, registered_names=()) |
| 327 | + msg = str(exc) |
| 328 | + assert "no decoders registered" in msg |
| 329 | + assert "httpware[pydantic]" in msg |
| 330 | + assert "httpware[msgspec]" in msg |
| 331 | + |
| 332 | + |
| 333 | +def test_missing_decoder_error_single_registered_message() -> None: |
| 334 | + exc = MissingDecoderError(model=_Foo, registered_names=("PydanticDecoder",)) |
| 335 | + assert "registered decoders (PydanticDecoder) all rejected" in str(exc) |
| 336 | + |
| 337 | + |
| 338 | +def test_missing_decoder_error_two_registered_message() -> None: |
| 339 | + exc = MissingDecoderError( |
| 340 | + model=_Foo, |
| 341 | + registered_names=("PydanticDecoder", "MsgspecDecoder"), |
| 342 | + ) |
| 343 | + assert "registered decoders (PydanticDecoder + MsgspecDecoder) all rejected" in str(exc) |
| 344 | + |
| 345 | + |
| 346 | +def test_missing_decoder_error_is_client_error() -> None: |
| 347 | + exc = MissingDecoderError(model=_Foo, registered_names=()) |
| 348 | + assert isinstance(exc, ClientError) |
| 349 | + |
| 350 | + |
| 351 | +def test_missing_decoder_error_pickle_roundtrip() -> None: |
| 352 | + exc = MissingDecoderError( |
| 353 | + model=_Foo, |
| 354 | + registered_names=("PydanticDecoder", "MsgspecDecoder"), |
| 355 | + ) |
| 356 | + revived = pickle.loads(pickle.dumps(exc)) # noqa: S301 |
| 357 | + assert isinstance(revived, MissingDecoderError) |
| 358 | + assert revived.model is _Foo |
| 359 | + assert revived.registered_names == ("PydanticDecoder", "MsgspecDecoder") |
0 commit comments