Skip to content

Commit 786f4c0

Browse files
authored
tests for serializing dataclasses with InitVar and ClassVar (#411)
1 parent e248ef7 commit 786f4c0

File tree

2 files changed

+23
-14
lines changed

2 files changed

+23
-14
lines changed

tests/serializers/test_any.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import dataclasses
12
import json
2-
from dataclasses import dataclass
33
from datetime import date, datetime, time, timedelta, timezone
44
from decimal import Decimal
55
from enum import Enum
6+
from typing import ClassVar
67

78
import pytest
89
from dirty_equals import IsList
@@ -22,10 +23,12 @@ def test_repr(any_serializer):
2223
assert plain_repr(any_serializer) == 'SchemaSerializer(serializer=Any(AnySerializer),slots=[])'
2324

2425

25-
@dataclass(frozen=True)
26+
@dataclasses.dataclass(frozen=True)
2627
class MyDataclass:
28+
class_var: ClassVar[int] = 1
2729
a: int
2830
b: str
31+
frog: dataclasses.InitVar[int]
2932

3033

3134
class MyModel:
@@ -46,7 +49,7 @@ def test_any_json_round_trip(any_serializer, value):
4649
@pytest.mark.parametrize(
4750
'input_value,expected_plain,expected_json_obj',
4851
[
49-
(MyDataclass(1, 'foo'), {'a': 1, 'b': 'foo'}, {'a': 1, 'b': 'foo'}),
52+
(MyDataclass(1, 'foo', 3), {'a': 1, 'b': 'foo'}, {'a': 1, 'b': 'foo'}),
5053
(MyModel(a=1, b='foo'), {'a': 1, 'b': 'foo'}, {'a': 1, 'b': 'foo'}),
5154
({1, 2, 3}, {1, 2, 3}, IsList(1, 2, 3, check_order=False)),
5255
({1, '2', b'3'}, {1, '2', b'3'}, IsList(1, '2', '3', check_order=False)),
@@ -59,7 +62,7 @@ def test_any_python(any_serializer, input_value, expected_plain, expected_json_o
5962

6063

6164
def test_set_member_db(any_serializer):
62-
input_value = {MyDataclass(1, 'a'), MyDataclass(2, 'b')}
65+
input_value = {MyDataclass(1, 'a', 2), MyDataclass(2, 'b', 2)}
6366
expected_json_obj = IsList({'a': 1, 'b': 'a'}, {'a': 2, 'b': 'b'}, check_order=False)
6467
assert any_serializer.to_python(input_value, mode='json') == expected_json_obj
6568
assert json.loads(any_serializer.to_json(input_value)) == expected_json_obj
@@ -84,9 +87,9 @@ def test_set_member_db(any_serializer):
8487
(date(2022, 12, 3), b'"2022-12-03"'),
8588
(time(12, 30, 45), b'"12:30:45"'),
8689
(timedelta(hours=2), b'"PT7200S"'),
87-
(MyDataclass(1, 'foo'), b'{"a":1,"b":"foo"}'),
90+
(MyDataclass(1, 'foo', 2), b'{"a":1,"b":"foo"}'),
8891
(MyModel(a=1, b='foo'), b'{"a":1,"b":"foo"}'),
89-
([MyDataclass(1, 'a'), MyModel(a=2, b='b')], b'[{"a":1,"b":"a"},{"a":2,"b":"b"}]'),
92+
([MyDataclass(1, 'a', 2), MyModel(a=2, b='b')], b'[{"a":1,"b":"a"},{"a":2,"b":"b"}]'),
9093
],
9194
)
9295
def test_any_json(any_serializer, value, expected_json):
@@ -205,22 +208,22 @@ def test_include_generator(any_serializer):
205208

206209
def test_include_dict(any_serializer):
207210
assert any_serializer.to_python({1: 2, '3': 4}) == {1: 2, '3': 4}
208-
assert any_serializer.to_python(MyDataclass(a=1, b='foo')) == {'a': 1, 'b': 'foo'}
211+
assert any_serializer.to_python(MyDataclass(a=1, b='foo', frog=2)) == {'a': 1, 'b': 'foo'}
209212
assert any_serializer.to_python({1: 2, '3': 4}, mode='json') == {'1': 2, '3': 4}
210213
assert any_serializer.to_json({1: 2, '3': 4}) == b'{"1":2,"3":4}'
211-
assert any_serializer.to_json(MyDataclass(a=1, b='foo')) == b'{"a":1,"b":"foo"}'
214+
assert any_serializer.to_json(MyDataclass(a=1, b='foo', frog=2)) == b'{"a":1,"b":"foo"}'
212215

213216
assert any_serializer.to_python({1: 2, '3': 4}, include={1}) == {1: 2}
214217
assert any_serializer.to_python({1: 2, '3': 4}, include={'3'}) == {'3': 4}
215-
assert any_serializer.to_python(MyDataclass(a=1, b='foo'), include={'a'}) == {'a': 1}
216-
assert any_serializer.to_python(MyDataclass(a=1, b='foo'), include={'a'}, mode='json') == {'a': 1}
218+
assert any_serializer.to_python(MyDataclass(a=1, b='foo', frog=2), include={'a'}) == {'a': 1}
219+
assert any_serializer.to_python(MyDataclass(a=1, b='foo', frog=2), include={'a'}, mode='json') == {'a': 1}
217220
assert any_serializer.to_python(MyModel(a=1, b='foo'), include={'a'}) == {'a': 1}
218221
assert any_serializer.to_python(MyModel(a=1, b='foo'), include={'a'}, mode='json') == {'a': 1}
219222
assert any_serializer.to_python({1: 2, '3': 4}, include={1}, mode='json') == {'1': 2}
220223
assert any_serializer.to_python({1: 2, '3': 4}, include={'3'}, mode='json') == {'3': 4}
221224
assert any_serializer.to_json({1: 2, '3': 4}, include={1}) == b'{"1":2}'
222225
assert any_serializer.to_json({1: 2, '3': 4}, include={'3'}) == b'{"3":4}'
223-
assert any_serializer.to_json(MyDataclass(a=1, b='foo'), include={'a'}) == b'{"a":1}'
226+
assert any_serializer.to_json(MyDataclass(a=1, b='foo', frog=2), include={'a'}) == b'{"a":1}'
224227

225228

226229
class FieldsSetModel:
@@ -326,7 +329,7 @@ def test_base64():
326329
(lambda: Decimal('12.34'), {}, b'"12.34"'),
327330
(lambda: MyEnum.a, {}, b'1'),
328331
(lambda: MyEnum.b, {}, b'"b"'),
329-
(lambda: [MyDataclass(1, 'a'), MyModel(a=2, b='b')], {}, b'[{"a":1,"b":"a"},{"a":2,"b":"b"}]'),
332+
(lambda: [MyDataclass(1, 'a', 2), MyModel(a=2, b='b')], {}, b'[{"a":1,"b":"a"},{"a":2,"b":"b"}]'),
330333
# # (lambda: re.compile('^regex$'), b'"^regex$"'),
331334
],
332335
)

tests/serializers/test_model.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import dataclasses
22
import json
33
import platform
4+
from typing import ClassVar
45

56
import pytest
67

@@ -54,9 +55,11 @@ def test_model():
5455

5556
@dataclasses.dataclass
5657
class DataClass:
58+
class_var: ClassVar[int] = 1
5759
foo: int
5860
bar: str
5961
spam: bytes
62+
frog: dataclasses.InitVar[int]
6063

6164

6265
def test_dataclass():
@@ -65,6 +68,7 @@ def test_dataclass():
6568
core_schema.arguments_parameter('foo', core_schema.int_schema()),
6669
core_schema.arguments_parameter('bar', core_schema.str_schema()),
6770
core_schema.arguments_parameter('spam', core_schema.bytes_schema(), mode='keyword_only'),
71+
core_schema.arguments_parameter('frog', core_schema.int_schema(), mode='keyword_only'),
6872
),
6973
DataClass,
7074
serialization=core_schema.model_ser_schema(
@@ -80,12 +84,14 @@ def test_dataclass():
8084
)
8185
# just check validation works as expected
8286
v = SchemaValidator(schema)
83-
dc = v.validate_python({'foo': 1, 'bar': 'bar-str', 'spam': 'bite'})
84-
assert dc == DataClass(foo=1, bar='bar-str', spam=b'bite')
87+
dc = v.validate_python({'foo': 1, 'bar': 'bar-str', 'spam': 'bite', 'frog': 123})
88+
assert dc == DataClass(foo=1, bar='bar-str', spam=b'bite', frog=123)
89+
dc.class_var = 2
8590
assert dataclasses.is_dataclass(dc)
8691

8792
s = SchemaSerializer(schema)
8893

94+
assert dataclasses.asdict(dc) == IsStrictDict(foo=1, bar='bar-str', spam=b'bite')
8995
assert s.to_python(dc) == IsStrictDict(foo=1, bar='bar-str', spam=b'bite')
9096

9197
assert s.to_python(dc, mode='json') == {'foo': 1, 'bar': 'bar-str', 'spam': 'bite'}

0 commit comments

Comments
 (0)