from __future__ import unicode_literals

from django.core.files import File
from django.core.urlresolvers import reverse

from documents.tests.literals import TEST_DOCUMENT_PATH
from documents.tests.test_views import GenericDocumentViewTestCase
from user_management.tests.literals import (
    TEST_USER_PASSWORD, TEST_USER_USERNAME
)

from ..links import (
    link_document_version_signature_delete,
    link_document_version_signature_details,
)
from ..models import DetachedSignature
from ..permissions import (
    permission_document_version_signature_delete,
    permission_document_version_signature_view
)
from .literals import TEST_SIGNATURE_FILE_PATH, TEST_SIGNED_DOCUMENT_PATH


class DocumentSignatureLinksTestCase(GenericDocumentViewTestCase):
    def test_document_version_signature_detail_link_no_permission(self):
        with open(TEST_SIGNED_DOCUMENT_PATH) as file_object:
            document = self.document_type.new_document(
                file_object=file_object
            )

        self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)

        self.add_test_view(
            test_object=document.latest_version.signatures.first()
        )
        context = self.get_test_view()
        resolved_link = link_document_version_signature_details.resolve(
            context=context
        )

        self.assertEqual(resolved_link, None)

    def test_document_version_signature_detail_link_with_permission(self):
        with open(TEST_SIGNED_DOCUMENT_PATH) as file_object:
            document = self.document_type.new_document(
                file_object=file_object
            )

        self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)

        self.role.permissions.add(
            permission_document_version_signature_view.stored_permission
        )

        self.add_test_view(
            test_object=document.latest_version.signatures.first()
        )
        context = self.get_test_view()
        resolved_link = link_document_version_signature_details.resolve(
            context=context
        )

        self.assertNotEqual(resolved_link, None)
        self.assertEqual(
            resolved_link.url,
            reverse(
                'signatures:document_version_signature_details',
                args=(document.latest_version.signatures.first().pk,)
            )
        )

    def test_document_version_signature_delete_link_no_permission(self):
        with open(TEST_DOCUMENT_PATH) as file_object:
            document = self.document_type.new_document(
                file_object=file_object
            )

        with open(TEST_SIGNATURE_FILE_PATH) as file_object:
            DetachedSignature.objects.create(
                document_version=document.latest_version,
                signature_file=File(file_object)
            )

        self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)

        self.add_test_view(
            test_object=document.latest_version.signatures.first()
        )
        context = self.get_test_view()
        resolved_link = link_document_version_signature_delete.resolve(
            context=context
        )

        self.assertEqual(resolved_link, None)

    def test_document_version_signature_delete_link_with_permission(self):
        with open(TEST_DOCUMENT_PATH) as file_object:
            document = self.document_type.new_document(
                file_object=file_object
            )

        with open(TEST_SIGNATURE_FILE_PATH) as file_object:
            DetachedSignature.objects.create(
                document_version=document.latest_version,
                signature_file=File(file_object)
            )

        self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)

        self.role.permissions.add(
            permission_document_version_signature_delete.stored_permission
        )

        self.add_test_view(
            test_object=document.latest_version.signatures.first()
        )
        context = self.get_test_view()
        resolved_link = link_document_version_signature_delete.resolve(
            context=context
        )

        self.assertNotEqual(resolved_link, None)
        self.assertEqual(
            resolved_link.url,
            reverse(
                'signatures:document_version_signature_delete',
                args=(document.latest_version.signatures.first().pk,)
            )
        )
