File: test_serializers.py

package info (click to toggle)
pdm 2.26.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 5,664 kB
  • sloc: python: 26,438; sh: 314; javascript: 34; makefile: 26
file content (71 lines) | stat: -rw-r--r-- 2,816 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from __future__ import annotations

import json
from datetime import datetime

import pytest
from hishel._serializers import Metadata
from httpcore import Request, Response

from pdm.models.serializers import Encoder, MsgPackSerializer


@pytest.mark.msgpack
def test_compatibility():
    try:
        import msgpack
    except ImportError:
        pytest.skip("msgpack is not installed, skipping compatibility tests")

    response = Response(200, headers={"key": "value"}, content=b"I'm a teapot.", extensions={"http_version": "2.0"})
    response.read()
    request = Request("POST", "http://test.com", headers={"user-agent": ""}, extensions={"timeout": 10})
    metadata = Metadata(number_of_uses=1, created_at=datetime.now(), cache_key="foo")
    serializer = MsgPackSerializer()

    # dumped by msgpack, loads by msgpack is OK
    cached_bytes = serializer.dumps(response, request, metadata)
    resp, req, meta = serializer.loads(cached_bytes)
    resp.read()
    assert not cached_bytes.startswith(b"{")  # Ensure that it was dumped by msgpack
    assert resp.status == response.status
    assert resp.content == response.content
    assert resp.headers == response.headers
    assert resp.extensions == response.extensions
    assert req.method == request.method
    assert req.extensions == request.extensions
    assert req.headers == request.headers
    assert meta == metadata

    # dumped by msgpack, loads by json will return None
    origin_msgpack_loads = msgpack.loads
    msgpack.loads = lambda data, raw: json.loads(data, object_hook=Encoder.object_hook)
    assert serializer.loads(cached_bytes) is None

    # dumped by json, loads by json is OK
    msgpack.packb = lambda data, use_bin_type: json.dumps(data, cls=Encoder).encode()
    cached_bytes = serializer.dumps(response, request, metadata)
    assert cached_bytes.startswith(b"{")  # Ensure that it was dumped by json
    resp, req, meta = serializer.loads(cached_bytes)
    resp.read()
    assert resp.status == response.status
    assert resp.content == response.content
    assert resp.headers == response.headers
    assert resp.extensions == response.extensions
    assert req.method == request.method
    assert req.extensions == request.extensions
    assert req.headers == request.headers
    assert meta == metadata

    # dumped by json, loads with msgpack installed is OK too
    msgpack.loads = origin_msgpack_loads
    resp, req, meta = serializer.loads(cached_bytes)
    resp.read()
    assert resp.status == response.status
    assert resp.content == response.content
    assert resp.headers == response.headers
    assert resp.extensions == response.extensions
    assert req.method == request.method
    assert req.extensions == request.extensions
    assert req.headers == request.headers
    assert meta == metadata