@@ -38,6 +38,81 @@ def dataclass_param(request):
38
38
return request .param
39
39
40
40
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
+
41
116
def test_simple (module ):
42
117
"""Load dict into a dataclass instance."""
43
118
@@ -223,7 +298,7 @@ class A:
223
298
224
299
225
300
@pytest .mark .parametrize (argnames = ['value' ], argvalues = [["X" ], [5 ]])
226
- def test_union (module , value ):
301
+ def test_union (module , value , assert_dump_load ):
227
302
"""Deserialize one of several types."""
228
303
229
304
@module .dataclass
@@ -234,11 +309,11 @@ class A:
234
309
235
310
dumped = {"x" : value }
236
311
loaded = A (value )
237
- assert schema .load (dumped ) == loaded
238
- assert schema .dump (loaded ) == dumped
239
312
313
+ assert_dump_load (schema = schema , loaded = loaded , dumped = dumped )
240
314
241
- def test_enum (module ):
315
+
316
+ def test_enum (module , assert_dump_load ):
242
317
"""Deserialize an enum object."""
243
318
244
319
class Color (enum .Enum ):
@@ -252,11 +327,11 @@ class A:
252
327
schema = desert .schema_class (A )()
253
328
dumped = {"x" : "RED" }
254
329
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 )
257
332
258
333
259
- def test_tuple (module ):
334
+ def test_tuple (module , assert_dump_load ):
260
335
"""Round trip a tuple.
261
336
262
337
The tuple is converted to list only for dumps(), not during dump().
@@ -270,9 +345,7 @@ class A:
270
345
dumped = {"x" : (1 , False )}
271
346
loaded = A (x = (1 , False ))
272
347
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 )
276
349
277
350
278
351
def test_attr_factory ():
@@ -297,7 +370,7 @@ class A:
297
370
assert data == A ([])
298
371
299
372
300
- def test_newtype (module ):
373
+ def test_newtype (module , assert_dump_load ):
301
374
"""An instance of NewType delegates to its supertype."""
302
375
303
376
MyInt = t .NewType ("MyInt" , int )
@@ -310,8 +383,7 @@ class A:
310
383
dumped = {"x" : 1 }
311
384
loaded = A (x = 1 )
312
385
313
- assert schema .load (dumped ) == loaded
314
- assert schema .dump (loaded ) == dumped
386
+ assert_dump_load (schema = schema , loaded = loaded , dumped = dumped )
315
387
316
388
317
389
@pytest .mark .xfail (
@@ -321,7 +393,7 @@ class A:
321
393
+ "See https://github.com/lovasoa/marshmallow_dataclass/issues/13"
322
394
),
323
395
)
324
- def test_forward_reference (module ):
396
+ def test_forward_reference (module , assert_dump_load ):
325
397
"""Build schemas from classes that are defined below their containing class."""
326
398
327
399
@module .dataclass
@@ -336,8 +408,7 @@ class B:
336
408
dumped = {"x" : {"y" : 1 }}
337
409
loaded = A ((B (1 )))
338
410
339
- assert schema .load (dumped ) == loaded
340
- assert schema .dump (loaded ) == dumped
411
+ assert_dump_load (schema = schema , loaded = loaded , dumped = dumped )
341
412
342
413
343
414
def test_forward_reference_module_scope ():
@@ -422,9 +493,13 @@ class A:
422
493
dumped = {"x" : (1 , 2 , 3 )}
423
494
loaded = A (x = (1 , 2 , 3 ))
424
495
496
+ actually_dumped = {"x" : [1 , 2 , 3 ]}
497
+
498
+ # TODO: how to use assert_dump_load?
425
499
assert schema .load (dumped ) == loaded
426
- assert schema .dump (loaded ) == { "x" : [ 1 , 2 , 3 ]}
500
+ assert schema .dump (loaded ) == actually_dumped
427
501
assert schema .loads (schema .dumps (loaded )) == loaded
502
+ assert schema .dump (schema .load (actually_dumped )) == actually_dumped
428
503
429
504
430
505
def test_only ():
0 commit comments