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

1from django.contrib.auth import get_user_model 

2from django.test import TestCase 

3from django.urls import reverse 

4 

5from website.models.AuthorModel import Author 

6from website.models.PostModel import Post 

7 

8User = get_user_model() 

9 

10 

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 ) 

24 

25 def test_like_then_switch_to_love_decrements_like_counter(self): 

26 self.client.force_login(self.user) 

27 

28 # initial counts 

29 self.assertEqual(self.post.likes.count(), 0) 

30 self.assertEqual(self.post.loves.count(), 0) 

31 

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) 

42 

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) 

54 

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}) 

58 

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) 

64 

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) 

73 

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) 

85 

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) 

91 

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) 

102 

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)