django-downloadview/tests/signature.py
2020-01-13 10:46:14 +01:00

61 lines
1.6 KiB
Python

"""
Test signature generation and validation.
"""
import unittest
from django.core.exceptions import PermissionDenied
from django.core.signing import TimestampSigner
from django_downloadview.decorators import _signature_is_valid
from django_downloadview.storage import SignedURLMixin
class TestStorage:
def url(self, name):
return "https://example.com/{name}".format(name=name)
class SignedTestStorage(SignedURLMixin, TestStorage):
pass
class SignatureGeneratorTestCase(unittest.TestCase):
def test_signed_storage(self):
"""
django_downloadview.storage.SignedURLMixin adds X-Signature to URLs.
"""
storage = SignedTestStorage()
url = storage.url("test")
self.assertIn("https://example.com/test?X-Signature=", url)
class SignatureValidatorTestCase(unittest.TestCase):
def test_verify_signature(self):
"""
django_downloadview.decorators._signature_is_valid returns True on
valid signatures.
"""
signer = TimestampSigner()
request = unittest.mock.MagicMock()
request.path = "test"
request.GET = {"X-Signature": signer.sign("test")}
self.assertIsNone(_signature_is_valid(request))
def test_verify_signature_invalid(self):
"""
django_downloadview.decorators._signature_is_valid raises PermissionDenied
on invalid signatures.
"""
request = unittest.mock.MagicMock()
request.path = "test"
request.GET = {"X-Signature": "not-valid"}
with self.assertRaises(PermissionDenied):
_signature_is_valid(request)