Coverage for ivatar/ivataraccount/test_views_bluesky.py: 100%
118 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-24 23:06 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-24 23:06 +0000
1"""
2Test our views in ivatar.ivataraccount.views and ivatar.views
3"""
5import contextlib
7# pylint: disable=too-many-lines
8import os
9import django
10import pytest
11from django.test import TestCase
12from django.test import Client
14from django.urls import reverse
15from django.contrib.auth.models import User
17# from django.contrib.auth import authenticate
19os.environ["DJANGO_SETTINGS_MODULE"] = "ivatar.settings"
20django.setup()
22# pylint: disable=wrong-import-position
23from ivatar import settings
24from ivatar.ivataraccount.models import ConfirmedOpenId, ConfirmedEmail
25from ivatar.utils import random_string, Bluesky
27from libravatar import libravatar_url
30class Tester(TestCase): # pylint: disable=too-many-public-methods
31 """
32 Main test class
33 """
35 client = Client()
36 user = None
37 username = random_string()
38 password = random_string()
39 email = "{}@{}.{}".format(username, random_string(), random_string(2))
40 # Dunno why random tld doesn't work, but I'm too lazy now to investigate
41 openid = "http://{}.{}.{}/".format(username, random_string(), "org")
42 first_name = random_string()
43 last_name = random_string()
44 bsky_test_account = "libravatar.org"
46 def login(self):
47 """
48 Login as user
49 """
50 self.client.login(username=self.username, password=self.password)
52 def setUp(self):
53 """
54 Prepare for tests.
55 - Create user
56 """
57 self.user = User.objects.create_user(
58 username=self.username,
59 password=self.password,
60 first_name=self.first_name,
61 last_name=self.last_name,
62 )
63 settings.EMAIL_BACKEND = "django.core.mail.backends.dummy.EmailBackend"
65 # Clear any existing Bluesky session to ensure clean test state
66 Bluesky.clear_shared_session()
68 def tearDown(self):
69 """
70 Clean up after tests
71 """
72 # Clear Bluesky session to avoid affecting other tests
73 Bluesky.clear_shared_session()
75 def create_confirmed_openid(self):
76 """
77 Create a confirmed openid
78 """
79 return ConfirmedOpenId.objects.create(
80 user=self.user,
81 ip_address="127.0.0.1",
82 openid=self.openid,
83 )
85 def create_confirmed_email(self):
86 """
87 Create a confirmed email
88 """
89 return ConfirmedEmail.objects.create(
90 email=self.email,
91 user=self.user,
92 )
94 # The following tests need to be moved over to the model tests
95 # and real web UI tests added
96 @pytest.mark.bluesky
97 def test_bluesky_handle_for_mail_via_model_handle_does_not_exist(self):
98 """
99 Add Bluesky handle to a confirmed mail address
100 """
101 self.login()
102 confirmed = self.create_confirmed_email()
103 confirmed.set_bluesky_handle(self.bsky_test_account)
105 with contextlib.suppress(Exception):
106 confirmed.set_bluesky_handle(f"{self.bsky_test_account}1")
107 self.assertNotEqual(
108 confirmed.bluesky_handle,
109 f"{self.bsky_test_account}1",
110 "Setting Bluesky handle that doesn't exist works?",
111 )
113 @pytest.mark.bluesky
114 def test_bluesky_handle_for_mail_via_model_handle_exists(self):
115 """
116 Add Bluesky handle to a confirmed mail address
117 """
118 self.login()
119 confirmed = self.create_confirmed_email()
120 confirmed.set_bluesky_handle(self.bsky_test_account)
122 self.assertEqual(
123 confirmed.bluesky_handle,
124 self.bsky_test_account,
125 "Setting Bluesky handle doesn't work?",
126 )
128 @pytest.mark.bluesky
129 def test_bluesky_handle_for_openid_via_model_handle_does_not_exist(self):
130 """
131 Add Bluesky handle to a confirmed openid address
132 """
133 self.login()
134 confirmed = self.create_confirmed_openid()
135 confirmed.set_bluesky_handle(self.bsky_test_account)
137 with contextlib.suppress(Exception):
138 confirmed.set_bluesky_handle(f"{self.bsky_test_account}1")
139 self.assertNotEqual(
140 confirmed.bluesky_handle,
141 f"{self.bsky_test_account}1",
142 "Setting Bluesky handle that doesn't exist works?",
143 )
145 @pytest.mark.bluesky
146 def test_bluesky_handle_for_openid_via_model_handle_exists(self):
147 """
148 Add Bluesky handle to a confirmed openid address
149 """
150 self.login()
151 confirmed = self.create_confirmed_openid()
152 confirmed.set_bluesky_handle(self.bsky_test_account)
154 self.assertEqual(
155 confirmed.bluesky_handle,
156 self.bsky_test_account,
157 "Setting Bluesky handle doesn't work?",
158 )
160 @pytest.mark.bluesky
161 def test_bluesky_fetch_mail(self):
162 """
163 Check if we can successfully fetch a Bluesky avatar via email
164 """
165 self.login()
166 confirmed = self.create_confirmed_email()
167 confirmed.set_bluesky_handle(self.bsky_test_account)
168 lu = libravatar_url(confirmed.email, https=True)
169 lu = lu.replace("https://seccdn.libravatar.org/", reverse("home"))
171 response = self.client.get(lu)
172 # This is supposed to redirect to the Bluesky proxy
173 self.assertEqual(response.status_code, 302)
174 self.assertEqual(response["Location"], f"/blueskyproxy/{confirmed.digest}")
176 @pytest.mark.bluesky
177 def test_bluesky_fetch_openid(self):
178 """
179 Check if we can successfully fetch a Bluesky avatar via OpenID
180 """
181 self.login()
182 confirmed = self.create_confirmed_openid()
183 confirmed.set_bluesky_handle(self.bsky_test_account)
184 lu = libravatar_url(openid=confirmed.openid, https=True)
185 lu = lu.replace("https://seccdn.libravatar.org/", reverse("home"))
187 response = self.client.get(lu)
188 # This is supposed to redirect to the Bluesky proxy
189 self.assertEqual(response.status_code, 302)
190 self.assertEqual(response["Location"], f"/blueskyproxy/{confirmed.digest}")
192 @pytest.mark.bluesky
193 def test_assign_bluesky_handle_to_openid(self):
194 """
195 Assign a Bluesky handle to an OpenID
196 """
197 self.login()
198 confirmed = self.create_confirmed_openid()
199 self._assign_handle_to(
200 "assign_bluesky_handle_to_openid",
201 confirmed,
202 "Adding Bluesky handle to OpenID fails?",
203 )
205 @pytest.mark.bluesky
206 def test_assign_bluesky_handle_to_email(self):
207 """
208 Assign a Bluesky handle to an email
210 """
211 self.login()
212 confirmed = self.create_confirmed_email()
213 self._assign_handle_to(
214 "assign_bluesky_handle_to_email",
215 confirmed,
216 "Adding Bluesky handle to Email fails?",
217 )
219 def _assign_handle_to(self, endpoint, confirmed, message):
220 """
221 Helper method to assign a handle to reduce code duplication
222 Since the endpoints are similar, we can reuse the code
223 """
224 url = reverse(endpoint, args=[confirmed.id])
225 response = self.client.post(
226 url, {"bluesky_handle": self.bsky_test_account}, follow=True
227 )
228 self.assertEqual(response.status_code, 200, message)
229 confirmed.refresh_from_db(fields=["bluesky_handle"])
230 self.assertEqual(
231 confirmed.bluesky_handle,
232 self.bsky_test_account,
233 "Setting Bluesky handle doesn't work?",
234 )
236 @pytest.mark.bluesky
237 def test_assign_photo_to_mail_removes_bluesky_handle(self):
238 """
239 Assign a Photo to a mail, removes Bluesky handle
240 """
241 self.login()
242 confirmed = self.create_confirmed_email()
243 self._assign_bluesky_handle(confirmed, "assign_photo_email")
245 @pytest.mark.bluesky
246 def test_assign_photo_to_openid_removes_bluesky_handle(self):
247 """
248 Assign a Photo to a OpenID, removes Bluesky handle
249 """
250 self.login()
251 confirmed = self.create_confirmed_openid()
252 self._assign_bluesky_handle(confirmed, "assign_photo_openid")
254 def _assign_bluesky_handle(self, confirmed, endpoint):
255 """
256 Helper method to assign a Bluesky handle
257 Since the endpoints are similar, we can reuse the code
258 """
259 confirmed.bluesky_handle = self.bsky_test_account
260 confirmed.save()
261 url = reverse(endpoint, args=[confirmed.id])
262 response = self.client.post(url, {"photoNone": True}, follow=True)
263 self.assertEqual(response.status_code, 200, "Unassigning Photo doesn't work?")
264 confirmed.refresh_from_db(fields=["bluesky_handle"])
265 self.assertEqual(
266 confirmed.bluesky_handle, None, "Removing Bluesky handle doesn't work?"
267 )