Browse Source

Move admin login/logout tests to pytest

rafalp 6 years ago
parent
commit
5966370bf9

+ 28 - 31
misago/admin/tests/test_admin_hierarchy.py

@@ -1,44 +1,41 @@
-from django.test import TestCase
-
 from ..hierarchy import Node
 
 
-class NodeTests(TestCase):
-    def test_add_node(self):
-        """add_node added node"""
-        master = Node(name="Apples", link="misago:index")
+def test_node_is_added_at_end_of_parent_children():
+    master = Node(name="Apples", link="misago:index")
+    child = Node(name="Oranges", link="misago:index")
+    master.add_node(child)
+
+    assert master.children()[-1].name == child.name
 
-        child = Node(name="Oranges", link="misago:index")
-        master.add_node(child)
 
-        self.assertTrue(child in master.children())
+def test_add_node_after():
+    """add_node added node after specific node"""
+    master = Node(name="Apples", link="misago:index")
 
-    def test_add_node_after(self):
-        """add_node added node after specific node"""
-        master = Node(name="Apples", link="misago:index")
+    child = Node(name="Oranges", link="misago:index")
+    master.add_node(child)
 
-        child = Node(name="Oranges", link="misago:index")
-        master.add_node(child)
+    test = Node(name="Potatoes", link="misago:index")
+    master.add_node(test, after="misago:index")
 
-        test = Node(name="Potatoes", link="misago:index")
-        master.add_node(test, after="misago:index")
+    all_nodes = master.children()
+    for i, node in enumerate(all_nodes):
+        if node.name == test.name:
+            assert all_nodes[i - 1].name == child.name
 
-        all_nodes = master.children()
-        for i, node in enumerate(all_nodes):
-            if node.name == test.name:
-                self.assertEqual(all_nodes[i - 1].name, child.name)
 
-    def test_add_node_before(self):
-        """add_node added node  before specific node"""
-        master = Node(name="Apples", link="misago:index")
+def test_add_node_before():
+    """add_node added node  before specific node"""
+    master = Node(name="Apples", link="misago:index")
 
-        child = Node(name="Oranges", link="misago:index")
-        master.add_node(child)
+    child = Node(name="Oranges", link="misago:index")
+    master.add_node(child)
 
-        test = Node(name="Potatoes", link="misago:index")
-        master.add_node(test, before="misago:index")
+    test = Node(name="Potatoes", link="misago:index")
+    master.add_node(test, before="misago:index")
 
-        all_nodes = master.children()
-        for i, node in enumerate(all_nodes):
-            if node.name == test.name:
-                self.assertEqual(all_nodes[i + 1].name, child.name)
+    all_nodes = master.children()
+    for i, node in enumerate(all_nodes):
+        if node.name == test.name:
+            assert all_nodes[i + 1].name == child.name

+ 0 - 105
misago/admin/tests/test_admin_views.py

@@ -31,111 +31,6 @@ class AdminProtectedNamespaceTests(TestCase):
             self.assertEqual(get_protected_namespace(request), None)
 
 
-class AdminLoginViewTests(TestCase):
-    def test_login_returns_200_on_get(self):
-        """unauthenticated request to admin index produces login form"""
-        response = self.client.get(reverse("misago:admin:index"))
-
-        self.assertContains(response, "Sign in")
-        self.assertContains(response, "Username or e-mail")
-        self.assertContains(response, "Password")
-
-    def test_login_returns_200_on_invalid_post(self):
-        """form handles invalid data gracefully"""
-        response = self.client.post(
-            reverse("misago:admin:index"), data={"username": "no", "password": "no"}
-        )
-
-        self.assertContains(response, "Login or password is incorrect.")
-        self.assertContains(response, "Sign in")
-        self.assertContains(response, "Username or e-mail")
-        self.assertContains(response, "Password")
-
-    def test_login_denies_non_staff_non_superuser(self):
-        """login rejects user thats non staff and non superuser"""
-        user = create_test_user("User", "user@example.com", "password")
-
-        user.is_staff = False
-        user.is_superuser = False
-        user.save()
-
-        response = self.client.post(
-            reverse("misago:admin:index"),
-            data={"username": "User", "password": "password"},
-        )
-
-        self.assertContains(response, "Your account does not have admin privileges.")
-
-    def test_login_denies_non_staff_superuser(self):
-        """login rejects user thats non staff and superuser"""
-        user = create_test_user("User", "user@example.com", "password")
-
-        user.is_staff = False
-        user.is_superuser = True
-        user.save()
-
-        response = self.client.post(
-            reverse("misago:admin:index"),
-            data={"username": "User", "password": "password"},
-        )
-
-        self.assertContains(response, "Your account does not have admin privileges.")
-
-    def test_login_signs_in_staff_non_superuser(self):
-        """login passess user thats staff and non superuser"""
-        user = create_test_user("User", "user@example.com", "password")
-
-        user.is_staff = True
-        user.is_superuser = False
-        user.save()
-
-        response = self.client.post(
-            reverse("misago:admin:index"),
-            data={"username": "User", "password": "password"},
-        )
-
-        self.assertEqual(response.status_code, 302)
-
-    def test_login_signs_in_staff_superuser(self):
-        """login passess user thats staff and superuser"""
-        user = create_test_user("User", "user@example.com", "password")
-
-        user.is_staff = True
-        user.is_superuser = True
-        user.save()
-
-        response = self.client.post(
-            reverse("misago:admin:index"),
-            data={"username": "User", "password": "password"},
-        )
-
-        self.assertEqual(response.status_code, 302)
-
-
-class AdminLogoutTests(AdminTestCase):
-    def test_admin_logout(self):
-        """admin logout logged from admin only"""
-        response = self.client.post(reverse("misago:admin:logout"))
-        self.assertEqual(response.status_code, 302)
-
-        response = self.client.get(reverse("misago:admin:index"))
-        self.assertContains(response, "Your admin session has been closed.")
-
-        response = self.client.get(reverse("misago:index"))
-        self.assertContains(response, self.user.username)
-
-    def test_complete_logout(self):
-        """complete logout logged from both admin and site"""
-        response = self.client.post(reverse("misago:logout"))
-        self.assertEqual(response.status_code, 302)
-
-        response = self.client.get(reverse("misago:admin:index"))
-        self.assertContains(response, "Sign in")
-
-        response = self.client.get(reverse("misago:index"))
-        self.assertContains(response, "Sign in")
-
-
 class AdminViewAccessTests(AdminTestCase):
     def test_admin_denies_non_staff_non_superuser(self):
         """admin middleware rejects user thats non staff and non superuser"""

+ 63 - 0
misago/admin/tests/test_login_to_admin.py

@@ -0,0 +1,63 @@
+from django.urls import reverse
+
+from ...test import assert_contains
+from ..auth import is_admin_session
+
+admin_link = reverse("misago:admin:index")
+
+
+def test_login_form_is_displayed(db, client):
+    response = client.get(admin_link)
+    assert response.status_code == 200
+    assert_contains(response, "Administration")
+    assert_contains(response, "Sign in")
+    assert_contains(response, "Username or e-mail")
+    assert_contains(response, "Password")
+
+
+def test_attempt_to_login_using_invalid_credentials_fails(db, client):
+    response = client.post(admin_link, {"username": "no", "password": "no"})
+    assert_contains(response, "Login or password is incorrect.")
+
+
+def test_attempt_to_login_using_invalid_password_fails(client, superuser):
+    response = client.post(
+        admin_link, {"username": superuser.username, "password": "no"}
+    )
+    assert_contains(response, "Login or password is incorrect.")
+
+
+def test_attempt_to_login_without_staff_status_fails(client, user, user_password):
+    response = client.post(
+        admin_link, {"username": user.username, "password": user_password}
+    )
+    assert_contains(response, "Your account does not have admin privileges.")
+
+
+def test_attempt_to_login_as_superuser_without_staff_status_fails(
+    client, user, user_password
+):
+    user.is_superuser = True
+    user.save()
+
+    response = client.post(
+        admin_link, {"username": user.username, "password": user_password}
+    )
+    assert_contains(response, "Your account does not have admin privileges.")
+
+
+def test_user_with_staff_status_is_logged_to_admin(client, staffuser, user_password):
+    response = client.post(
+        admin_link, {"username": staffuser.username, "password": user_password}
+    )
+    assert is_admin_session(response.wsgi_request)
+    assert response.wsgi_request.user == staffuser
+
+
+def test_login_form_redirects_user_to_admin_index_after_successful_login(
+    client, staffuser, user_password
+):
+    response = client.post(
+        admin_link, {"username": staffuser.username, "password": user_password}
+    )
+    assert response["location"] == admin_link

+ 41 - 0
misago/admin/tests/test_logout_from_admin.py

@@ -0,0 +1,41 @@
+from django.contrib.messages import get_messages
+from django.urls import reverse
+
+from ...test import assert_contains
+from ..auth import is_admin_session
+
+admin_logout_link = reverse("misago:admin:logout")
+site_logout_link = reverse("misago:logout")
+site_link = reverse("misago:index")
+
+
+def test_admin_can_logout_from_admin_site_but_stay_logged(
+    admin_client, superuser
+):
+    response = admin_client.post(admin_logout_link)
+    assert response.wsgi_request.user == superuser
+    assert not is_admin_session(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
+
+
+def test_admin_is_displayed_a_message_after_logout(admin_client, superuser):
+    response = admin_client.post(admin_logout_link)
+    message = list(get_messages(response.wsgi_request))[0]
+    assert str(message) == "Your admin session has been closed."
+
+
+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_session(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

+ 10 - 0
misago/conftest.py

@@ -1,6 +1,7 @@
 import pytest
 
 from .acl import ACL_CACHE, useracl
+from .admin.auth import start_admin_session
 from .conf import SETTINGS_CACHE
 from .conf.dynamicsettings import DynamicSettings
 from .conf.staticsettings import StaticSettings
@@ -79,3 +80,12 @@ def superuser(db, user_password):
 @pytest.fixture
 def superuser_acl(superuser, cache_versions):
     return useracl.get_user_acl(superuser, cache_versions)
+
+
+@pytest.fixture
+def admin_client(mocker, client, superuser):
+    client.force_login(superuser)
+    session = client.session
+    start_admin_session(mocker.Mock(session=session), superuser)
+    session.save()
+    return client

+ 4 - 0
misago/test.py

@@ -0,0 +1,4 @@
+def assert_contains(response, string, status_code=200):
+    assert response.status_code == status_code
+    fail_message = f'"{string}" not found in response.content'
+    assert string in response.content.decode("utf-8"), fail_message