Coverage for website/tests/test_author_profile_helpers.py: 98%

53 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.models.ReaderModel import Reader 

9from website.views import AuthorView 

10 

11User = get_user_model() 

12 

13 

14class AuthorProfileHelpersTest(TestCase): 

15 def test_check_author_form_and_user_form_username_conflict(self): 

16 # create two users to cause username conflict 

17 user1 = User.objects.create_user( 

18 username="u1", email="u1@test.com", password="p" 

19 ) 

20 user2 = User.objects.create_user( 

21 username="u2", email="u2@test.com", password="p" 

22 ) 

23 # create an Author record for user2 so check_request_post can query it 

24 Author.objects.create(user=user2, author_name="Other", author_url_slug="other") 

25 author = Author.objects.create(user=user1, author_name="A", author_url_slug="a") 

26 

27 # build a fake POST where username conflicts with user2 

28 class PostDict(dict): 

29 def getlist(self, k): 

30 return self.get(k, []) 

31 

32 post = PostDict( 

33 { 

34 "username": user2.username, 

35 "author_name": "NewA", 

36 "social_media": [], 

37 "social_media_profile": [], 

38 } 

39 ) 

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

41 

42 # check_request_post should report username conflict (non-empty queryset) 

43 ar = AuthorView.check_request_post(req) 

44 self.assertIsNotNone(ar) 

45 self.assertIn("check_username_request", ar) 

46 

47 # call check_author_form (may return True/False depending on form validity) 

48 result = AuthorView.check_author_form(req, author) 

49 self.assertIn(result, (True, False)) 

50 

51 def test_update_social_media_detects_changes(self): 

52 user = User.objects.create_user( 

53 username="u3", email="u3@test.com", password="p" 

54 ) 

55 author = Author.objects.create( 

56 user=user, author_name="Auth3", author_url_slug="auth3" 

57 ) 

58 sm = SocialMedia.objects.create( 

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

60 ) 

61 author.social_media.add(sm) 

62 

63 class PostDict(dict): 

64 def getlist(self, k): 

65 return self.get(k, []) 

66 

67 # change the social media values 

68 post = PostDict({"social_media": ["2"], "social_media_profile": ["http://y"]}) 

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

70 

71 # call update_social_media for coverage; return value not needed here 

72 AuthorView.update_social_media(req, list(author.social_media.all())) 

73 # ensure DB reflects the new values for the first social entry 

74 author.refresh_from_db() 

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

76 self.assertGreaterEqual(len(sms), 1) 

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

78 self.assertEqual(sms[0].social_media_profile, "http://y") 

79 

80 

81class ReaderEditHelpersTest(TestCase): 

82 def test_reader_check_user_form_username_conflict(self): 

83 user = User.objects.create_user( 

84 username="r1", email="r1@test.com", password="p" 

85 ) 

86 other = User.objects.create_user( 

87 username="r2", email="r2@test.com", password="p" 

88 ) 

89 reader = Reader.objects.create(user=user, reader_name="R") 

90 

91 class PostDict(dict): 

92 def getlist(self, k): 

93 return [] 

94 

95 # attempt to change username to other.username -> conflict 

96 post = PostDict({"username": other.username, "reader_name": "NewR"}) 

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

98 

99 from website.views.ReaderEditView import check_user_form as rcheck 

100 

101 ok = rcheck(req, reader) 

102 self.assertIsInstance(ok, bool)