Files @ 9996f5fcde31
Branch filter:

Location: conntrackt/conntrackt/tests/test_views.py

branko
Added tests for utility functions. Optimised some view tests. Added tests for entity view, entity iptables view, and project iptables view.
# Standard library imports.
from StringIO import StringIO
from zipfile import ZipFile, ZIP_DEFLATED

# Django imports.
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.test.client import Client
from django.contrib.auth.models import User, Permission

# Application imports
from conntrackt.models import Project


class ViewTest(TestCase):
    """
    Abstract test class that initalises the fixtures, sets-up a client, and
    sets-up a test user.
    """

    fixtures = ['test-data.json']

    def setUp(self):
        # Set-up web client.
        self.client = Client()

        # Set-up users with different view permissions.
        self.user = {}
        self.user["fullperms"] = User.objects.create_user("fullperms", "fullperms@example.com", "fullperms")
        self.user["fullperms"].user_permissions.add(Permission.objects.get(codename="view"))
        self.user["noperms"] = User.objects.create_user("noperms", "noperms@example.com", "noperms")


class IndexViewTest(ViewTest):

    def test_permission_denied(self):
        """
        Tests if permission will be denied for client without sufficient privileges.
        """

        self.client.login(username="noperms", password="noperms")

        response = self.client.get(reverse("index"))

        self.assertContains(response, "You have insufficient privileges to access this resource. Please contact your local system administrator if you believe you should have been granted access.", status_code=403)

    def test_permission_granted(self):
        """
        Tests if permission will be granted for user with correct privileges.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("index"))

        self.assertEqual(response.status_code, 200)

    def test_no_projects(self):
        """
        Tests the index view when no projects are defined.
        """

        Project.objects.all().delete()

        self.client.login(username="fullperms", password="fullperms")
        response = self.client.get(reverse("index"))

        self.assertContains(response, "Currently there are no projects defined in the database. Use the administration pages in order to add a new project.")

    def test_projects_available(self):
        """
        Tests if projects are shown or not.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("index"))
        
        self.assertQuerysetEqual(response.context["projects"], ["<Project: Test Project 1>", "<Project: Test Project 2>"])
        self.assertContains(response, "Test Project 1")
        self.assertContains(response, "Test Project 2")


class ProjectViewTest(ViewTest):

    def test_permission_denied(self):
        """
        Tests if permission will be denied for client without sufficient privileges.
        """

        self.client.login(username="noperms", password="noperms")

        response = self.client.get(reverse("project", args=(1,)))

        self.assertContains(response, "You have insufficient privileges to access this resource. Please contact your local system administrator if you believe you should have been granted access.", status_code=403)

    def test_permission_granted(self):
        """
        Tests if permission will be granted for user with correct privileges.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project", args=(1,)))

        self.assertEqual(response.status_code, 200)

    def test_project_show(self):
        """
        Tests if the project information is shown properly.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project", args=(1,)))

        location, entities = response.context["location_entities"][0]
        self.assertEqual(location.name, "Test Location 1")
        self.assertQuerysetEqual(entities, ["<Entity: Test Entity 1 (Test Project 1 - Test Location 1)>",
                                            "<Entity: Test Entity 2 (Test Project 1 - Test Location 1)>"])

        location, entities = response.context["location_entities"][1]
        self.assertEqual(location.name, "Test Location 2")
        self.assertQuerysetEqual(entities, ["<Entity: Test Entity 3 (Test Project 1 - Test Location 2)>",
                                            "<Entity: Test Subnet (Test Project 1 - Test Location 2)>"])

        self.assertEqual(str(response.context["project"]), "Test Project 1")
        self.assertContains(response, "Test Project 1")
        self.assertContains(response, "Test Location 1")
        self.assertContains(response, "Test Location 2")


class EntityView(ViewTest):
    
    def test_permission_denied(self):
        """
        Tests if permission will be denied for client without sufficient privileges.
        """

        self.client.login(username="noperms", password="noperms")

        response = self.client.get(reverse("entity", args=(1,)))

        self.assertContains(response, "You have insufficient privileges to access this resource. Please contact your local system administrator if you believe you should have been granted access.", status_code=403)

    def test_permission_granted(self):
        """
        Tests if permission will be granted for user with correct privileges.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("entity", args=(1,)))

        self.assertEqual(response.status_code, 200)

    def test_entity_show(self):
        """
        Tests if the entity information is shown properly.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("entity", args=(1,)))

        self.assertEqual(str(response.context["entity"]), "Test Entity 1 (Test Project 1 - Test Location 1)")
        self.assertContains(response, "Test Entity 1")
        self.assertContains(response, ":INPUT")
        self.assertContains(response, ":OUTPUT")
        self.assertContains(response, ":FORWARD")


class EntityIptablesTest(ViewTest):

    def test_permission_denied(self):
        """
        Tests if permission will be denied for client without sufficient privileges.
        """

        self.client.login(username="noperms", password="noperms")

        response = self.client.get(reverse("entity_iptables", args=(1,)))

        self.assertContains(response, "You have insufficient privileges to access this resource. Please contact your local system administrator if you believe you should have been granted access.", status_code=403)

    def test_permission_granted(self):
        """
        Tests if permission will be granted for user with correct privileges.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("entity_iptables", args=(1,)))

        self.assertEqual(response.status_code, 200)

    def test_no_entity(self):
        """
        Tests if a 404 is returned if no entity was found (invalid ID).
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("entity_iptables", args=(200,)))

        self.assertEqual(response.status_code, 404)

    def test_content_type(self):
        """
        Test if correct content type is being returned by the response.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("entity_iptables", args=(1,)))

        self.assertEqual(response['Content-Type'], "text/plain")

    def test_content_disposition(self):
        """
        Test if the correct content disposition has been set.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("entity_iptables", args=(1,)))

        self.assertEqual(response['Content-Disposition'], "attachment; filename=test_entity_1-iptables.conf")

    def test_entity_iptables_show(self):
        """
        Test if the entity's iptables are being show or not.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("entity_iptables", args=(1,)))

        self.assertContains(response, ":INPUT")
        self.assertContains(response, ":OUTPUT")
        self.assertContains(response, ":FORWARD")
        

class ProjectIptablesTest(ViewTest):

    def test_permission_denied(self):
        """
        Tests if permission will be denied for client without sufficient privileges.
        """

        self.client.login(username="noperms", password="noperms")

        response = self.client.get(reverse("project_iptables", args=(1,)))

        self.assertContains(response, "You have insufficient privileges to access this resource. Please contact your local system administrator if you believe you should have been granted access.", status_code=403)

    def test_permission_granted(self):
        """
        Tests if permission will be granted for user with correct privileges.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project_iptables", args=(1,)))

        self.assertEqual(response.status_code, 200)

    def test_invalid_project(self):
        """
        Tests if a 404 is returned if invalid project is specified.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project_iptables", args=(200,)))
        self.assertEqual(response.status_code, 404)

        response = self.client.get(reverse("project_location_iptables", args=(200,1)))
        self.assertEqual(response.status_code, 404)


    def test_invalid_location(self):
        """
        Tests if a 404 is returned if invalid location is specified.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project_location_iptables", args=(1,200)))
        self.assertEqual(response.status_code, 404)

    def test_content_type(self):
        """
        Test if correct content type is being returned by the response.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project_iptables", args=(1,)))

        self.assertEqual(response['Content-Type'], "application/zip")

    def test_content_disposition(self):
        """
        Test if the correct content disposition has been set.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project_iptables", args=(1,)))
        self.assertEqual(response['Content-Disposition'], 'attachment; filename="test_project_1-iptables.zip"')

        response = self.client.get(reverse("project_location_iptables", args=(1,1)))
        self.assertEqual(response['Content-Disposition'], 'attachment; filename="test_project_1-test_location_1-iptables.zip"')

    def test_project_entities_show(self):
        """
        Test if the project's iptables are being shown or not.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project_iptables", args=(1,)))

        buff = StringIO(response.content)

        zipped_iptables = ZipFile(buff, "r", ZIP_DEFLATED)
        expected_zip_files = ["test_entity_1-iptables.conf",
                              "test_entity_2-iptables.conf",
                              "test_entity_3-iptables.conf",
                              "test_subnet-iptables.conf" ]

        self.assertEqual(len(zipped_iptables.namelist()), 4)
        self.assertEqual(zipped_iptables.namelist(), expected_zip_files)

        for filename in expected_zip_files:
            iptables_file = zipped_iptables.read(filename)
            self.assertIn(":INPUT", iptables_file)
            self.assertIn(":OUTPUT", iptables_file)
            self.assertIn(":FORWARD", iptables_file)

        zipped_iptables.close()

    def test_project_location_entities_show(self):
        """
        Test if the project location's iptables are being shown or not.
        """

        self.client.login(username="fullperms", password="fullperms")

        response = self.client.get(reverse("project_location_iptables", args=(1,1)))

        buff = StringIO(response.content)

        zipped_iptables = ZipFile(buff, "r", ZIP_DEFLATED)
        expected_zip_files = ["test_entity_1-iptables.conf",
                              "test_entity_2-iptables.conf"]

        self.assertEqual(len(zipped_iptables.namelist()), 2)
        self.assertEqual(zipped_iptables.namelist(), expected_zip_files)

        for filename in expected_zip_files:
            iptables_file = zipped_iptables.read(filename)
            self.assertIn(":INPUT", iptables_file)
            self.assertIn(":OUTPUT", iptables_file)
            self.assertIn(":FORWARD", iptables_file)

        zipped_iptables.close()