File: interfaces_test.py

package info (click to toggle)
python-josepy 2.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 484 kB
  • sloc: python: 2,534; makefile: 27
file content (115 lines) | stat: -rw-r--r-- 3,739 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
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
104
105
106
107
108
109
110
111
112
113
114
115
"""Tests for josepy.interfaces."""

import sys
import unittest
from typing import Any, Dict, List

import pytest


class JSONDeSerializableTest(unittest.TestCase):
    def setUp(self) -> None:
        from josepy.interfaces import JSONDeSerializable

        class Basic(JSONDeSerializable):
            def __init__(self, v: Any) -> None:
                self.v = v

            def to_partial_json(self) -> Any:
                return self.v

            @classmethod
            def from_json(cls, jobj: Any) -> "Basic":
                return cls(jobj)

        class Sequence(JSONDeSerializable):
            def __init__(self, x: Basic, y: Basic) -> None:
                self.x = x
                self.y = y

            def to_partial_json(self) -> List[Basic]:
                return [self.x, self.y]

            @classmethod
            def from_json(cls, jobj: List[Any]) -> "Sequence":
                return cls(Basic.from_json(jobj[0]), Basic.from_json(jobj[1]))

        class Mapping(JSONDeSerializable):
            def __init__(self, x: Any, y: Any) -> None:
                self.x = x
                self.y = y

            def to_partial_json(self) -> Dict[Basic, Basic]:
                return {self.x: self.y}

            @classmethod
            def from_json(cls, jobj: Any) -> "Mapping":
                return cls("dummy", "values")  # pragma: no cover

        self.basic1 = Basic("foo1")
        self.basic2 = Basic("foo2")
        self.seq = Sequence(self.basic1, self.basic2)
        self.mapping = Mapping(self.basic1, self.basic2)
        self.nested = Basic([[self.basic1]])
        self.tuple = Basic(("foo",))

        self.Basic = Basic
        self.Sequence = Sequence
        self.Mapping = Mapping

    def test_to_json_sequence(self) -> None:
        assert self.seq.to_json() == ["foo1", "foo2"]

    def test_to_json_mapping(self) -> None:
        assert self.mapping.to_json() == {"foo1": "foo2"}

    def test_to_json_other(self) -> None:
        mock_value = object()
        assert self.Basic(mock_value).to_json() is mock_value

    def test_to_json_nested(self) -> None:
        assert self.nested.to_json() == [["foo1"]]

    def test_to_json(self) -> None:
        assert self.tuple.to_json() == (("foo",))

    def test_from_json_not_implemented(self) -> None:
        from josepy.interfaces import JSONDeSerializable

        with pytest.raises(TypeError):
            JSONDeSerializable.from_json("xxx")

    def test_json_loads(self) -> None:
        seq = self.Sequence.json_loads('["foo1", "foo2"]')
        assert isinstance(seq, self.Sequence)
        assert isinstance(seq.x, self.Basic)
        assert isinstance(seq.y, self.Basic)
        assert seq.x.v == "foo1"
        assert seq.y.v == "foo2"

    def test_json_dumps(self) -> None:
        assert '["foo1", "foo2"]' == self.seq.json_dumps()

    def test_json_dumps_pretty(self) -> None:
        assert self.seq.json_dumps_pretty() == '[\n    "foo1",\n    "foo2"\n]'

    def test_json_dump_default(self) -> None:
        from josepy.interfaces import JSONDeSerializable

        assert "foo1" == JSONDeSerializable.json_dump_default(self.basic1)

        jobj = JSONDeSerializable.json_dump_default(self.seq)
        assert len(jobj) == 2
        assert jobj[0] is self.basic1
        assert jobj[1] is self.basic2

    def test_json_dump_default_type_error(self) -> None:
        from josepy.interfaces import JSONDeSerializable

        with pytest.raises(TypeError):
            # We're purposefully testing with the incorrect type here.
            JSONDeSerializable.json_dump_default(object())  # type: ignore


if __name__ == "__main__":
    sys.exit(pytest.main(sys.argv[1:] + [__file__]))  # pragma: no cover