1
+ from typing import Any , Callable , Dict
2
+
1
3
import pytest
2
4
from common .metadata .serializers import (
3
5
MetadataSerializer ,
4
6
)
7
+ from django .contrib .contenttypes .models import ContentType
5
8
6
9
from metadata .models import (
7
10
FIELD_VALUE_MAX_LENGTH ,
8
11
MetadataField ,
9
12
MetadataModelField ,
10
13
)
14
+ from metadata .serializers import MetaDataModelFieldSerializer
15
+ from organisations .models import Organisation
16
+ from projects .models import Project
11
17
12
18
13
19
@pytest .mark .parametrize (
28
34
("multiline_str" , "a valid string" , True ),
29
35
],
30
36
)
31
- def test_metadata_serializer_validate_validates_field_value_type_correctly ( # type: ignore[no-untyped-def]
32
- organisation , environment_content_type , field_type , field_value , expected_is_valid
33
- ):
37
+ def test_metadata_serializer_validate_validates_field_value_type_correctly (
38
+ organisation : Organisation ,
39
+ environment_content_type : ContentType ,
40
+ field_type : str ,
41
+ field_value : str ,
42
+ expected_is_valid : bool ,
43
+ ) -> None :
34
44
# Given
35
45
field = MetadataField .objects .create (
36
46
name = "b" , type = field_type , organisation = organisation
@@ -40,9 +50,124 @@ def test_metadata_serializer_validate_validates_field_value_type_correctly( # t
40
50
field = field , content_type = environment_content_type
41
51
)
42
52
43
- data = {"model_field" : model_field .id , "field_value" : field_value }
53
+ data : Dict [ str , Any ] = {"model_field" : model_field .id , "field_value" : field_value }
44
54
45
55
serializer = MetadataSerializer (data = data )
46
56
47
57
# When/ Then
48
58
assert serializer .is_valid () is expected_is_valid
59
+
60
+
61
+ @pytest .mark .parametrize (
62
+ "content_type_target,expected_is_valid,error_message,get_object_id" ,
63
+ [
64
+ (
65
+ "organisation" ,
66
+ True ,
67
+ None ,
68
+ lambda ** kwargs : kwargs ["metadata_field" ].organisation .id ,
69
+ ),
70
+ ("project" , True , None , lambda ** kwargs : kwargs ["project" ].id ),
71
+ (
72
+ "project" ,
73
+ False ,
74
+ "The requirement organisation does not match the field organisation" ,
75
+ lambda ** kwargs : kwargs ["metadata_field" ].organisation .id ,
76
+ ),
77
+ (
78
+ "organisation" ,
79
+ False ,
80
+ "The requirement organisation does not match the field organisation" ,
81
+ lambda ** kwargs : kwargs ["project" ].id ,
82
+ ),
83
+ ],
84
+ )
85
+ def test_metadata_model_field_serializer_validation (
86
+ a_metadata_field : MetadataField ,
87
+ feature_content_type : ContentType ,
88
+ project : Project ,
89
+ content_type_target : str ,
90
+ organisation_content_type : ContentType ,
91
+ project_content_type : ContentType ,
92
+ expected_is_valid : bool ,
93
+ error_message : str | None ,
94
+ get_object_id : Callable [..., int ],
95
+ ) -> None :
96
+ content_type = (
97
+ organisation_content_type
98
+ if content_type_target == "organisation"
99
+ else project_content_type
100
+ )
101
+ object_id = get_object_id (project = project , metadata_field = a_metadata_field )
102
+
103
+ # Given
104
+ data : Dict [str , Any ] = {
105
+ "field" : a_metadata_field .id ,
106
+ "content_type" : feature_content_type .id ,
107
+ "is_required_for" : [
108
+ {
109
+ "content_type" : content_type .id ,
110
+ "object_id" : object_id ,
111
+ }
112
+ ],
113
+ }
114
+
115
+ # When
116
+ serializer = MetaDataModelFieldSerializer (data = data )
117
+ result = serializer .is_valid ()
118
+
119
+ # Then
120
+ assert result is expected_is_valid
121
+ if not expected_is_valid :
122
+ assert "non_field_errors" in serializer .errors
123
+ assert serializer .errors ["non_field_errors" ][0 ] == error_message
124
+
125
+
126
+ def test_metadata_model_field_serializer_with_empty_is_required_for (
127
+ a_metadata_field : MetadataField ,
128
+ feature_content_type : ContentType ,
129
+ ) -> None :
130
+ # Given
131
+ data : Dict [str , Any ] = {
132
+ "field" : a_metadata_field .id ,
133
+ "content_type" : feature_content_type .id ,
134
+ "is_required_for" : [],
135
+ }
136
+ # When
137
+ serializer = MetaDataModelFieldSerializer (data = data )
138
+ result : bool = serializer .is_valid ()
139
+ # Then
140
+ assert result is True
141
+
142
+
143
+ def test_metadata_model_field_serializer_validation_invalid_content_type (
144
+ a_metadata_field : MetadataField ,
145
+ feature_content_type : ContentType ,
146
+ project : Project ,
147
+ segment_content_type : ContentType ,
148
+ ) -> None :
149
+ object_id = project .id
150
+
151
+ # Given
152
+ data : Dict [str , Any ] = {
153
+ "field" : a_metadata_field .id ,
154
+ "content_type" : feature_content_type .id ,
155
+ "is_required_for" : [
156
+ {
157
+ "content_type" : segment_content_type .id ,
158
+ "object_id" : object_id ,
159
+ }
160
+ ],
161
+ }
162
+
163
+ # When
164
+ serializer = MetaDataModelFieldSerializer (data = data )
165
+ result = serializer .is_valid ()
166
+
167
+ # Then
168
+ assert result is False
169
+ assert "non_field_errors" in serializer .errors
170
+ assert (
171
+ serializer .errors ["non_field_errors" ][0 ]
172
+ == "The requirement content type must be project or organisation"
173
+ )
0 commit comments