Skip to content

Commit 370e899

Browse files
Merge pull request #48 from RandomProgramm3r/develop
test(user): Add comprehensive tests for promo like/unlike endpoint This commit introduces a suite of DRF (Django REST Framework) unit/integration tests for the `api/user/promo/{id}/like` endpoint. The tests cover the following key scenarios: - Initial state verification: - `like_count` is 0 and `is_liked_by_user` is false for a new promo. - Company view also reflects `like_count` as 0. - Liking a promo: - A user can successfully like a promo. - `like_count` increments correctly. - `is_liked_by_user` becomes true for the liking user. - Idempotency of liking: - Liking an already liked promo returns a successful response without altering the like count further. - Multiple users liking the same promo: - `like_count` reflects likes from different users. - `is_liked_by_user` status is accurate for each respective user. - Unliking a promo: - A user can successfully unlike a promo they previously liked. - `like_count` decrements correctly. - `is_liked_by_user` becomes false for the unliking user. - Idempotency of unliking: - Unliking a promo not currently liked by the user (or already unliked) returns a successful response without errors or incorrect state changes. - Verification of state from different perspectives (liking user, other users, company). These tests ensure the reliability and correct behavior of the promo liking feature, including its idempotency and accurate reflection of like statuses and counts.
2 parents 5cfcec5 + b08e387 commit 370e899

File tree

4 files changed

+461
-9
lines changed

4 files changed

+461
-9
lines changed

promo_code/user/tests/user/base.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,28 @@ def tearDown(self):
6969
business.models.Promo.objects.all().delete()
7070
business.models.PromoCode.objects.all().delete()
7171
user.models.User.objects.all().delete()
72+
user.models.PromoLike.objects.all().delete()
7273
tb_models.BlacklistedToken.objects.all().delete()
7374
tb_models.OutstandingToken.objects.all().delete()
7475
super().tearDown()
7576

7677
@classmethod
77-
def promo_detail_url(cls, promo_id):
78+
def get_business_promo_detail_url(cls, promo_id):
79+
return django.urls.reverse(
80+
'api-business:promo-detail',
81+
kwargs={'id': promo_id},
82+
)
83+
84+
@classmethod
85+
def get_user_promo_detail_url(cls, promo_id):
7886
return django.urls.reverse(
7987
'api-user:user-promo-detail',
8088
kwargs={'id': promo_id},
8189
)
8290

8391
@classmethod
84-
def get_promo_business_detail_url(cls, promo_id):
92+
def get_user_promo_like_url(cls, promo_id):
8593
return django.urls.reverse(
86-
'api-business:promo-detail',
94+
'api-user:user-promo-like',
8795
kwargs={'id': promo_id},
8896
)

promo_code/user/tests/user/operations/test_detail.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def setUp(self):
8282
self.client.credentials(HTTP_AUTHORIZATION='Bearer ' + self.user_token)
8383

8484
def test_get_promo_matching_target(self):
85-
url = self.promo_detail_url(self.promo_sg_id)
85+
url = self.get_user_promo_detail_url(self.promo_sg_id)
8686
response = self.client.get(url)
8787
self.assertEqual(
8888
response.status_code,
@@ -94,7 +94,7 @@ def test_get_promo_matching_target(self):
9494
)
9595

9696
def test_get_promo_non_matching_target(self):
97-
url = self.promo_detail_url(self.promo_kz_id)
97+
url = self.get_user_promo_detail_url(self.promo_kz_id)
9898
response = self.client.get(url)
9999
self.assertEqual(
100100
response.status_code,
@@ -118,7 +118,7 @@ def test_get_promo_non_matching_target(self):
118118
)
119119
def test_user_promo_detail(self, promo_attr, forbidden_field):
120120
promo_id = getattr(self, promo_attr)
121-
url = self.promo_detail_url(promo_id)
121+
url = self.get_user_promo_detail_url(promo_id)
122122
response = self.client.get(url, format='json')
123123
self.assertEqual(
124124
response.status_code,
@@ -132,7 +132,7 @@ def test_user_promo_detail(self, promo_attr, forbidden_field):
132132

133133
def test_get_promo_invalid_token(self):
134134
self.client.credentials(HTTP_AUTHORIZATION='Bearer invalid.jwt.token')
135-
url = self.promo_detail_url(self.promo_kz_id)
135+
url = self.get_user_promo_detail_url(self.promo_kz_id)
136136
response = self.client.get(url)
137137
self.assertEqual(
138138
response.status_code,
@@ -141,7 +141,7 @@ def test_get_promo_invalid_token(self):
141141

142142
def test_get_promo_not_found(self):
143143
random_uuid = uuid.UUID('550e8400-e29b-41d4-a716-446655440000')
144-
url = self.promo_detail_url(random_uuid)
144+
url = self.get_user_promo_detail_url(random_uuid)
145145
response = self.client.get(url)
146146
self.assertEqual(
147147
response.status_code,

promo_code/user/tests/user/operations/test_feed.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,7 @@ def test_user4_sg_80_get_all_promos_after_edit(self):
654654
self.client.credentials(
655655
HTTP_AUTHORIZATION='Bearer ' + self.company2_token,
656656
)
657-
url = self.get_promo_business_detail_url(self.promo11_id)
657+
url = self.get_business_promo_detail_url(self.promo11_id)
658658
patch_data = {'active_until': '2024-08-10'}
659659
response = self.client.patch(url, patch_data, format='json')
660660
self.assertEqual(

0 commit comments

Comments
 (0)