File: test_jsonschema_plugins.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 (127 lines) | stat: -rw-r--r-- 3,488 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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from dataclasses import dataclass
from typing import Optional

import pytest

from mashumaro.jsonschema.builder import JSONSchemaBuilder, build_json_schema
from mashumaro.jsonschema.models import (
    Context,
    JSONSchema,
    JSONSchemaInstanceType,
)
from mashumaro.jsonschema.plugins import BasePlugin, DocstringDescriptionPlugin
from mashumaro.jsonschema.schema import Instance


class ThirdPartyType:
    pass


@dataclass
class DataClassWithDocstring:
    """Here is the docstring"""

    x: int


@dataclass
class DataClassWithoutDocstring:
    x: int


def test_basic_plugin():
    assert build_json_schema(int, plugins=[BasePlugin()]) == JSONSchema(
        type=JSONSchemaInstanceType.INTEGER
    )


def test_plugin_with_not_implemented_error():
    class NotImplementedErrorPlugin(BasePlugin):
        def get_schema(
            self,
            instance: Instance,
            ctx: Context,
            schema: Optional[JSONSchema] = None,
        ) -> Optional[JSONSchema]:
            raise NotImplementedError

    assert build_json_schema(
        int, plugins=[NotImplementedErrorPlugin()]
    ) == JSONSchema(type=JSONSchemaInstanceType.INTEGER)
    assert JSONSchemaBuilder(plugins=[NotImplementedErrorPlugin()]).build(
        int
    ) == JSONSchema(type=JSONSchemaInstanceType.INTEGER)


@pytest.mark.parametrize(
    ("obj", "docstring"),
    (
        (DataClassWithDocstring, "Here is the docstring"),
        (DataClassWithoutDocstring, "DataClassWithoutDocstring(x: int)"),
        (int, None),
    ),
)
def test_docstring_description_plugin(obj, docstring):
    assert build_json_schema(obj).description is None
    assert JSONSchemaBuilder().build(obj).description is None

    assert (
        build_json_schema(
            obj, plugins=[DocstringDescriptionPlugin()]
        ).description
        == docstring
    )
    assert (
        JSONSchemaBuilder(plugins=[DocstringDescriptionPlugin()])
        .build(obj)
        .description
        == docstring
    )


def test_third_party_type_plugin():
    third_party_json_schema = JSONSchema()

    class ThirdPartyTypePlugin(BasePlugin):
        def get_schema(
            self,
            instance: Instance,
            ctx: Context,
            schema: Optional[JSONSchema] = None,
        ) -> Optional[JSONSchema]:
            try:
                if issubclass(instance.type, ThirdPartyType):
                    return third_party_json_schema
            except TypeError:
                pass

    assert (
        build_json_schema(ThirdPartyType, plugins=[ThirdPartyTypePlugin()])
        is third_party_json_schema
    )
    assert (
        JSONSchemaBuilder(plugins=[ThirdPartyTypePlugin()]).build(
            ThirdPartyType
        )
        is third_party_json_schema
    )
    assert (
        JSONSchemaBuilder(plugins=[ThirdPartyTypePlugin()])
        .build(list[ThirdPartyType])
        .items
        is third_party_json_schema
    )
    assert (
        build_json_schema(
            list[ThirdPartyType], plugins=[ThirdPartyTypePlugin()]
        ).items
        is third_party_json_schema
    )
    with pytest.raises(NotImplementedError):
        build_json_schema(ThirdPartyType)
    with pytest.raises(NotImplementedError):
        JSONSchemaBuilder().build(ThirdPartyType)
    with pytest.raises(NotImplementedError):
        build_json_schema(list[ThirdPartyType])
    with pytest.raises(NotImplementedError):
        JSONSchemaBuilder().build(list[ThirdPartyType])