From e1abf1fea0ff1c37ac2b9b68cbe256451043aada Mon Sep 17 00:00:00 2001 From: "jonathan.christopher" Date: Thu, 7 May 2020 22:21:53 +0700 Subject: [PATCH 1/2] [RED] Add test for phone and email validator --- apps/accounts/tests/factories/accounts.py | 2 +- .../tests/test_units/test_accounts.py | 44 ++++++++++++++++--- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/apps/accounts/tests/factories/accounts.py b/apps/accounts/tests/factories/accounts.py index b5db364..9997930 100644 --- a/apps/accounts/tests/factories/accounts.py +++ b/apps/accounts/tests/factories/accounts.py @@ -25,7 +25,7 @@ class AccountFactory(factory.DjangoModelFactory): user = factory.SubFactory(UserFactory) name = faker.name() email = faker.email() - phone_number = faker.phone_number() + phone_number = "+999999999999" area = faker.city() is_active = True is_verified = True diff --git a/apps/accounts/tests/test_units/test_accounts.py b/apps/accounts/tests/test_units/test_accounts.py index 87afaaa..d0784e1 100644 --- a/apps/accounts/tests/test_units/test_accounts.py +++ b/apps/accounts/tests/test_units/test_accounts.py @@ -88,7 +88,7 @@ class AccountViewTest(APITestCase): "username": _account_id, "password": "justpass", "email": _account_id, - "phone_number": self.faker.phone_number(), + "phone_number": "+999999999999", "area": self.faker.city(), "is_admin": True, } @@ -110,7 +110,7 @@ class AccountViewTest(APITestCase): "username": _account_id, "password": "justpass", "email": _account_id, - "phone_number": self.faker.phone_number(), + "phone_number": "+999999999999", "area": self.faker.city(), "is_admin": False, "is_verified": True, @@ -145,7 +145,7 @@ class AccountViewTest(APITestCase): "username": "user_1", "password": "justpass", "email": self.faker.email(), - "phone_number": self.faker.phone_number(), + "phone_number": "+999999999999", "area": self.faker.city(), "is_admin": False, "is_verified": True, @@ -163,21 +163,21 @@ class AccountViewTest(APITestCase): "email": _account_id, "username": _account_id, "password": "12345678", - "phone_number": self.faker.phone_number(), + "phone_number": "+999999999999", "area": self.faker.city(), "is_admin": False, } response = self.client.post(path=url, data=data, format="json",) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - def test_edit_account_success_by(self): + def test_edit_account_success(self): url = self.BASE_URL + str(self.officer.id) + "/" data = { "id": str(self.officer.id), "name": self.faker.name(), "email": self.faker.email(), - "phone_number": self.faker.phone_number(), + "phone_number": "+999999999999", "area": self.faker.city(), "is_admin": False, "is_verified": True, @@ -213,13 +213,43 @@ class AccountViewTest(APITestCase): data = { "id": str(self.officer.id), - "phone_number": self.faker.phone_number(), + "phone_number": "+999999999999", "area": self.faker.city(), } response = self.client.put(path=url, data=data, format="json",) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + def test_edit_account_fail_with_wrong_email_or_phone_format(self): + url = self.BASE_URL + str(self.officer.id) + "/" + + data = { + "id": str(self.officer.id), + "name": self.faker.name(), + "email": self.faker.email(), + "phone_number": "+999aaa999", + "area": self.faker.city(), + "is_admin": False, + "is_verified": True, + "is_active": True, + } + + response = self.client.put(path=url, data=data, format="json",) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + data = { + "id": str(self.officer.id), + "name": self.faker.name(), + "email": "email", + "phone_number": "+999999999999", + "area": self.faker.city(), + "is_admin": False, + "is_verified": True, + "is_active": True, + } + + response = self.client.put(path=url, data=data, format="json",) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + def test_delete_success(self): url = self.BASE_URL + str(self.officer.id) + "/" -- GitLab From bd6fa31886e7334c5d11e7bbaea658c11ea9ac56 Mon Sep 17 00:00:00 2001 From: "jonathan.christopher" Date: Thu, 7 May 2020 22:24:03 +0700 Subject: [PATCH 2/2] [GREEN] Add custom phone validator on Account model --- apps/accounts/models.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/accounts/models.py b/apps/accounts/models.py index 00e8f2d..aef5296 100644 --- a/apps/accounts/models.py +++ b/apps/accounts/models.py @@ -1,6 +1,7 @@ import uuid from django.contrib.auth.models import User from django.db import models +from django.core.validators import RegexValidator from apps.commons.managers import SoftDeleteManager from apps.commons.models import HistoryEnabledModel, HistoryModel @@ -32,7 +33,15 @@ class Account(HistoryEnabledModel): user = models.OneToOneField(User, on_delete=models.CASCADE) name = models.CharField(max_length=128) email = models.EmailField(max_length=128) - phone_number = models.CharField(max_length=64) + phone_number = models.CharField( + max_length=64, + validators=[ + RegexValidator( + regex=r'^\+?\d{9,15}$', + message=('Phone number has 9-15 digits, allowed to have + prefix'), + ), + ] + ) area = models.CharField(max_length=128) is_admin = models.BooleanField(default=False) is_verified = models.BooleanField(default=False) -- GitLab