Coverage for website/tests/test_author_view_helpers_more.py: 100%

55 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2025-09-13 15:29 -0300

1from types import SimpleNamespace 

2 

3from django.contrib.auth import get_user_model 

4from django.test import TestCase 

5 

6from website.models.AuthorModel import Author 

7from website.models.AuthorSocialMediaModel import SocialMedia 

8from website.views.AuthorView import ( 

9 check_request_post, 

10 create_social_media, 

11 exclude_social_media, 

12 update_social_media, 

13) 

14 

15User = get_user_model() 

16 

17 

18class PostDict(dict): 

19 def getlist(self, k): 

20 return self.get(k, []) 

21 

22 

23class AuthorViewHelpersMoreTest(TestCase): 

24 def test_check_request_post_detects_new_social_addition(self): 

25 user = User.objects.create_user( 

26 username="au1", email="au1@test.com", password="p" 

27 ) 

28 Author.objects.create(user=user, author_name="Au1", author_url_slug="au1") 

29 # author has zero social entries 

30 

31 post = PostDict( 

32 { 

33 "username": user.username, 

34 "author_name": "Au1", 

35 "social_media": ["1", "2"], 

36 "social_media_profile": ["http://a", "http://b"], 

37 "exclude-social": [], 

38 } 

39 ) 

40 req = SimpleNamespace(POST=post, FILES={}, user=user) 

41 

42 res = check_request_post(req) 

43 self.assertIsNotNone(res) 

44 # new_social_addition should be True because POST has 2 profiles while author has 0 

45 self.assertTrue(res.get("new_social_addition")) 

46 

47 def test_update_social_media_updates_existing_entries(self): 

48 user = User.objects.create_user( 

49 username="au2", email="au2@test.com", password="p" 

50 ) 

51 author = Author.objects.create( 

52 user=user, author_name="Au2", author_url_slug="au2" 

53 ) 

54 sm = SocialMedia.objects.create( 

55 user_social_media=author, social_media=1, social_media_profile="old" 

56 ) 

57 author.social_media.add(sm) 

58 

59 post = PostDict({"social_media": ["2"], "social_media_profile": ["new"]}) 

60 req = SimpleNamespace(POST=post, FILES={}, user=user) 

61 

62 changed = update_social_media(req, list(author.social_media.all())) 

63 self.assertTrue(changed) 

64 author.refresh_from_db() 

65 sms = list(author.social_media.all()) 

66 self.assertEqual(str(sms[0].social_media), "2") 

67 self.assertEqual(sms[0].social_media_profile, "new") 

68 

69 def test_create_social_media_appends_new_entries(self): 

70 user = User.objects.create_user( 

71 username="au3", email="au3@test.com", password="p" 

72 ) 

73 author = Author.objects.create( 

74 user=user, author_name="Au3", author_url_slug="au3" 

75 ) 

76 sm = SocialMedia.objects.create( 

77 user_social_media=author, social_media=1, social_media_profile="p" 

78 ) 

79 author.social_media.add(sm) 

80 

81 # POST contains two entries; create_social_media should add the extra one 

82 post = PostDict( 

83 { 

84 "social_media": ["1", "2"], 

85 "social_media_profile": ["p", "http://x"], 

86 "username": user.username, 

87 } 

88 ) 

89 req = SimpleNamespace(POST=post, FILES={}, user=user) 

90 author_request_post = {"username": user.username} 

91 

92 create_social_media(req, author_request_post) 

93 author.refresh_from_db() 

94 self.assertEqual(author.social_media.count(), 2) 

95 

96 def test_exclude_social_media_removes_entries(self): 

97 user = User.objects.create_user( 

98 username="au4", email="au4@test.com", password="p" 

99 ) 

100 author = Author.objects.create( 

101 user=user, author_name="Au4", author_url_slug="au4" 

102 ) 

103 sm1 = SocialMedia.objects.create( 

104 user_social_media=author, social_media=1, social_media_profile="p1" 

105 ) 

106 sm2 = SocialMedia.objects.create( 

107 user_social_media=author, social_media=2, social_media_profile="p2" 

108 ) 

109 author.social_media.add(sm1) 

110 author.social_media.add(sm2) 

111 

112 post = PostDict( 

113 { 

114 "username": user.username, 

115 "author_name": "Au4", 

116 "social_media": ["1", "2"], 

117 "social_media_profile": ["p1", "p2"], 

118 "exclude-social": ["2"], 

119 } 

120 ) 

121 req = SimpleNamespace(POST=post, FILES={}, user=user) 

122 

123 # exclude_social_media uses check_request_post internally, but here we call directly 

124 exclude_social_media(req, author) 

125 author.refresh_from_db() 

126 # only one remaining 

127 self.assertEqual(author.social_media.count(), 1)