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

1""" 

2Test our views in ivatar.ivataraccount.views and ivatar.views 

3""" 

4 

5import contextlib 

6 

7# pylint: disable=too-many-lines 

8import os 

9import django 

10import pytest 

11from django.test import TestCase 

12from django.test import Client 

13 

14from django.urls import reverse 

15from django.contrib.auth.models import User 

16 

17# from django.contrib.auth import authenticate 

18 

19os.environ["DJANGO_SETTINGS_MODULE"] = "ivatar.settings" 

20django.setup() 

21 

22# pylint: disable=wrong-import-position 

23from ivatar import settings 

24from ivatar.ivataraccount.models import ConfirmedOpenId, ConfirmedEmail 

25from ivatar.utils import random_string, Bluesky 

26 

27from libravatar import libravatar_url 

28 

29 

30class Tester(TestCase): # pylint: disable=too-many-public-methods 

31 """ 

32 Main test class 

33 """ 

34 

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" 

45 

46 def login(self): 

47 """ 

48 Login as user 

49 """ 

50 self.client.login(username=self.username, password=self.password) 

51 

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" 

64 

65 # Clear any existing Bluesky session to ensure clean test state 

66 Bluesky.clear_shared_session() 

67 

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() 

74 

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 ) 

84 

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 ) 

93 

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) 

104 

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 ) 

112 

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) 

121 

122 self.assertEqual( 

123 confirmed.bluesky_handle, 

124 self.bsky_test_account, 

125 "Setting Bluesky handle doesn't work?", 

126 ) 

127 

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) 

136 

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 ) 

144 

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) 

153 

154 self.assertEqual( 

155 confirmed.bluesky_handle, 

156 self.bsky_test_account, 

157 "Setting Bluesky handle doesn't work?", 

158 ) 

159 

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")) 

170 

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}") 

175 

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")) 

186 

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}") 

191 

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 ) 

204 

205 @pytest.mark.bluesky 

206 def test_assign_bluesky_handle_to_email(self): 

207 """ 

208 Assign a Bluesky handle to an email 

209 

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 ) 

218 

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 ) 

235 

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") 

244 

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") 

253 

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 )