File: test_json.py

package info (click to toggle)
python-mashumaro 3.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,408 kB
  • sloc: python: 19,981; sh: 16; makefile: 5
file content (103 lines) | stat: -rw-r--r-- 2,450 bytes parent folder | download | duplicates (2)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import json
from dataclasses import dataclass
from datetime import datetime
from typing import List

import pytest

from mashumaro.exceptions import MissingField
from mashumaro.mixins.json import DataClassJSONMixin

from .entities import MyEnum


def test_to_json():
    @dataclass
    class DataClass(DataClassJSONMixin):
        x: List[int]

    dumped = json.dumps({"x": [1, 2, 3]})
    assert DataClass([1, 2, 3]).to_json() == dumped


def test_from_json():
    @dataclass
    class DataClass(DataClassJSONMixin):
        x: List[int]

    dumped = json.dumps({"x": [1, 2, 3]})
    assert DataClass.from_json(dumped) == DataClass([1, 2, 3])


def test_to_json_with_custom_encoder():
    @dataclass
    class DataClass(DataClassJSONMixin):
        x: List[int]
        x_count: int

    def encoder(d):
        dd = dict(d)
        dd.pop("x_count", None)
        return json.dumps(dd)

    instance = DataClass(x=[1, 2, 3], x_count=3)
    dumped = json.dumps({"x": [1, 2, 3]})
    assert instance.to_json(encoder=encoder) == dumped
    assert instance.to_json() != dumped


def test_from_json_with_custom_decoder():
    @dataclass
    class DataClass(DataClassJSONMixin):
        x: List[int]
        x_count: int

    def decoder(s):
        d = json.loads(s)
        d["x_count"] = len(d.get("x", []))
        return d

    instance = DataClass(x=[1, 2, 3], x_count=3)
    dumped = json.dumps({"x": [1, 2, 3]})
    assert DataClass.from_json(dumped, decoder=decoder) == instance
    with pytest.raises(MissingField):
        assert DataClass.from_json(dumped)


def test_json_enum():
    @dataclass
    class DataClass(DataClassJSONMixin):
        x: MyEnum

    dumped = '{"x": "letter a"}'
    instance = DataClass(MyEnum.a)

    assert instance.to_json() == dumped
    assert instance.to_json() == dumped
    assert DataClass.from_json(dumped) == instance


def test_json_bytes():
    @dataclass
    class DataClass(DataClassJSONMixin):
        x: bytes

    dumped = r'{"x": "MTIz\n"}'
    instance = DataClass(b"123")

    assert instance.to_json() == dumped
    assert DataClass.from_json(dumped) == instance


def test_json_datetime():
    dt = datetime(2018, 10, 29, 12, 46, 55, 308495)

    @dataclass
    class DataClass(DataClassJSONMixin):
        x: datetime

    dumped = json.dumps({"x": dt.isoformat()})
    instance = DataClass(x=dt)

    assert instance.to_json() == dumped
    assert DataClass.from_json(dumped) == instance