diff --git a/promo_code/user/tests/auth/base.py b/promo_code/user/tests/auth/base.py index 9404410..66c49ed 100644 --- a/promo_code/user/tests/auth/base.py +++ b/promo_code/user/tests/auth/base.py @@ -14,7 +14,6 @@ def setUpTestData(cls): cls.refresh_url = django.urls.reverse('api-user:user-token-refresh') cls.signup_url = django.urls.reverse('api-user:sign-up') cls.signin_url = django.urls.reverse('api-user:sign-in') - cls.user_profile_url = django.urls.reverse('api-user:user-profile') def tearDown(self): user.models.User.objects.all().delete() diff --git a/promo_code/user/tests/user/base.py b/promo_code/user/tests/user/base.py new file mode 100644 index 0000000..f632274 --- /dev/null +++ b/promo_code/user/tests/user/base.py @@ -0,0 +1,56 @@ +import django.urls +import rest_framework.test +import rest_framework_simplejwt.token_blacklist.models as tb_models + +import business.models +import user.models + + +class BaseUserTestCase(rest_framework.test.APITestCase): + @classmethod + def setUpTestData(cls): + super().setUpTestData() + cls.client = rest_framework.test.APIClient() + cls.signup_url = django.urls.reverse('api-user:sign-up') + cls.signin_url = django.urls.reverse('api-user:sign-in') + cls.user_profile_url = django.urls.reverse('api-user:user-profile') + cls.promo_list_create_url = django.urls.reverse( + 'api-business:promo-list-create', + ) + + company1_data = { + 'name': 'Digital Marketing Solutions Inc.', + 'email': 'company1@example.com', + 'password': 'SecurePass123!', + } + business.models.Company.objects.create_company(**company1_data) + cls.company1 = business.models.Company.objects.get( + email=company1_data['email'], + ) + response1 = cls.client.post( + django.urls.reverse( + 'api-business:company-sign-in', + ), + { + 'email': company1_data['email'], + 'password': company1_data['password'], + }, + format='json', + ) + cls.company1_token = response1.data['access'] + + def tearDown(self): + business.models.Company.objects.all().delete() + business.models.Promo.objects.all().delete() + business.models.PromoCode.objects.all().delete() + user.models.User.objects.all().delete() + tb_models.BlacklistedToken.objects.all().delete() + tb_models.OutstandingToken.objects.all().delete() + super().tearDown() + + @classmethod + def promo_detail_url(cls, promo_id): + return django.urls.reverse( + 'api-user:user-promo-detail', + kwargs={'id': promo_id}, + ) diff --git a/promo_code/user/tests/user/operations/test_detail.py b/promo_code/user/tests/user/operations/test_detail.py new file mode 100644 index 0000000..d84a1c2 --- /dev/null +++ b/promo_code/user/tests/user/operations/test_detail.py @@ -0,0 +1,144 @@ +import uuid + +import parameterized +import rest_framework.status + +import user.tests.user.base + + +class TestUserPromoDetail(user.tests.user.base.BaseUserTestCase): + def setUp(self): + super().setUp() + signup_payload = { + 'name': 'Leslie', + 'surname': 'Lamport', + 'email': 'leslie@lamport.com', + 'password': 'Everyth1ngIsDistributed!', + 'other': {'age': 80, 'country': 'sg'}, + } + response = self.client.post( + self.signup_url, + signup_payload, + format='json', + ) + self.user_token = response.data.get('access') + + self.client.credentials( + HTTP_AUTHORIZATION='Bearer ' + self.company1_token, + ) + + promo_kz = { + 'description': 'Live COMMON voucher for Kazakhstani users', + 'target': {'country': 'kz'}, + 'max_count': 10, + 'active_from': '2025-01-10', + 'mode': 'COMMON', + 'promo_common': 'sale-10', + } + resp1 = self.client.post( + self.promo_list_create_url, + promo_kz, + format='json', + ) + self.promo_kz_id = resp1.data.get('id') + + promo_sg = { + 'description': 'Live COMMON voucher for Singapore residents', + 'target': {'country': 'sg'}, + 'max_count': 1000, + 'active_from': '2023-01-10', + 'mode': 'COMMON', + 'promo_common': 'sale-10', + } + resp2 = self.client.post( + self.promo_list_create_url, + promo_sg, + format='json', + ) + self.promo_sg_id = resp2.data.get('id') + + promo_us = { + 'description': 'Gift sleeping mask with car loan application', + 'target': {'age_from': 28, 'age_until': 50, 'country': 'us'}, + 'max_count': 1, + 'active_from': '2025-01-01', + 'active_until': '2028-12-30', + 'mode': 'UNIQUE', + 'promo_unique': ['uniq1', 'uniq2', 'uniq3'], + } + + resp3 = self.client.post( + self.promo_list_create_url, + promo_us, + format='json', + ) + self.promo_us_id = resp3.data.get('id') + + self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.user_token) + + def test_get_promo_matching_target(self): + url = self.promo_detail_url(self.promo_sg_id) + response = self.client.get(url) + self.assertEqual( + response.status_code, + rest_framework.status.HTTP_200_OK, + ) + self.assertEqual( + str(response.data.get('promo_id')), + str(self.promo_sg_id), + ) + + def test_get_promo_non_matching_target(self): + url = self.promo_detail_url(self.promo_kz_id) + response = self.client.get(url) + self.assertEqual( + response.status_code, + rest_framework.status.HTTP_200_OK, + ) + self.assertEqual( + str(response.data.get('promo_id')), + str(self.promo_kz_id), + ) + self.assertEqual( + response.data.get('description'), + 'Live COMMON voucher for Kazakhstani users', + ) + + @parameterized.parameterized.expand( + [ + ('promo_sg_id', 'promo_common'), + ('promo_kz_id', 'promo_common'), + ('promo_us_id', 'promo_unique'), + ], + ) + def test_user_promo_detail(self, promo_attr, forbidden_field): + promo_id = getattr(self, promo_attr) + url = self.promo_detail_url(promo_id) + response = self.client.get(url, format='json') + self.assertEqual( + response.status_code, + rest_framework.status.HTTP_200_OK, + ) + + self.assertNotContains( + response, + forbidden_field, + ) + + def test_get_promo_invalid_token(self): + self.client.credentials(HTTP_AUTHORIZATION='Bearer invalid.jwt.token') + url = self.promo_detail_url(self.promo_kz_id) + response = self.client.get(url) + self.assertEqual( + response.status_code, + rest_framework.status.HTTP_401_UNAUTHORIZED, + ) + + def test_get_promo_not_found(self): + random_uuid = uuid.UUID('550e8400-e29b-41d4-a716-446655440000') + url = self.promo_detail_url(random_uuid) + response = self.client.get(url) + self.assertEqual( + response.status_code, + rest_framework.status.HTTP_404_NOT_FOUND, + ) diff --git a/promo_code/user/tests/user/operations/test_profile.py b/promo_code/user/tests/user/operations/test_profile.py index 98bde2d..b0cb470 100644 --- a/promo_code/user/tests/user/operations/test_profile.py +++ b/promo_code/user/tests/user/operations/test_profile.py @@ -1,9 +1,9 @@ import rest_framework.status -import user.tests.auth.base +import user.tests.user.base -class TestUserProfile(user.tests.auth.base.BaseUserAuthTestCase): +class TestUserProfile(user.tests.user.base.BaseUserTestCase): def setUp(self): super().setUp() signup_data = { diff --git a/promo_code/user/tests/user/validations/test_profile_validation.py b/promo_code/user/tests/user/validations/test_profile_validation.py index 9bbd943..980a36c 100644 --- a/promo_code/user/tests/user/validations/test_profile_validation.py +++ b/promo_code/user/tests/user/validations/test_profile_validation.py @@ -1,10 +1,10 @@ import parameterized import rest_framework.status -import user.tests.auth.base +import user.tests.user.base -class ProfileAPITestCase(user.tests.auth.base.BaseUserAuthTestCase): +class ProfileAPITestCase(user.tests.user.base.BaseUserTestCase): def setUp(self): super().setUp() signup_data = {