Просмотр исходного кода

Fix pylint warnings, commit all work done so far

rafalp 6 лет назад
Родитель
Сommit
e072d9218e

+ 0 - 1
misago/admin/tests/test_authorization.py

@@ -2,7 +2,6 @@ from time import time
 from unittest.mock import Mock
 
 import pytest
-from django.contrib.messages import get_messages
 from django.test import override_settings
 
 from ..auth import (

+ 2 - 8
misago/admin/tests/test_logout_from_admin.py

@@ -1,6 +1,6 @@
 from django.urls import reverse
 
-from ...test import assert_contains, assert_has_message
+from ...test import assert_has_message
 from ..auth import is_admin_authorized
 
 admin_logout_link = reverse("misago:admin:logout")
@@ -20,7 +20,7 @@ def test_admin_is_redirected_to_site_on_logout(admin_client, superuser):
     assert response["location"] == site_link
 
 
-def test_admin_is_displayed_a_message_after_logout(admin_client, superuser):
+def test_admin_is_displayed_message_after_logout(admin_client, superuser):
     response = admin_client.post(admin_logout_link)
     assert_has_message(response, "Your admin session has been closed.")
 
@@ -29,9 +29,3 @@ def test_admin_can_logout_from_entire_site(admin_client):
     response = admin_client.post(site_logout_link)
     assert response.wsgi_request.user.is_anonymous
     assert not is_admin_authorized(response.wsgi_request)
-
-
-def test_admin_is_redirected_to_site_on_logout(admin_client, superuser):
-    response = admin_client.post(admin_logout_link)
-    assert response.status_code == 302
-    assert response["location"] == site_link

+ 0 - 5
misago/admin/tests/test_protected_urls_detection.py

@@ -29,11 +29,6 @@ def test_request_to_django_admin_subpath_url_is_protected():
     assert get_protected_namespace(request) == "admin"
 
 
-def test_request_to_django_admin_subpath_url_is_protected():
-    request = Mock(path=django_admin_url + "users/")
-    assert get_protected_namespace(request) == "admin"
-
-
 def test_request_to_site_root_url_is_not_protected():
     request = Mock(path=site_url)
     assert get_protected_namespace(request) is None

+ 0 - 2
misago/admin/themes/forms.py

@@ -1,10 +1,8 @@
 from django import forms
-from django.utils.html import conditional_escape, mark_safe
 from django.utils.translation import gettext, gettext_lazy as _
 from mptt.forms import TreeNodeChoiceField
 
 from ...themes.models import Theme
-from ..forms import YesNoSwitch
 from .css import create_css
 from .media import create_media
 

+ 1 - 1
misago/admin/themes/media.py

@@ -34,7 +34,7 @@ def media_is_image(image):
 def save_image(theme, image):
     try:
         img = Image.open(image.file)
-    except Exception:
+    except Exception:  # pylint: disable=broad-except
         return
     else:
         width, height = img.size

+ 0 - 0
misago/admin/themes/tests/css/empty.css


+ 63 - 0
misago/admin/themes/tests/test_browsing_theme_assets.py

@@ -0,0 +1,63 @@
+import pytest
+from django.urls import reverse
+
+from ....test import assert_contains, assert_not_contains, assert_has_error_message
+
+
+@pytest.fixture
+def assets_client(admin_client):
+    def get_theme_assets(theme):
+        url = reverse("misago:admin:appearance:themes:assets", kwargs={"pk": theme.pk})
+        return admin_client.get(url)
+
+    return get_theme_assets
+
+
+def test_theme_assets_list_is_displayed(assets_client, theme):
+    response = assets_client(theme)
+    assert_contains(response, theme.name)
+
+
+def test_css_is_displayed_on_theme_asset_list(assets_client, theme, css):
+    response = assets_client(theme)
+    assert_contains(response, css.name)
+
+
+def test_media_is_displayed_on_themes_asset_list(assets_client, theme, media):
+    response = assets_client(theme)
+    assert_contains(response, media.name)
+
+
+def test_image_is_displayed_on_themes_asset_list(assets_client, theme, image):
+    response = assets_client(theme)
+    assert_contains(response, image.name)
+
+
+def test_image_thumbnail_is_displayed_on_themes_asset_list(assets_client, theme, image):
+    response = assets_client(theme)
+    assert_contains(response, image.thumbnail.url)
+
+
+def test_other_theme_assets_are_not_displayed(
+    assets_client, other_theme, css, media, image
+):
+    response = assets_client(other_theme)
+    assert_not_contains(response, css.name)
+    assert_not_contains(response, media.name)
+    assert_not_contains(response, image.name)
+
+
+def test_user_is_redirected_away_with_message_from_default_theme_assets_list(
+    assets_client, default_theme
+):
+    response = assets_client(default_theme)
+    assert response.status_code == 302
+    assert_has_error_message(response)
+
+
+def test_user_is_redirected_away_with_message_from_nonexisting_theme(
+    assets_client, nonexisting_theme
+):
+    response = assets_client(nonexisting_theme)
+    assert response.status_code == 302
+    assert_has_error_message(response)

+ 113 - 0
misago/admin/themes/tests/test_deleting_assets.py

@@ -0,0 +1,113 @@
+import pytest
+from django.urls import reverse
+
+from ....test import assert_has_success_message
+
+
+@pytest.fixture
+def delete_css(admin_client):
+    def delete_assets(theme, assets):
+        url = reverse(
+            "misago:admin:appearance:themes:delete-css", kwargs={"pk": theme.pk}
+        )
+        return admin_client.post(url, {"item": [i.pk for i in assets]})
+
+    return delete_assets
+
+
+@pytest.fixture
+def delete_media(admin_client):
+    def delete_assets(theme, assets):
+        url = reverse(
+            "misago:admin:appearance:themes:delete-media", kwargs={"pk": theme.pk}
+        )
+        return admin_client.post(url, {"item": [i.pk for i in assets]})
+
+    return delete_assets
+
+
+def test_theme_css_can_be_deleted(theme, delete_css, css):
+    delete_css(theme, [css])
+    assert not theme.css.exists()
+
+
+def test_multiple_theme_css_can_be_deleted_at_single_time(
+    theme, delete_css, css, css_link
+):
+    delete_css(theme, [css, css_link])
+    assert not theme.css.exists()
+
+
+def test_theme_media_can_be_deleted(theme, delete_media, media):
+    delete_media(theme, [media])
+    assert not theme.media.exists()
+
+
+def test_theme_images_can_be_deleted(theme, delete_media, image):
+    delete_media(theme, [image])
+    assert not theme.media.exists()
+
+
+def test_multiple_theme_media_can_be_deleted_at_single_time(
+    theme, delete_media, media, image
+):
+    delete_media(theme, [media, image])
+    assert not theme.media.exists()
+
+
+def test_success_message_is_set_after_css_is_deleted(theme, delete_css, css):
+    response = delete_css(theme, [css])
+    assert_has_success_message(response)
+
+
+def test_success_message_is_set_after_media_is_deleted(theme, delete_media, media):
+    response = delete_media(theme, [media])
+    assert_has_success_message(response)
+
+
+def test_selecting_no_css_to_delete_causes_no_errors(theme, delete_css, css):
+    delete_css(theme, [])
+    assert theme.css.exists()
+
+
+def test_selecting_no_media_to_delete_causes_no_errors(theme, delete_media, media):
+    delete_media(theme, [])
+    assert theme.media.exists()
+
+
+def test_selecting_invalid_css_id_to_delete_causes_no_errors(
+    mocker, theme, delete_css, css
+):
+    delete_css(theme, [mocker.Mock(pk="str")])
+    assert theme.css.exists()
+
+
+def test_selecting_invalid_media_id_to_delete_causes_no_errors(
+    mocker, theme, delete_media, media
+):
+    delete_media(theme, [mocker.Mock(pk="str")])
+    assert theme.media.exists()
+
+
+def test_selecting_nonexisting_css_id_to_delete_causes_no_errors(
+    mocker, theme, delete_css, css
+):
+    delete_css(theme, [mocker.Mock(pk=css.pk + 1)])
+    assert theme.css.exists()
+
+
+def test_selecting_nonexisting_media_id_to_delete_causes_no_errors(
+    mocker, theme, delete_media, media
+):
+    delete_media(theme, [mocker.Mock(pk=media.pk + 1)])
+    assert theme.media.exists()
+
+
+def test_other_theme_css_is_not_deleted(delete_css, theme, other_theme, css):
+    delete_css(other_theme, [css])
+    assert theme.css.exists()
+
+
+def test_other_theme_media_is_not_deleted(delete_media, theme, other_theme, media):
+    delete_media(other_theme, [media])
+    assert theme.media.exists()

+ 6 - 0
misago/admin/themes/tests/test_empty_file_can_be_hashed.py

@@ -0,0 +1,6 @@
+from ..utils import HASH_LENGTH, get_file_hash
+
+
+def test_empty_file_hash_is_zeroes(mocker):
+    empty_file = mocker.Mock(size=0)
+    assert get_file_hash(empty_file) == "0" * HASH_LENGTH

+ 1 - 1
misago/admin/themes/tests/test_uploading_css.py

@@ -29,7 +29,7 @@ def upload(admin_client):
         url = reverse(
             "misago:admin:appearance:themes:upload-css", kwargs={"pk": theme.pk}
         )
-        if asset_files:
+        if asset_files is not None:
             data = asset_files if isinstance(asset_files, list) else [asset_files]
         else:
             data = None

+ 1 - 1
misago/admin/themes/tests/test_uploading_media.py

@@ -34,7 +34,7 @@ def upload(admin_client):
         url = reverse(
             "misago:admin:appearance:themes:upload-media", kwargs={"pk": theme.pk}
         )
-        if asset_files:
+        if asset_files is not None:
             data = asset_files if isinstance(asset_files, list) else [asset_files]
         else:
             data = None

+ 5 - 3
misago/admin/themes/utils.py

@@ -1,10 +1,12 @@
 import hashlib
 
+HASH_LENGTH = 8
+
 
 def get_file_hash(file):
-    if file.size is None:
-        return "00000000"
+    if not file.size:
+        return "0" * HASH_LENGTH
     file_hash = hashlib.md5()
     for chunk in file.chunks():
         file_hash.update(chunk)
-    return file_hash.hexdigest()[:8]
+    return file_hash.hexdigest()[:HASH_LENGTH]

+ 3 - 2
misago/admin/themes/views.py

@@ -1,5 +1,4 @@
 from django.contrib import messages
-from django.core.exceptions import PermissionDenied
 from django.db.models import ObjectDoesNotExist
 from django.shortcuts import redirect
 from django.urls import reverse
@@ -105,7 +104,9 @@ class UploadThemeAssets(ThemeAssetsActionAdmin, generic.TargetedView):
     form = None
 
     def action(self, request, theme):
-        form = self.form(request.POST, request.FILES, instance=theme)
+        form = self.form(  # pylint: disable=not-callable
+            request.POST, request.FILES, instance=theme
+        )
 
         if not form.is_valid():
             if form.cleaned_data.get("assets"):

+ 1 - 1
misago/themes/uploadto.py

@@ -24,7 +24,7 @@ def upload_media_thumbnail_to(instance, filename):
     return "themes/%s/media/%s" % (instance.theme.dirname, filename)
 
 
-def add_hash_to_filename(hash, filename):
+def add_hash_to_filename(hash, filename):  # pylint: disable=redefined-builtin
     if ".%s." % hash in filename:
         return filename
     extension_start = filename.rfind(".")