1
- from typing import Dict , List , Set , Tuple
2
-
1
+ from typing import Dict , List , Set , Tuple , Union , Any
2
+ from copy import deepcopy
3
3
import pytest
4
4
5
5
from json_to_models .dynamic_typing import ModelMeta
@@ -21,71 +21,70 @@ def test_list_ex():
21
21
assert l == [0 , 'a' , * range (1 , 6 ), 'b' , * range (6 , 10 )]
22
22
23
23
24
+ def generate_list_input (input_dict : Dict [str , Any ]) -> Dict [str , Any ]:
25
+ """
26
+ Convert input into a list format.
27
+
28
+ Mimics the case where the JSON in a file has a list
29
+ at the top level, rather than a dictionary.
30
+
31
+ :param input_dict: dict with keys 'value', 'expected', and 'id'
32
+ :type input_dict: dict
33
+ :return: duplicate of the input structure but with the 'value' value as a list
34
+ :rtype: dict
35
+ """
36
+ outputs = {
37
+ "expected" : deepcopy (input_dict ["expected" ]),
38
+ "id" : input_dict ["id" ] + "_list" ,
39
+ "value" : []
40
+ }
41
+
42
+ for item in input_dict ["value" ]:
43
+ # item is a tuple of model name and model data
44
+ model = [{key : deepcopy (value )} for key , value in item [1 ].items ()]
45
+ outputs ["value" ].append ((item [0 ], model ))
46
+
47
+ return outputs
48
+
49
+
24
50
# This test relies on model names as a some sort of models ids
25
51
# and may fail if some logic of their generation will be changed
26
52
# List of Tuple[root_model_name, JSON data] | Dict[model_name, Set[root_model_names]]
27
- test_extract_root_data = [
28
- pytest .param (
29
- [
30
- ("TestModelA" , {
31
- "count" : 1 ,
32
- "items" : [
33
- {
34
- "x" : .5 ,
35
- "y" : .1
36
- }
37
- ]
38
- }),
39
- ("TestModelB" , {
40
- "next" : "some_url" ,
41
- "prev" : None ,
42
- "count" : 2000 ,
43
- "items" : [
44
- {
45
- "x" : .5 ,
46
- "y" : .1
47
- }
48
- ]
49
- }),
53
+ extract_root_data_input = [
54
+ {
55
+ "value" : [
56
+ ("TestModelA" , {"count" : 1 , "items" : [{"x" : 0.5 , "y" : 0.1 }]}),
57
+ (
58
+ "TestModelB" ,
59
+ {
60
+ "next" : "some_url" ,
61
+ "prev" : None ,
62
+ "count" : 2000 ,
63
+ "items" : [{"x" : 0.5 , "y" : 0.1 }],
64
+ },
65
+ ),
50
66
],
51
- {
52
- 'Item' : {'TestModelA' , 'TestModelB' },
53
- 'TestModelA' : set ()
54
- }
55
- ),
56
- pytest .param (
57
- [
58
- ("TestModelA" , {
59
- "count" : 1 ,
60
- "items" : [
61
- {
62
- "x" : .5 ,
63
- "y" : .1
64
- }
65
- ]
66
- }),
67
- ("TestModelB" , {
68
- "count" : 1 ,
69
- "items" : [
70
- {
71
- "x" : .5 ,
72
- "y" : .1
73
- }
74
- ]
75
- }),
67
+ "expected" : {"Item" : {"TestModelA" , "TestModelB" }, "TestModelA" : set ()},
68
+ "id" : "separate_roots"
69
+ },{
70
+ "value" : [
71
+ ("TestModelA" , {"count" : 1 , "items" : [{"x" : 0.5 , "y" : 0.1 }]}),
72
+ ("TestModelB" , {"count" : 1 , "items" : [{"x" : 0.5 , "y" : 0.1 }]}),
76
73
],
77
- {
78
- 'Item' : {'TestModelA_TestModelB' },
79
- 'TestModelA_TestModelB' : set ()
80
- },
81
- id = "merge_root"
82
- )
83
- ]
74
+ "expected" : {"Item" : {"TestModelA_TestModelB" }, "TestModelA_TestModelB" : set ()},
75
+ "id" : "merge_root" ,
76
+ }]
84
77
78
+ extract_root_data_input_list = [generate_list_input (i ) for i in extract_root_data_input ]
79
+ test_extract_root_data = [pytest .param (inpt ["value" ], inpt ["expected" ], id = inpt ["id" ]) for inpt in extract_root_data_input + extract_root_data_input_list ]
85
80
86
81
@pytest .mark .parametrize ("value,expected" , test_extract_root_data )
87
- def test_extract_root (models_generator : MetadataGenerator , models_registry : ModelRegistry ,
88
- value : List [Tuple [str , dict ]], expected : Dict [str , Set [str ]]):
82
+ def test_extract_root (
83
+ models_generator : MetadataGenerator ,
84
+ models_registry : ModelRegistry ,
85
+ value : List [Tuple [str , Union [dict , list ]]],
86
+ expected : Dict [str , Set [str ]],
87
+ ):
89
88
for model_name , data in value :
90
89
fields = models_generator .generate (data )
91
90
models_registry .process_meta_data (fields , model_name = model_name )
@@ -103,7 +102,7 @@ def test_extract_root(models_generator: MetadataGenerator, models_registry: Mode
103
102
104
103
105
104
def _test_compose_models (
106
- function , request ,
105
+ function ,
107
106
models_generator : MetadataGenerator , models_registry : ModelRegistry ,
108
107
value : List [Tuple [str , dict ]], expected : List [Tuple [str , list ]], expected_mapping : Dict [str , str ]
109
108
):
@@ -299,11 +298,10 @@ def check(nested_value: List[dict], nested_expected: List[Tuple[str, list]]):
299
298
300
299
@pytest .mark .parametrize ("value,expected,expected_mapping" , test_compose_models_data )
301
300
def test_compose_models (
302
- request ,
303
301
models_generator : MetadataGenerator , models_registry : ModelRegistry ,
304
302
value : List [Tuple [str , dict ]], expected : List [Tuple [str , list ]], expected_mapping : Dict [str , str ]
305
303
):
306
- _test_compose_models (compose_models , request , models_generator , models_registry , value , expected , expected_mapping )
304
+ _test_compose_models (compose_models , models_generator , models_registry , value , expected , expected_mapping )
307
305
308
306
309
307
test_compose_models_flat_data = [
@@ -606,9 +604,8 @@ def test_compose_models(
606
604
607
605
@pytest .mark .parametrize ("value,expected,expected_mapping" , test_compose_models_flat_data )
608
606
def test_compose_models_flat (
609
- request ,
610
607
models_generator : MetadataGenerator , models_registry : ModelRegistry ,
611
608
value : List [Tuple [str , dict ]], expected : List [Tuple [str , list ]], expected_mapping : Dict [str , str ]
612
609
):
613
- _test_compose_models (compose_models_flat , request , models_generator , models_registry , value , expected ,
610
+ _test_compose_models (compose_models_flat , models_generator , models_registry , value , expected ,
614
611
expected_mapping )
0 commit comments