1
1
import os .path
2
+ from typing import Dict , List
2
3
from unittest import TestCase
3
4
5
+ from pydantic import BaseModel
4
6
from pydantic .error_wrappers import ValidationError
5
- from samtranslator .validator .resource_validator import to_resource_model
7
+ from samtranslator .validator .resource_validator import to_model
6
8
from samtranslator .yaml_helper import yaml_parse
7
9
from schema_source .aws_serverless_connector import Properties as ConnectorProperties
8
10
9
11
BASE_PATH = os .path .dirname (__file__ )
10
12
CONNECTOR_INPUT_FOLDER = os .path .join (BASE_PATH , "input" , "connector" )
11
13
12
14
13
- class TestResourceModel (TestCase ):
15
+ class Random (BaseModel ):
16
+ value : int
17
+
18
+
19
+ class Tag (BaseModel ):
20
+ A : str
21
+ B : int
22
+
23
+
24
+ class Content (BaseModel ):
25
+ Tags : Tag
26
+
27
+
28
+ class Contents (BaseModel ):
29
+ Content : Content
30
+
31
+
32
+ class Properties (BaseModel ):
33
+ Key : Dict [str , Random ]
34
+ Hello : List [str ]
35
+ Random : Random
36
+
37
+
38
+ class ValidatiorBaseModel (BaseModel ):
39
+ Properties : Properties
40
+ Contents : List [Contents ]
41
+
42
+
43
+ class TestModel (TestCase ):
14
44
def setUp (self ) -> None :
15
45
self .connector_template = {
16
46
"Source" : {
@@ -21,8 +51,17 @@ def setUp(self) -> None:
21
51
"Permissions" : ["Read" ],
22
52
}
23
53
24
- def test_resource_model_get (self ):
25
- connector_model = to_resource_model (
54
+ self .model_template = {
55
+ "Properties" : {"Key" : {"A" : {"value" : 10 }}, "Hello" : ["1" , "2" , "3" ], "Random" : {"value" : 5 }},
56
+ "Contents" : [
57
+ {"Content" : {"Tags" : {"A" : "hello" , "B" : 5 }}},
58
+ {"Content" : {"Tags" : {"A" : "wow" , "B" : 10 }}},
59
+ {"Content" : {"Tags" : {"A" : "no" , "B" : - 5 }}},
60
+ ],
61
+ }
62
+
63
+ def test_connector_model_get_operation (self ):
64
+ connector_model = to_model (
26
65
self .connector_template ,
27
66
ConnectorProperties ,
28
67
)
@@ -38,9 +77,24 @@ def test_resource_model_get(self):
38
77
self .assertEqual (connector_model ["Destination" ]["Id" ], "MyTable" )
39
78
self .assertEqual (connector_model ["Permissions" ], ["Read" ])
40
79
80
+ def test_model_get_operation (self ):
81
+ model = to_model (self .model_template , ValidatiorBaseModel )
82
+ self .assertEqual (model ["Properties" ]["Key" ], {"A" : {"value" : 10 }})
83
+ self .assertEqual (model ["Properties" ]["Key" ]["A" ], {"value" : 10 })
84
+ self .assertEqual (model ["Properties" ]["Hello" ], ["1" , "2" , "3" ])
85
+ self .assertEqual (model .get ("Properties" ).get ("Random" )["value" ], 5 )
86
+ self .assertEqual (model .get ("DoNotExist" ), None )
87
+
88
+ self .assertEqual (len (model ["Contents" ]), 3 )
89
+ self .assertEqual (model ["Contents" ][0 ]["Content" ]["Tags" ]["A" ], "hello" )
90
+ self .assertEqual (model ["Contents" ][0 ]["Content" ]["Tags" ]["B" ], 5 )
91
+ self .assertEqual (model ["Contents" ][1 ]["Content" ]["Tags" ]["A" ], "wow" )
92
+ self .assertEqual (model ["Contents" ][0 ]["Content" ]["Tags" ].get ("C" ), None )
93
+ self .assertEqual (model ["Contents" ][2 ]["Content" ]["Tags" ]["B" ], - 5 )
41
94
42
- class TestResourceValidatorFailure (TestCase ):
43
- def test_to_resource_model_error_connector_template (self ):
95
+
96
+ class TestModelValidatorFailure (TestCase ):
97
+ def test_to_model_error_connector_template (self ):
44
98
manifest = yaml_parse (open (os .path .join (CONNECTOR_INPUT_FOLDER , "error_connector.yaml" )))
45
99
for _ , resource in manifest ["Resources" ].items ():
46
100
properties = resource ["Properties" ]
@@ -49,4 +103,16 @@ def test_to_resource_model_error_connector_template(self):
49
103
ValidationError ,
50
104
"[1-9] validation error for Properties(.|\n )+(Source|Destination|Permissions)(.|\n )*(field required)|(unexpected value)|(str type expected)|(value is not a valid list).+" ,
51
105
):
52
- to_resource_model (properties , ConnectorProperties )
106
+ to_model (properties , ConnectorProperties )
107
+
108
+ def test_to_model_test_base_model (self ):
109
+ invalid_model_template = {
110
+ "Properties" : {"Key" : "123" , "Hello" : 5 , "Random" : {}},
111
+ "Contents" : [{"Content" : {"Tags" : {"A" : "hello" , "B" : 5 }}}, {"Content" : {"Tags" : {"A" : "wow" }}}],
112
+ }
113
+
114
+ with self .assertRaisesRegex (
115
+ ValidationError ,
116
+ "[1-9] validation error for TestBaseModel(.|\n )+(Contents)(.|\n )*(field required)|(unexpected value)|(str type expected)|(value is not a valid list).+" ,
117
+ ):
118
+ to_model (invalid_model_template , ValidatiorBaseModel )
0 commit comments