diff --git a/.flake8 b/.flake8 index e17089b..54a527e 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ [flake8] -ignore = E501, W503, E402, C901 +ignore = E501, W503, E402, C901, E231 max-line-length = 79 max-complexity = 18 select = B,C,E,F,W,T4,B9 diff --git a/ivatar/context_processors.py b/ivatar/context_processors.py index 9742af1..4add854 100644 --- a/ivatar/context_processors.py +++ b/ivatar/context_processors.py @@ -3,7 +3,7 @@ Default: useful variables for the base page templates. """ -from ipware import get_client_ip +from ipware import get_client_ip # type: ignore from ivatar.settings import IVATAR_VERSION, SITE_NAME, MAX_PHOTO_SIZE from ivatar.settings import BASE_URL, SECURE_BASE_URL from ivatar.settings import MAX_NUM_UNCONFIRMED_EMAILS @@ -28,6 +28,7 @@ def basepage(request): context["BASE_URL"] = BASE_URL context["SECURE_BASE_URL"] = SECURE_BASE_URL context["max_emails"] = False + if request.user: if not request.user.is_anonymous: unconfirmed = request.user.unconfirmedemail_set.count() diff --git a/ivatar/ivataraccount/gravatar.py b/ivatar/ivataraccount/gravatar.py index 8ee51a0..23c3703 100644 --- a/ivatar/ivataraccount/gravatar.py +++ b/ivatar/ivataraccount/gravatar.py @@ -22,29 +22,23 @@ def get_photo(email): + "?s=%i&d=404" % AVATAR_MAX_SIZE ) image_url = ( - "https://secure.gravatar.com/avatar/" + hash_object.hexdigest() + "?s=512&d=404" + f"https://secure.gravatar.com/avatar/{hash_object.hexdigest()}?s=512&d=404" ) # Will redirect to the public profile URL if it exists - service_url = "http://www.gravatar.com/" + hash_object.hexdigest() + service_url = f"http://www.gravatar.com/{hash_object.hexdigest()}" try: urlopen(image_url) except HTTPError as exc: - if exc.code != 404 and exc.code != 503: - print( # pragma: no cover - "Gravatar fetch failed with an unexpected %s HTTP error" % exc.code - ) + if exc.code not in [404, 503]: + print(f"Gravatar fetch failed with an unexpected {exc.code} HTTP error") return False except URLError as exc: # pragma: no cover - print( - "Gravatar fetch failed with URL error: %s" % exc.reason - ) # pragma: no cover + print(f"Gravatar fetch failed with URL error: {exc.reason}") return False # pragma: no cover except SSLError as exc: # pragma: no cover - print( - "Gravatar fetch failed with SSL error: %s" % exc.reason - ) # pragma: no cover + print(f"Gravatar fetch failed with SSL error: {exc.reason}") return False # pragma: no cover return { diff --git a/ivatar/ivataraccount/models.py b/ivatar/ivataraccount/models.py index ec66459..f47016e 100644 --- a/ivatar/ivataraccount/models.py +++ b/ivatar/ivataraccount/models.py @@ -142,8 +142,7 @@ class Photo(BaseAccountModel): image_url = False if service_name == "Gravatar": - gravatar = get_gravatar_photo(email_address) - if gravatar: + if gravatar := get_gravatar_photo(email_address): image_url = gravatar["image_url"] if service_name == "Libravatar": @@ -153,15 +152,11 @@ class Photo(BaseAccountModel): return False # pragma: no cover try: image = urlopen(image_url) - # No idea how to test this - # pragma: no cover except HTTPError as exc: - print("%s import failed with an HTTP error: %s" % (service_name, exc.code)) + print(f"{service_name} import failed with an HTTP error: {exc.code}") return False - # No idea how to test this - # pragma: no cover except URLError as exc: - print("%s import failed: %s" % (service_name, exc.reason)) + print(f"{service_name} import failed: {exc.reason}") return False data = image.read() @@ -173,7 +168,7 @@ class Photo(BaseAccountModel): self.format = file_format(img.format) if not self.format: - print("Unable to determine format: %s" % img) # pragma: no cover + print(f"Unable to determine format: {img}") return False # pragma: no cover self.data = data super().save() @@ -188,10 +183,9 @@ class Photo(BaseAccountModel): # Use PIL to read the file format try: img = Image.open(BytesIO(self.data)) - # Testing? Ideas anyone? except Exception as exc: # pylint: disable=broad-except # For debugging only - print("Exception caught in Photo.save(): %s" % exc) + print(f"Exception caught in Photo.save(): {exc}") return False self.format = file_format(img.format) if not self.format: @@ -301,8 +295,7 @@ class ConfirmedEmailManager(models.Manager): external_photos = [] if is_logged_in: - gravatar = get_gravatar_photo(confirmed.email) - if gravatar: + if gravatar := get_gravatar_photo(confirmed.email): external_photos.append(gravatar) return (confirmed.pk, external_photos) @@ -354,7 +347,6 @@ class ConfirmedEmail(BaseAccountModel): avatar = bs.get_profile(handle) if not avatar: raise Exception("Invalid Bluesky handle") - return self.bluesky_handle = handle self.save() @@ -430,7 +422,7 @@ class UnconfirmedEmail(BaseAccountModel): try: send_mail(email_subject, email_body, DEFAULT_FROM_EMAIL, [self.email]) except Exception as e: - self.last_status = "%s" % e + self.last_status = f"{e}" self.save() return True @@ -508,7 +500,6 @@ class ConfirmedOpenId(BaseAccountModel): avatar = bs.get_profile(handle) if not avatar: raise Exception("Invalid Bluesky handle") - return self.bluesky_handle = handle self.save() @@ -518,7 +509,7 @@ class ConfirmedOpenId(BaseAccountModel): url = urlsplit(self.openid) if url.username: # pragma: no cover password = url.password or "" - netloc = url.username + ":" + password + "@" + url.hostname + netloc = f"{url.username}:{password}@{url.hostname}" else: netloc = url.hostname lowercase_url = urlunsplit( @@ -638,9 +629,7 @@ class DjangoOpenIDStore(OpenIDStore): self.removeAssociation(server_url, assoc.handle) else: associations.append((association.issued, association)) - if not associations: - return None - return associations[-1][1] + return associations[-1][1] if associations else None @staticmethod def removeAssociation(server_url, handle): # pragma: no cover @@ -693,6 +682,6 @@ class DjangoOpenIDStore(OpenIDStore): """ Helper method to cleanup associations """ - OpenIDAssociation.objects.extra( # pylint: disable=no-member - where=["issued + lifetimeint < (%s)" % time.time()] + OpenIDAssociation.objects.extra( + where=[f"issued + lifetimeint < ({time.time()})"] ).delete() diff --git a/ivatar/ivataraccount/test_views.py b/ivatar/ivataraccount/test_views.py index 074a7b9..3dcd407 100644 --- a/ivatar/ivataraccount/test_views.py +++ b/ivatar/ivataraccount/test_views.py @@ -2,6 +2,9 @@ """ Test our views in ivatar.ivataraccount.views and ivatar.views """ + +import contextlib + # pylint: disable=too-many-lines from urllib.parse import urlsplit from io import BytesIO @@ -240,9 +243,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Confirm w/o verification key does not produce error message?", ) - def test_confirm_email_w_inexisting_auth_key(self): # pylint: disable=invalid-name + def test_confirm_email_w_non_existing_auth_key( + self, + ): # pylint: disable=invalid-name """ - Test confirmation with inexisting auth key + Test confirmation with non existing auth key """ self.login() # Avoid sending out mails @@ -264,7 +269,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods self.assertEqual( str(list(response.context[0]["messages"])[-1]), "Verification key does not exist", - "Confirm w/o inexisting key does not produce error message?", + "Confirm w/o non existing key does not produce error message?", ) def test_remove_confirmed_email(self): @@ -352,7 +357,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods response = self.client.post( reverse("add_email"), { - "email": "oliver@linux-kernel.at", # Whohu, static :-[ + "email": "oliver@linux-kernel.at", # Wow, static :-[ }, ) # Create test address unconfirmed = self.user.unconfirmedemail_set.first() @@ -418,7 +423,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Photo deletion did not work?", ) - def test_delete_inexisting_photo(self): + def test_delete_non_existing_photo(self): """ test deleting the photo """ @@ -602,22 +607,21 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods }, follow=True, ) - if test_only_one: - self.assertEqual( - self.user.photo_set.count(), 1, "there must be exactly one photo now!" - ) - self.assertEqual( - str(list(response.context[0]["messages"])[-1]), - "Successfully uploaded", - "A valid image should return a success message!", - ) - self.assertEqual( - self.user.photo_set.first().format, - "png", - "Format must be png, since we uploaded a png!", - ) - else: + if not test_only_one: return response + self.assertEqual( + self.user.photo_set.count(), 1, "there must be exactly one photo now!" + ) + self.assertEqual( + str(list(response.context[0]["messages"])[-1]), + "Successfully uploaded", + "A valid image should return a success message!", + ) + self.assertEqual( + self.user.photo_set.first().format, + "png", + "Format must be png, since we uploaded a png!", + ) def test_upload_too_many_images(self): """ @@ -741,7 +745,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods email=self.user.confirmedemail_set.first().email, ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 200, "unable to fetch avatar?") @@ -782,7 +786,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods email=self.user.confirmedemail_set.first().email, ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 200, "unable to fetch avatar?") @@ -823,7 +827,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods email=self.user.confirmedemail_set.first().email, ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 200, "unable to fetch avatar?") @@ -969,7 +973,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Assign non existing photo, does not return error message?", ) - def test_assign_photo_to_inexisting_mail(self): # pylint: disable=invalid-name + def test_assign_photo_to_non_existing_mail(self): # pylint: disable=invalid-name """ Test if assigning photo to mail address that doesn't exist returns the correct error message @@ -990,9 +994,9 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Assign non existing photo, does not return error message?", ) - def test_import_photo_with_inexisting_email(self): # pylint: disable=invalid-name + def test_import_photo_with_non_existing_email(self): # pylint: disable=invalid-name """ - Test if import with inexisting mail address returns + Test if import with non existing mail address returns the correct error message """ self.login() @@ -1002,7 +1006,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods self.assertEqual( str(list(response.context[0]["messages"])[0]), "Address does not exist", - "Import photo with inexisting mail id,\ + "Import photo with non existing mail id,\ does not return error message?", ) @@ -1022,10 +1026,24 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods should return an error message!", ) + def _manual_confirm(self): + """ + Helper method to confirm manually, because testing is really hard + """ + # Manual confirm, since testing is _really_ hard! + unconfirmed = self.user.unconfirmedopenid_set.first() + confirmed = ConfirmedOpenId() + confirmed.user = unconfirmed.user + confirmed.ip_address = "127.0.0.1" + confirmed.openid = unconfirmed.openid + confirmed.save() + unconfirmed.delete() + def test_add_openid(self, confirm=True): """ Test if adding an OpenID works """ + self.login() # Get page response = self.client.get(reverse("add_openid")) @@ -1042,14 +1060,9 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods self.assertEqual(response.status_code, 302, "OpenID must redirect") if confirm: - # Manual confirm, since testing is _really_ hard! - unconfirmed = self.user.unconfirmedopenid_set.first() - confirmed = ConfirmedOpenId() - confirmed.user = unconfirmed.user - confirmed.ip_address = "127.0.0.1" - confirmed.openid = unconfirmed.openid - confirmed.save() - unconfirmed.delete() + self._manual_confirm() + + # TODO Rename this here and in `test_add_openid` def test_add_openid_twice(self): """ @@ -1215,7 +1228,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Assign non existing photo, does not return error message?", ) - def test_assign_photo_to_openid_inexisting_openid( + def test_assign_photo_to_openid_non_existing_openid( self, ): # pylint: disable=invalid-name """ @@ -1292,7 +1305,9 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Removing unconfirmed mail does not work?", ) - def test_remove_unconfirmed_inexisting_openid(self): # pylint: disable=invalid-name + def test_remove_unconfirmed_non_existing_openid( + self, + ): # pylint: disable=invalid-name """ Remove unconfirmed openid that doesn't exist """ @@ -1305,7 +1320,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods self.assertEqual( str(list(response.context[0]["messages"])[0]), "ID does not exist", - "Removing an inexisting openid should return an error message", + "Removing an non existing openid should return an error message", ) def test_openid_redirect_view(self): @@ -1353,7 +1368,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods size=size[0], ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 200, "unable to fetch avatar?") photodata = Image.open(BytesIO(response.content)) @@ -1370,15 +1385,15 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods size=80, ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=True) self.assertEqual(response.status_code, 200, "unable to fetch avatar?") photodata = Image.open(BytesIO(response.content)) self.assertEqual(photodata.size, (80, 80), "Why is this not the correct size?") - def test_avatar_url_inexisting_mail_digest(self): # pylint: disable=invalid-name + def test_avatar_url_non_existing_mail_digest(self): # pylint: disable=invalid-name """ - Test fetching avatar via inexisting mail digest + Test fetching avatar via non existing mail digest """ self.test_upload_image() self.test_confirm_email() @@ -1394,11 +1409,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods digest = hashlib.md5(addr.strip().lower().encode("utf-8")).hexdigest() self.user.confirmedemail_set.first().delete() - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=True) self.assertEqual( response.redirect_chain[0][0], - "/gravatarproxy/%s?s=80" % digest, + f"/gravatarproxy/{digest}?s=80", "Doesn't redirect to Gravatar?", ) self.assertEqual( @@ -1406,7 +1421,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods ) self.assertEqual( response.redirect_chain[1][0], - "/avatar/%s?s=80&forcedefault=y" % digest, + f"/avatar/{digest}?s=80&forcedefault=y", "Doesn't redirect with default forced on?", ) self.assertEqual( @@ -1424,11 +1439,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods # ) # Eventually one should check if the data is the same - def test_avatar_url_inexisting_mail_digest_gravatarproxy_disabled( + def test_avatar_url_non_existing_mail_digest_gravatarproxy_disabled( self, ): # pylint: disable=invalid-name """ - Test fetching avatar via inexisting mail digest + Test fetching avatar via non existing mail digest """ self.test_upload_image() self.test_confirm_email() @@ -1441,7 +1456,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods # Simply delete it, then it digest is 'correct', but # the hash is no longer there self.user.confirmedemail_set.first().delete() - url = "%s?%s&gravatarproxy=n" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}&gravatarproxy=n" response = self.client.get(url, follow=True) self.assertEqual( response.redirect_chain[0][0], @@ -1456,11 +1471,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods # ) # Eventually one should check if the data is the same - def test_avatar_url_inexisting_mail_digest_w_default_mm( + def test_avatar_url_non_existing_mail_digest_w_default_mm( self, ): # pylint: disable=invalid-name """ - Test fetching avatar via inexisting mail digest and default 'mm' + Test fetching avatar via non existing mail digest and default 'mm' """ urlobj = urlsplit( libravatar_url( @@ -1469,14 +1484,14 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods default="mm", ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" self.client.get(url, follow=False) - def test_avatar_url_inexisting_mail_digest_w_default_mm_gravatarproxy_disabled( + def test_avatar_url_non_existing_mail_digest_w_default_mm_gravatarproxy_disabled( self, ): # pylint: disable=invalid-name """ - Test fetching avatar via inexisting mail digest and default 'mm' + Test fetching avatar via non existing mail digest and default 'mm' """ urlobj = urlsplit( libravatar_url( @@ -1485,7 +1500,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods default="mm", ) ) - url = "%s?%s&gravatarproxy=n" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}&gravatarproxy=n" response = self.client.get(url, follow=True) self.assertEqual( response.redirect_chain[0][0], @@ -1500,11 +1515,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods # ) # Eventually one should check if the data is the same - def test_avatar_url_inexisting_mail_digest_wo_default( + def test_avatar_url_non_existing_mail_digest_wo_default( self, ): # pylint: disable=invalid-name """ - Test fetching avatar via inexisting mail digest and default 'mm' + Test fetching avatar via non existing mail digest and default 'mm' """ urlobj = urlsplit( libravatar_url( @@ -1513,11 +1528,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods ) ) digest = hashlib.md5("asdf@company.local".lower().encode("utf-8")).hexdigest() - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=True) self.assertEqual( response.redirect_chain[0][0], - "/gravatarproxy/%s?s=80" % digest, + f"/gravatarproxy/{digest}?s=80", "Doesn't redirect to Gravatar?", ) self.assertEqual( @@ -1525,7 +1540,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods ) self.assertEqual( response.redirect_chain[1][0], - "/avatar/%s?s=80&forcedefault=y" % digest, + f"/avatar/{digest}?s=80&forcedefault=y", "Doesn't redirect with default forced on?", ) self.assertEqual( @@ -1544,11 +1559,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods # ) # Eventually one should check if the data is the same - def test_avatar_url_inexisting_mail_digest_wo_default_gravatarproxy_disabled( + def test_avatar_url_non_existing_mail_digest_wo_default_gravatarproxy_disabled( self, ): # pylint: disable=invalid-name """ - Test fetching avatar via inexisting mail digest and default 'mm' + Test fetching avatar via non existing mail digest and default 'mm' """ urlobj = urlsplit( libravatar_url( @@ -1556,7 +1571,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods size=80, ) ) - url = "%s?%s&gravatarproxy=n" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}&gravatarproxy=n" response = self.client.get(url, follow=True) self.assertEqual( response.redirect_chain[0][0], @@ -1582,7 +1597,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods default="/static/img/nobody.png", ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" url += "&gravatarproxy=n" response = self.client.get(url, follow=False) self.assertEqual(response.status_code, 302, "Doesn't redirect with 302?") @@ -1605,7 +1620,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods default="/static/img/nobody.png", ) ) - url = "%s?%s&gravatarproxy=n" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}&gravatarproxy=n" response = self.client.get(url, follow=True) self.assertEqual( response.redirect_chain[0][0], @@ -1627,11 +1642,11 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods default=default, ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=False) self.assertRedirects( response=response, - expected_url="/gravatarproxy/fb7a6d7f11365642d44ba66dc57df56f?s=%s" % size, + expected_url=f"/gravatarproxy/fb7a6d7f11365642d44ba66dc57df56f?s={size}", fetch_redirect_response=False, msg_prefix="Why does this not redirect to the default img?", ) @@ -1648,7 +1663,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods default=default, ) ) - url = "%s?%s" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}" response = self.client.get(url, follow=False) self.assertRedirects( response=response, @@ -1672,7 +1687,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods default=default, ) ) - url = "%s?%s&gravatarproxy=n" % (urlobj.path, urlobj.query) + url = f"{urlobj.path}?{urlobj.query}&gravatarproxy=n" response = self.client.get(url, follow=False) self.assertRedirects( response=response, @@ -1748,14 +1763,14 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods reverse("password_change"), { "old_password": self.password, - "new_password1": self.password + ".", + "new_password1": f"{self.password}.", "new_password2": self.password, }, follow=True, ) self.assertContains( response, - "The two password fields didn", + "The two password fields did", 1, 200, "Old password was entered incorrectly, site should raise an error", @@ -1771,14 +1786,14 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods { "old_password": self.password, "new_password1": self.password, - "new_password2": self.password + ".", + "new_password2": f"{self.password}.", }, follow=True, ) self.assertContains( response, - "The two password fields didn", + "The two password fields did", 1, 200, "Old password as entered incorrectly, site should raise an error", @@ -1829,7 +1844,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods ) self.assertContains( response, - self.first_name + " " + self.last_name, + f"{self.first_name} {self.last_name}", 1, 200, "First and last name not correctly listed in profile page", @@ -2047,7 +2062,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Upload didn't work?", ) - def test_prefs_page(self): + def test_preferences_page(self): """ Test if preferences page works """ @@ -2080,7 +2095,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods # Create a second user that will conflict user2 = User.objects.create_user( - username=self.username + "1", + username=f"{self.username}1", password=self.password, first_name=self.first_name, last_name=self.last_name, @@ -2097,12 +2112,9 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Mail not the same?", ) - # This needs to be cought - try: + # This needs to be caught + with contextlib.suppress(AssertionError): self.test_confirm_email() - except AssertionError: - pass - # Request a random page, so we can access the messages response = self.client.get(reverse("profile")) self.assertEqual( diff --git a/ivatar/ivataraccount/test_views_bluesky.py b/ivatar/ivataraccount/test_views_bluesky.py index 4a92ec3..9656051 100644 --- a/ivatar/ivataraccount/test_views_bluesky.py +++ b/ivatar/ivataraccount/test_views_bluesky.py @@ -2,6 +2,9 @@ """ Test our views in ivatar.ivataraccount.views and ivatar.views """ + +import contextlib + # pylint: disable=too-many-lines import os import django @@ -63,28 +66,24 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods """ Create a confirmed openid """ - confirmed = ConfirmedOpenId.objects.create( + return ConfirmedOpenId.objects.create( user=self.user, ip_address="127.0.0.1", openid=self.openid, ) - return confirmed - def create_confirmed_email(self): """ Create a confirmed email """ - confirmed = ConfirmedEmail.objects.create( + return ConfirmedEmail.objects.create( email=self.email, user=self.user, ) - return confirmed - # The following tests need to be moved over to the model tests # and real web UI tests added - def test_bluesky_handle_for_mail_via_model_handle_doesnt_exist(self): + def test_bluesky_handle_for_mail_via_model_handle_does_not_exist(self): """ Add Bluesky handle to a confirmed mail address """ @@ -92,14 +91,12 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods confirmed = self.create_confirmed_email() confirmed.set_bluesky_handle(self.bsky_test_account) - try: - confirmed.set_bluesky_handle(self.bsky_test_account + "1") - except Exception: - pass + with contextlib.suppress(Exception): + confirmed.set_bluesky_handle(f"{self.bsky_test_account}1") self.assertNotEqual( confirmed.bluesky_handle, - self.bsky_test_account + "1", - "Setting Bluesky handle that doesn exist works?", + f"{self.bsky_test_account}1", + "Setting Bluesky handle that doesn't exist works?", ) def test_bluesky_handle_for_mail_via_model_handle_exists(self): @@ -116,7 +113,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods "Setting Bluesky handle doesn't work?", ) - def test_bluesky_handle_for_openid_via_model_handle_doesnt_exist(self): + def test_bluesky_handle_for_openid_via_model_handle_does_not_exist(self): """ Add Bluesky handle to a confirmed openid address """ @@ -124,14 +121,12 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods confirmed = self.create_confirmed_openid() confirmed.set_bluesky_handle(self.bsky_test_account) - try: - confirmed.set_bluesky_handle(self.bsky_test_account + "1") - except Exception: - pass + with contextlib.suppress(Exception): + confirmed.set_bluesky_handle(f"{self.bsky_test_account}1") self.assertNotEqual( confirmed.bluesky_handle, - self.bsky_test_account + "1", - "Setting Bluesky handle that doesn exist works?", + f"{self.bsky_test_account}1", + "Setting Bluesky handle that doesn't exist works?", ) def test_bluesky_handle_for_openid_via_model_handle_exists(self): @@ -161,7 +156,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods response = self.client.get(lu) # This is supposed to redirect to the Bluesky proxy self.assertEqual(response.status_code, 302) - self.assertEqual(response["Location"], "/blueskyproxy/%s" % confirmed.digest) + self.assertEqual(response["Location"], f"/blueskyproxy/{confirmed.digest}") def test_bluesky_fetch_openid(self): """ @@ -176,7 +171,7 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods response = self.client.get(lu) # This is supposed to redirect to the Bluesky proxy self.assertEqual(response.status_code, 302) - self.assertEqual(response["Location"], "/blueskyproxy/%s" % confirmed.digest) + self.assertEqual(response["Location"], f"/blueskyproxy/{confirmed.digest}") def test_assign_bluesky_handle_to_openid(self): """ diff --git a/ivatar/test_views.py b/ivatar/test_views.py index 710d82e..411bafc 100644 --- a/ivatar/test_views.py +++ b/ivatar/test_views.py @@ -2,6 +2,9 @@ """ Test our views in ivatar.ivataraccount.views and ivatar.views """ + +import contextlib + # pylint: disable=too-many-lines import os import json @@ -14,11 +17,8 @@ from ivatar.utils import random_string, Bluesky BLUESKY_APP_PASSWORD = None BLUESKY_IDENTIFIER = None -try: +with contextlib.suppress(Exception): from settings import BLUESKY_APP_PASSWORD, BLUESKY_IDENTIFIER -except Exception: # pylint: disable=broad-except - pass - os.environ["DJANGO_SETTINGS_MODULE"] = "ivatar.settings" django.setup() @@ -56,16 +56,16 @@ class Tester(TestCase): # pylint: disable=too-many-public-methods """ Test incorrect digest """ - response = self.client.get("/avatar/%s" % "x" * 65, follow=True) + response = self.client.get("/avatar/" + "x" * 65, follow=True) self.assertEqual( - response.redirect_chain[0][0], - "/static/img/deadbeef.png", + response.redirect_chain[2][0], + "/static/img/nobody/80.png", "Doesn't redirect to static?", ) # self.assertRedirects( - # response=response, - # expected_url="/static/img/deadbeef.png", - # msg_prefix="Why does an invalid hash not redirect to deadbeef?", + # response=response, + # expected_url="/static/img/nobody/80.png", + # msg_prefix="Why does an invalid hash not redirect to deadbeef?", # ) def test_stats(self):