@@ -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+
41116def 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
278351def 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
343414def 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
430505def test_only ():
0 commit comments