Skip to content

Commit c23ccc1

Browse files
author
python-desert
authored
Parametrize load dump asserts
2 parents 64b6c34 + 372dbcb commit c23ccc1

File tree

1 file changed

+92
-17
lines changed

1 file changed

+92
-17
lines changed

tests/test_make.py

Lines changed: 92 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,81 @@ def dataclass_param(request):
3838
return request.param
3939

4040

41+
def _assert_load(
42+
schema: t.Type[marshmallow.Schema],
43+
loaded: t.Any,
44+
dumped: t.Dict[t.Any, t.Any],
45+
) -> None:
46+
assert schema.load(dumped) == loaded
47+
48+
49+
def _assert_dump(
50+
schema: t.Type[marshmallow.Schema],
51+
loaded: t.Any,
52+
dumped: t.Dict[t.Any, t.Any],
53+
) -> None:
54+
assert schema.dump(loaded) == dumped
55+
56+
57+
def _assert_dump_load(
58+
schema: t.Type[marshmallow.Schema],
59+
loaded: t.Any,
60+
dumped: t.Dict[t.Any, t.Any],
61+
) -> None:
62+
assert schema.loads(schema.dumps(loaded)) == loaded
63+
64+
65+
def _assert_load_dump(
66+
schema: t.Type[marshmallow.Schema],
67+
loaded: t.Any,
68+
dumped: t.Dict[t.Any, t.Any],
69+
) -> None:
70+
assert schema.dump(schema.load(dumped)) == dumped
71+
72+
73+
def fixture_from_dict(
74+
name: str,
75+
id_to_value: t.Mapping[
76+
str,
77+
t.Callable[
78+
[
79+
t.Type[marshmallow.Schema],
80+
t.Dict[t.Any, t.Any],
81+
t.Any,
82+
],
83+
None,
84+
],
85+
],
86+
):
87+
"""
88+
Create fixture parametrized to yield each value and labeled with the
89+
corresponding ID.
90+
:param name: Name of the fixture itself
91+
:param id_to_value: Mapping from ID labels to values
92+
:return: The PyTest fixture
93+
"""
94+
@pytest.fixture(
95+
name=name,
96+
params=id_to_value.values(),
97+
ids=id_to_value.keys(),
98+
)
99+
def fixture(request):
100+
return request.param
101+
102+
return fixture
103+
104+
105+
_assert_dump_load = fixture_from_dict(
106+
name='assert_dump_load',
107+
id_to_value={
108+
'load': _assert_load,
109+
'dump': _assert_dump,
110+
'dump load': _assert_dump_load,
111+
'load dump': _assert_load_dump,
112+
},
113+
)
114+
115+
41116
def test_simple(module):
42117
"""Load dict into a dataclass instance."""
43118

@@ -223,7 +298,7 @@ class A:
223298

224299

225300
@pytest.mark.parametrize(argnames=['value'], argvalues=[["X"], [5]])
226-
def test_union(module, value):
301+
def test_union(module, value, assert_dump_load):
227302
"""Deserialize one of several types."""
228303

229304
@module.dataclass
@@ -234,11 +309,11 @@ class A:
234309

235310
dumped = {"x": value}
236311
loaded = A(value)
237-
assert schema.load(dumped) == loaded
238-
assert schema.dump(loaded) == dumped
239312

313+
assert_dump_load(schema=schema, loaded=loaded, dumped=dumped)
240314

241-
def test_enum(module):
315+
316+
def test_enum(module, assert_dump_load):
242317
"""Deserialize an enum object."""
243318

244319
class Color(enum.Enum):
@@ -252,11 +327,11 @@ class A:
252327
schema = desert.schema_class(A)()
253328
dumped = {"x": "RED"}
254329
loaded = A(Color.RED)
255-
assert schema.load(dumped) == loaded
256-
assert schema.dump(loaded) == dumped
330+
331+
assert_dump_load(schema=schema, loaded=loaded, dumped=dumped)
257332

258333

259-
def test_tuple(module):
334+
def test_tuple(module, assert_dump_load):
260335
"""Round trip a tuple.
261336
262337
The tuple is converted to list only for dumps(), not during dump().
@@ -270,9 +345,7 @@ class A:
270345
dumped = {"x": (1, False)}
271346
loaded = A(x=(1, False))
272347

273-
assert schema.load(dumped) == loaded
274-
assert schema.dump(loaded) == dumped
275-
assert schema.loads(schema.dumps(loaded)) == loaded
348+
assert_dump_load(schema=schema, loaded=loaded, dumped=dumped)
276349

277350

278351
def test_attr_factory():
@@ -297,7 +370,7 @@ class A:
297370
assert data == A([])
298371

299372

300-
def test_newtype(module):
373+
def test_newtype(module, assert_dump_load):
301374
"""An instance of NewType delegates to its supertype."""
302375

303376
MyInt = t.NewType("MyInt", int)
@@ -310,8 +383,7 @@ class A:
310383
dumped = {"x": 1}
311384
loaded = A(x=1)
312385

313-
assert schema.load(dumped) == loaded
314-
assert schema.dump(loaded) == dumped
386+
assert_dump_load(schema=schema, loaded=loaded, dumped=dumped)
315387

316388

317389
@pytest.mark.xfail(
@@ -321,7 +393,7 @@ class A:
321393
+ "See https://github.com/lovasoa/marshmallow_dataclass/issues/13"
322394
),
323395
)
324-
def test_forward_reference(module):
396+
def test_forward_reference(module, assert_dump_load):
325397
"""Build schemas from classes that are defined below their containing class."""
326398

327399
@module.dataclass
@@ -336,8 +408,7 @@ class B:
336408
dumped = {"x": {"y": 1}}
337409
loaded = A((B(1)))
338410

339-
assert schema.load(dumped) == loaded
340-
assert schema.dump(loaded) == dumped
411+
assert_dump_load(schema=schema, loaded=loaded, dumped=dumped)
341412

342413

343414
def test_forward_reference_module_scope():
@@ -422,9 +493,13 @@ class A:
422493
dumped = {"x": (1, 2, 3)}
423494
loaded = A(x=(1, 2, 3))
424495

496+
actually_dumped = {"x": [1, 2, 3]}
497+
498+
# TODO: how to use assert_dump_load?
425499
assert schema.load(dumped) == loaded
426-
assert schema.dump(loaded) == {"x": [1, 2, 3]}
500+
assert schema.dump(loaded) == actually_dumped
427501
assert schema.loads(schema.dumps(loaded)) == loaded
502+
assert schema.dump(schema.load(actually_dumped)) == actually_dumped
428503

429504

430505
def test_only():

0 commit comments

Comments
 (0)