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

71 statements  

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

1from unittest.mock import MagicMock, patch 

2 

3from django.contrib.auth import get_user_model 

4from django.core.files.uploadedfile import SimpleUploadedFile 

5from django.http import HttpResponse 

6from django.test import RequestFactory, TestCase 

7 

8import website.views.AuthorView as av 

9from website.models.AuthorModel import Author 

10from website.models.AuthorSocialMediaModel import SocialMedia 

11 

12User = get_user_model() 

13 

14 

15class AuthorViewCleanTests(TestCase): 

16 def setUp(self): 

17 self.factory = RequestFactory() 

18 self.owner = User.objects.create_user( 

19 email="owner@example.com", password="pw", username="owner" 

20 ) 

21 self.other = User.objects.create_user( 

22 email="other@example.com", password="pw", username="other" 

23 ) 

24 self.author = Author.objects.create( 

25 user=self.owner, author_name="Owner", author_url_slug="owner" 

26 ) 

27 

28 def test_view_author_page_owner_and_non_owner(self): 

29 captured = {} 

30 

31 def fake_render(request, template_name=None, context=None, status=200): 

32 resp = HttpResponse(status=status) 

33 resp.context = context or {} 

34 captured["ctx"] = context or {} 

35 return resp 

36 

37 with patch.object(av, "render", side_effect=fake_render): 

38 req = self.factory.get("/") 

39 req.user = self.other 

40 resp = av.view_author_page(req, slug=self.author.author_url_slug) 

41 assert resp.status_code == 200 

42 assert captured["ctx"]["author_connected"] is False 

43 

44 req2 = self.factory.get("/") 

45 req2.user = self.owner 

46 resp2 = av.view_author_page(req2, slug=self.author.author_url_slug) 

47 assert resp2.status_code == 200 

48 assert captured["ctx"]["author_connected"] is True 

49 

50 def test_check_request_post_and_helpers(self): 

51 # create sample social entry 

52 SocialMedia.objects.create( 

53 user_social_media=self.author, social_media=1, social_media_profile="p1" 

54 ) 

55 

56 data = { 

57 "username": "owner", 

58 "author_name": "Owner New", 

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

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

61 "exclude-social": ["", ""], 

62 } 

63 img = SimpleUploadedFile("pic.jpg", b"filecontent", content_type="image/jpeg") 

64 req = self.factory.post("/", data, FILES={"image": img}) 

65 req.user = self.owner 

66 parsed = av.check_request_post(req) 

67 assert parsed["username"] == "owner" 

68 assert parsed["name"] == "Owner New" 

69 assert "exclude_social_media" in parsed 

70 

71 # Test update_social_media detects changes 

72 req2 = self.factory.post( 

73 "/", {"social_media": ["2"], "social_media_profile": ["p2"]} 

74 ) 

75 req2.user = self.owner 

76 updated = av.update_social_media(req2, list(self.author.social_media.all())) 

77 assert isinstance(updated, bool) 

78 

79 def test_edit_author_profile_post_redirects_on_success(self): 

80 data = {"username": "owner", "author_name": "Owner New"} 

81 req = self.factory.post("/", data) 

82 req.user = self.owner 

83 

84 fake_check = { 

85 "username": "owner", 

86 "name": "Owner New", 

87 "check_username_request": None, 

88 "image": None, 

89 "new_social_addition": False, 

90 "exclude_social_media": [], 

91 } 

92 

93 user_form_mock = MagicMock() 

94 user_form_mock.is_valid.return_value = True 

95 user_form_mock.save.return_value = req.user 

96 user_form_mock.cleaned_data = {"password": None} 

97 

98 author_form_mock = MagicMock() 

99 author_form_mock.is_valid.return_value = True 

100 author_form_mock.save.return_value = self.author 

101 

102 class FakeFormSet: 

103 def __init__(self, *a, **k): 

104 pass 

105 

106 def is_valid(self): 

107 return True 

108 

109 def save(self): 

110 return None 

111 

112 with ( 

113 patch.object(av, "check_request_post", return_value=fake_check), 

114 patch.object(av, "update_social_media", return_value=False), 

115 patch.object(av, "create_social_media") as mock_create, 

116 patch.object(av, "exclude_social_media") as mock_exclude, 

117 patch.object(av, "messages"), 

118 patch.object(av, "redirect", return_value=HttpResponse(status=302)), 

119 patch.object(av, "UserChangeForm", return_value=user_form_mock), 

120 patch.object(av, "EditAuthorForm", return_value=author_form_mock), 

121 patch.object(av, "inlineformset_factory", return_value=FakeFormSet), 

122 ): 

123 resp = av.edit_author_profile(req, slug=self.author.author_url_slug) 

124 assert resp.status_code in (301, 302) 

125 mock_create.assert_not_called() 

126 mock_exclude.assert_not_called()