File: test_discriminator.py

package info (click to toggle)
python-apischema 0.18.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,608 kB
  • sloc: python: 15,266; sh: 7; makefile: 7
file content (57 lines) | stat: -rw-r--r-- 1,319 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
from dataclasses import dataclass
from typing import Literal, TypedDict, Union

import pytest

from apischema import deserialize, discriminator, serialize
from apischema.json_schema import deserialization_schema
from apischema.typing import Annotated


class TypedDictWithoutField(TypedDict):
    pass


class TD1(TypedDict):
    type: str


class TD2(TypedDict):
    type: str


def test_typed_dict_without_discriminator_field_cannot_have_discriminator():
    with pytest.raises(TypeError):
        deserialization_schema(
            Annotated[Union[TD1, TypedDictWithoutField], discriminator("type")]
        )


def test_typed_dict_discriminator():
    assert deserialize(
        Annotated[Union[TD1, TD2], discriminator("type")], {"type": "TD1"}
    ) == {"type": "TD1"}
    assert serialize(
        Annotated[Union[TD1, TD2], discriminator("type")], {"type": "TD1"}
    ) == {"type": "TD1"}


@dataclass
class A:
    type: Literal["a"]


@dataclass
class B:
    pass


@pytest.mark.parametrize("type_, obj", [("a", A("a")), ("B", B())])
def test_discriminator_literal_field(type_, obj):
    assert (
        deserialize(Annotated[Union[A, B], discriminator("type")], {"type": type_})
        == obj
    )
    assert serialize(Annotated[Union[A, B], discriminator("type")], obj) == {
        "type": type_
    }