Skip to content

Commit 990bda2

Browse files
committed
Test mapping serializer
1 parent a73b1b9 commit 990bda2

File tree

1 file changed

+232
-0
lines changed

1 file changed

+232
-0
lines changed
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
from datetime import date
2+
from datetime import datetime
3+
from datetime import timezone
4+
5+
from constance.test import override_config
6+
from django.contrib.contenttypes.models import ContentType
7+
8+
from app.models import Municipality
9+
from app.models import Person
10+
from app.serializers.person import PersonMappingSerializer
11+
from app.tests import APITestCase
12+
from app.tests.custom_fields.factories import CustomFieldFactory
13+
from app.tests.custom_fields.factories import CustomValueFactory
14+
from app.tests.factories import AddressFactory
15+
from app.tests.factories import PersonFactory
16+
from django_features.custom_fields.models import CustomField
17+
18+
19+
MODEL_MAPPING_FIELD = {
20+
"person": {
21+
"external_firstname": "firstname",
22+
"external_lastname": "lastname",
23+
"external_char_field": "char_value",
24+
"external_text_field": "text_value",
25+
"external_date_field": "date_value",
26+
"external_datetime_field": "datetime_value",
27+
"external_integer_field": "integer_value",
28+
"external_boolean_field": "boolean_value",
29+
"external_multiple_date_field": "multiple_date_value",
30+
"external_choice_field": "choice_value",
31+
"external_multiple_choice_field": "multiple_choice_value",
32+
"external_municipality_title": "place_of_residence.title",
33+
"external_addresses": "addresses",
34+
}
35+
}
36+
37+
38+
class MappingSerializerTestCase(APITestCase):
39+
# We use the app.Person mapping serializer, which implements the MappingSerializer,
40+
# for testing because the MappingSerializer is abstract.
41+
42+
def setUp(self) -> None:
43+
self.person_ct = ContentType.objects.get_for_model(Person)
44+
45+
self.char_field = CustomFieldFactory(
46+
identifier="char_value",
47+
content_type=self.person_ct,
48+
field_type=CustomField.FIELD_TYPES.CHAR,
49+
)
50+
self.text_field = CustomFieldFactory(
51+
identifier="text_value",
52+
content_type=self.person_ct,
53+
field_type=CustomField.FIELD_TYPES.TEXT,
54+
)
55+
self.date_field = CustomFieldFactory(
56+
identifier="date_value",
57+
content_type=self.person_ct,
58+
field_type=CustomField.FIELD_TYPES.DATE,
59+
)
60+
self.datetime_field = CustomFieldFactory(
61+
identifier="datetime_value",
62+
content_type=self.person_ct,
63+
field_type=CustomField.FIELD_TYPES.DATETIME,
64+
)
65+
self.integer_field = CustomFieldFactory(
66+
identifier="integer_value",
67+
content_type=self.person_ct,
68+
field_type=CustomField.FIELD_TYPES.INTEGER,
69+
)
70+
self.boolean_field = CustomFieldFactory(
71+
identifier="boolean_value",
72+
content_type=self.person_ct,
73+
field_type=CustomField.FIELD_TYPES.BOOLEAN,
74+
)
75+
self.multiple_date_field = CustomFieldFactory(
76+
identifier="multiple_date_value",
77+
content_type=self.person_ct,
78+
field_type=CustomField.FIELD_TYPES.DATE,
79+
multiple=True,
80+
)
81+
self.choice_field = CustomFieldFactory(
82+
identifier="choice_value",
83+
content_type=self.person_ct,
84+
field_type=CustomField.FIELD_TYPES.DATE,
85+
choice_field=True,
86+
)
87+
self.multiple_choice_field = CustomFieldFactory(
88+
identifier="multiple_choice_value",
89+
content_type=self.person_ct,
90+
field_type=CustomField.FIELD_TYPES.DATE,
91+
choice_field=True,
92+
multiple_choice=True,
93+
)
94+
95+
self.choice_1 = CustomValueFactory(field=self.choice_field, value="2000-01-01")
96+
self.choice_2 = CustomValueFactory(field=self.choice_field, value="2001-01-01")
97+
98+
self.multiple_choice_1 = CustomValueFactory(
99+
field=self.multiple_choice_field, value="2000-01-01"
100+
)
101+
self.multiple_choice_2 = CustomValueFactory(
102+
field=self.multiple_choice_field, value="2001-01-01"
103+
)
104+
self.multiple_choice_3 = CustomValueFactory(
105+
field=self.multiple_choice_field, value="2002-01-01"
106+
)
107+
108+
self.address_1 = AddressFactory()
109+
self.address_2 = AddressFactory()
110+
self.address_3 = AddressFactory()
111+
112+
@override_config(MODEL_MAPPING_FIELD=MODEL_MAPPING_FIELD)
113+
def test_mapping_serializer_create(self) -> None:
114+
data = {
115+
"external_firstname": "Hugo",
116+
"external_lastname": "Boss",
117+
"external_char_field": "Some char value",
118+
"external_text_field": "Some text value",
119+
"external_date_field": "2000-01-01",
120+
"external_datetime_field": "2000-01-01T12:30:00+01:00",
121+
"external_integer_field": 42,
122+
"external_boolean_field": True,
123+
"external_multiple_date_field": ["2000-01-01", "2001-01-01"],
124+
"external_choice_field": "2000-01-01",
125+
"external_multiple_choice_field": ["2000-01-01", "2001-01-01"],
126+
"external_municipality_title": "Muri",
127+
"external_addresses": [
128+
self.address_1.external_uid,
129+
self.address_2.external_uid,
130+
],
131+
}
132+
133+
serializer = PersonMappingSerializer(data=data)
134+
self.assertTrue(serializer.is_valid(raise_exception=True))
135+
instance = serializer.save()
136+
137+
instance.refresh_with_custom_fields()
138+
139+
self.assertEqual("Hugo", instance.firstname)
140+
self.assertEqual("Boss", instance.lastname)
141+
142+
self.assertEqual(instance.char_value, "Some char value")
143+
self.assertEqual(instance.text_value, "Some text value")
144+
self.assertEqual(instance.date_value, date(2000, 1, 1))
145+
self.assertEqual(
146+
instance.datetime_value, datetime(2000, 1, 1, 11, 30, tzinfo=timezone.utc)
147+
)
148+
self.assertEqual(instance.integer_value, 42)
149+
self.assertEqual(instance.boolean_value, True)
150+
self.assertEqual(
151+
instance.multiple_date_value, [date(2000, 1, 1), date(2001, 1, 1)]
152+
)
153+
self.assertEqual(
154+
instance.choice_value,
155+
{"id": self.choice_1.id, "text": None, "value": "2000-01-01"},
156+
)
157+
self.assertEqual(
158+
instance.multiple_choice_value,
159+
[
160+
{"id": self.multiple_choice_1.id, "text": None, "value": "2000-01-01"},
161+
{"id": self.multiple_choice_2.id, "text": None, "value": "2001-01-01"},
162+
],
163+
)
164+
165+
self.assertEqual("Muri", instance.place_of_residence.title)
166+
self.assertEqual(1, Municipality.objects.count())
167+
self.assertEqual(2, instance.addresses.count())
168+
self.assertEqual(instance, instance.addresses.first().target)
169+
self.assertEqual(instance, instance.addresses.last().target)
170+
171+
@override_config(MODEL_MAPPING_FIELD=MODEL_MAPPING_FIELD)
172+
def test_mapping_serializer_update(self) -> None:
173+
person: Person = PersonFactory(firstname="old", lastname="old") # type: ignore
174+
175+
person.refresh_with_custom_fields()
176+
177+
data = {
178+
"external_firstname": "Hugo2",
179+
"external_lastname": "Boss2",
180+
"external_char_field": "Some char value2",
181+
"external_text_field": "Some text value2",
182+
"external_date_field": "2000-01-02",
183+
"external_datetime_field": "2000-01-02T12:30:00+01:00",
184+
"external_integer_field": 43,
185+
"external_boolean_field": False,
186+
"external_multiple_date_field": ["2000-01-01", "2001-02-01"],
187+
"external_choice_field": "2001-01-01",
188+
"external_multiple_choice_field": ["2000-01-01", "2002-01-01"],
189+
"external_municipality_title": "Koeniz",
190+
"external_addresses": [
191+
self.address_1.external_uid,
192+
self.address_3.external_uid,
193+
],
194+
}
195+
196+
serializer = PersonMappingSerializer(person, data=data)
197+
self.assertTrue(serializer.is_valid(raise_exception=True))
198+
instance = serializer.save()
199+
200+
instance.refresh_with_custom_fields()
201+
202+
self.assertEqual("Hugo2", instance.firstname)
203+
self.assertEqual("Boss2", instance.lastname)
204+
205+
self.assertEqual(instance.char_value, "Some char value2")
206+
self.assertEqual(instance.text_value, "Some text value2")
207+
self.assertEqual(instance.date_value, date(2000, 1, 2))
208+
self.assertEqual(
209+
instance.datetime_value, datetime(2000, 1, 2, 11, 30, tzinfo=timezone.utc)
210+
)
211+
self.assertEqual(instance.integer_value, 43)
212+
self.assertEqual(instance.boolean_value, False)
213+
self.assertEqual(
214+
instance.multiple_date_value, [date(2000, 1, 1), date(2001, 2, 1)]
215+
)
216+
self.assertEqual(
217+
instance.choice_value,
218+
{"id": self.choice_2.id, "text": None, "value": "2001-01-01"},
219+
)
220+
self.assertEqual(
221+
instance.multiple_choice_value,
222+
[
223+
{"id": self.multiple_choice_1.id, "text": None, "value": "2000-01-01"},
224+
{"id": self.multiple_choice_3.id, "text": None, "value": "2002-01-01"},
225+
],
226+
)
227+
228+
self.assertEqual("Koeniz", instance.place_of_residence.title)
229+
self.assertEqual(1, Municipality.objects.count())
230+
self.assertEqual(2, instance.addresses.count())
231+
self.assertEqual(person, instance.addresses.first().target)
232+
self.assertEqual(person, instance.addresses.last().target)

0 commit comments

Comments
 (0)