From cc549cc2a6af6b561de1c431e1cba83ceb0e3590 Mon Sep 17 00:00:00 2001 From: Maksim Date: Thu, 15 Nov 2018 20:41:42 +0200 Subject: [PATCH] tests custom fields --- amocrm_api/custom_fields.py | 12 ++++++++++++ tests/test_custom_fields.py | 38 ++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/amocrm_api/custom_fields.py b/amocrm_api/custom_fields.py index b585789..4725c6d 100644 --- a/amocrm_api/custom_fields.py +++ b/amocrm_api/custom_fields.py @@ -1,5 +1,7 @@ from copy import deepcopy from collections import UserDict, defaultdict, Mapping +from datetime import datetime, date +import dateutil.parser as datetime_parcer from marshmallow import fields, pre_load, pre_dump, validate, ValidationError from multidict import MultiDict @@ -252,6 +254,16 @@ def _serialize(self, value, attr, obj): class DateField(_SingleMixin, _CustomFieldMixin, fields.Date): field_type = FIELD_TYPE.DATE + def _deserialize(self, value, attr, data): + if value: + return datetime_parcer.parse(value[0]['value']).date() + + def _serialize(self, value, attr, data): + if value is not None: + if not isinstance(value, date): + raise ValidationError('Expected date, got %s' % type(value)) + return [{'value': value.isoformat()}] + class UrlField(TextField): field_type = FIELD_TYPE.URL diff --git a/tests/test_custom_fields.py b/tests/test_custom_fields.py index cfa6943..c1e5345 100644 --- a/tests/test_custom_fields.py +++ b/tests/test_custom_fields.py @@ -1,20 +1,42 @@ import uuid +from datetime import date import pytest from amocrm_api.models import Contact from amocrm_api.constants import FIELD_TYPE, ELEMENT_TYPE -from amocrm_api.custom_fields import CUSTOM_FIELD_MAP +from amocrm_api.custom_fields import CUSTOM_FIELD_MAP # , SmartAddress, LegalEntity @pytest.mark.parametrize('field_type,value', ( (FIELD_TYPE.TEXT, 'VALUE1'), (FIELD_TYPE.NUMERIC, 2), + (FIELD_TYPE.SELECT, 'yellow'), + # (FIELD_TYPE.MULTISELECT, ['yellow', ]), # TODO: wtf + (FIELD_TYPE.DATE, date(1999, 1, 1)), + (FIELD_TYPE.URL, 'https://google.com'), + # (FIELD_TYPE.MULTITEXT, 'text'), # TODO + (FIELD_TYPE.TEXTAREA, 'text'), + (FIELD_TYPE.RADIOBUTTON, 'yellow'), + (FIELD_TYPE.STREETADDRESS, 'Volkova, 9'), + # (FIELD_TYPE.SMART_ADDRESS, + # SmartAddress(address1='Volkova, 9', city='Kiev', country='Ukraine')), # TODO + (FIELD_TYPE.BIRTHDAY, date(1999, 1, 1)), + # (FIELD_TYPE.legal_entity, + # [LegalEntity(name='entity1', entity_type='type1', vat_id=1), ]), # TODO wtf + # (FIELD_TYPE.ITEMS, ), # TODO: not implemented )) def test_custom_fields(client, field_type, value): + enums = None + need_enums = [FIELD_TYPE.SELECT, FIELD_TYPE.MULTISELECT, + FIELD_TYPE.RADIOBUTTON, FIELD_TYPE.ITEMS] + if field_type in need_enums: + enums = ['red', 'yellow', 'green'] + field = CUSTOM_FIELD_MAP[field_type]( name=('__TEST_FIELD_%s' % uuid.uuid1()), - element_type=ELEMENT_TYPE.CONTACT + element_type=ELEMENT_TYPE.CONTACT, + enums=enums, ) class MyContact(Contact): @@ -29,6 +51,16 @@ class MyContact(Contact): m1.save() m2 = MyContact.get_one(id=m1.id) - assert m2.my_field == m1.my_field + if field_type == FIELD_TYPE.SMART_ADDRESS: + assert m2.my_field.address1 == m1.my_field.address1 + assert m2.my_field.city == m1.my_field.city + assert m2.my_field.country == m1.my_field.country + elif field_type == FIELD_TYPE.legal_entity: + assert m2.my_field.name == m1.my_field.name + assert m2.my_field.entity_type == m1.my_field.entity_type + assert m2.my_field.vat_id == m1.my_field.vat_id + else: + assert m2.my_field == m1.my_field assert m2.custom_fields[field.metadata['id']] == m1.my_field assert m2.custom_fields[field.metadata['name']] == m1.my_field + m1.delete()