Coverage for website/tests/test_reactions.py: 100%
75 statements
« prev ^ index » next coverage.py v7.5.0, created at 2025-09-13 15:29 -0300
« prev ^ index » next coverage.py v7.5.0, created at 2025-09-13 15:29 -0300
1from django.contrib.auth import get_user_model
2from django.test import TestCase
3from django.urls import reverse
5from website.models.AuthorModel import Author
6from website.models.PostModel import Post
8User = get_user_model()
11class ReactionToggleTests(TestCase):
12 def setUp(self):
13 # create user and author
14 self.user = User.objects.create_user(
15 username="tester", email="t@test.com", password="pass"
16 )
17 self.author_user = User.objects.create_user(
18 username="author", email="a@test.com", password="pass"
19 )
20 self.author = Author.objects.create(user=self.author_user, author_name="Author")
21 self.post = Post.objects.create(
22 author=self.author, title="T", url_slug="t-slug", text="body"
23 )
25 def test_like_then_switch_to_love_decrements_like_counter(self):
26 self.client.force_login(self.user)
28 # initial counts
29 self.assertEqual(self.post.likes.count(), 0)
30 self.assertEqual(self.post.loves.count(), 0)
32 # like the post
33 url_like = reverse("post_toggle_like", kwargs={"url_slug": self.post.url_slug})
34 r1 = self.client.post(url_like)
35 self.post.refresh_from_db()
36 self.assertEqual(r1.status_code, 200)
37 data1 = r1.json()
38 self.assertTrue(data1.get("liked"))
39 self.assertEqual(data1.get("likes_count"), 1)
40 self.assertEqual(self.post.likes.count(), 1)
41 self.assertEqual(self.post.loves.count(), 0)
43 # now switch to love
44 url_love = reverse("post_toggle_love", kwargs={"url_slug": self.post.url_slug})
45 r2 = self.client.post(url_love)
46 self.post.refresh_from_db()
47 self.assertEqual(r2.status_code, 200)
48 data2 = r2.json()
49 self.assertTrue(data2.get("loved"))
50 self.assertEqual(data2.get("loves_count"), 1)
51 self.assertEqual(data2.get("likes_count"), 0)
52 self.assertEqual(self.post.likes.count(), 0)
53 self.assertEqual(self.post.loves.count(), 1)
55 def test_undo_like_removes_relation_and_decrements(self):
56 self.client.force_login(self.user)
57 url_like = reverse("post_toggle_like", kwargs={"url_slug": self.post.url_slug})
59 # like
60 r1 = self.client.post(url_like)
61 self.post.refresh_from_db()
62 self.assertEqual(r1.status_code, 200)
63 self.assertEqual(self.post.likes.count(), 1)
65 # unlike (toggle)
66 r2 = self.client.post(url_like)
67 self.post.refresh_from_db()
68 self.assertEqual(r2.status_code, 200)
69 data2 = r2.json()
70 self.assertFalse(data2.get("liked"))
71 self.assertEqual(data2.get("likes_count"), 0)
72 self.assertEqual(self.post.likes.count(), 0)
74 def test_multiple_users_counts_and_switching(self):
75 user2 = User.objects.create_user(
76 username="tester2", email="t2@test.com", password="pass"
77 )
78 url_like = reverse("post_toggle_like", kwargs={"url_slug": self.post.url_slug})
79 url_love = reverse("post_toggle_love", kwargs={"url_slug": self.post.url_slug})
80 # user1 likes
81 self.client.force_login(self.user)
82 self.client.post(url_like)
83 self.post.refresh_from_db()
84 self.assertEqual(self.post.likes.count(), 1)
86 # user2 likes
87 self.client.force_login(user2)
88 self.client.post(url_like)
89 self.post.refresh_from_db()
90 self.assertEqual(self.post.likes.count(), 2)
92 # user1 switches to love
93 self.client.force_login(self.user)
94 r3 = self.client.post(url_love)
95 self.post.refresh_from_db()
96 self.assertEqual(r3.status_code, 200)
97 data3 = r3.json()
98 self.assertEqual(data3.get("likes_count"), 1)
99 self.assertEqual(data3.get("loves_count"), 1)
100 self.assertEqual(self.post.likes.count(), 1)
101 self.assertEqual(self.post.loves.count(), 1)
103 def test_guest_cannot_toggle_reaction(self):
104 self.client.logout()
105 url_like = reverse("post_toggle_like", kwargs={"url_slug": self.post.url_slug})
106 r = self.client.post(url_like)
107 self.assertEqual(r.status_code, 403)