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
« prev ^ index » next coverage.py v7.5.0, created at 2025-09-13 15:29 -0300
1from unittest.mock import MagicMock, patch
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
8import website.views.AuthorView as av
9from website.models.AuthorModel import Author
10from website.models.AuthorSocialMediaModel import SocialMedia
12User = get_user_model()
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 )
28 def test_view_author_page_owner_and_non_owner(self):
29 captured = {}
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
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
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
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 )
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
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)
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
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 }
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}
98 author_form_mock = MagicMock()
99 author_form_mock.is_valid.return_value = True
100 author_form_mock.save.return_value = self.author
102 class FakeFormSet:
103 def __init__(self, *a, **k):
104 pass
106 def is_valid(self):
107 return True
109 def save(self):
110 return None
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()