diff --git a/tests/settings.py b/tests/settings.py index aaed1d9..9bedbcd 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -5,3 +5,7 @@ INSTALLED_APPS = [ 'django_lightweight_queue', ] + +ROOT_URLCONF = 'tests.urls' + +SITE_URL = 'http://localhost:8000' diff --git a/tests/test_debug_web_backend.py b/tests/test_debug_web_backend.py new file mode 100644 index 0000000..e10d450 --- /dev/null +++ b/tests/test_debug_web_backend.py @@ -0,0 +1,45 @@ +import io +import unittest +import contextlib +import urllib.parse +from unittest import mock + +from django.http import QueryDict +from django.urls import resolve + +from django_lightweight_queue import task +from django_lightweight_queue.job import Job +from django_lightweight_queue.types import QueueName +from django_lightweight_queue.backends.debug_web import DebugWebBackend + + +@task() +def demo_task() -> None: + pass + + +class DebugWebBackendTests(unittest.TestCase): + def test_enqueue_prints_valid_url(self) -> None: + backend = DebugWebBackend() + + job = Job('tests.test_debug_web_backend.demo_task', ('positional',), {'keyword': '&arg='}) + + with mock.patch('tests.test_debug_web_backend.demo_task') as demo_task_mock: + with contextlib.redirect_stdout(io.StringIO()) as mock_stdout: + backend.enqueue(job, QueueName('test-queue')) + + url = mock_stdout.getvalue().strip() + parse_result = urllib.parse.urlparse(url) + + match = resolve(parse_result.path) + self.assertIsNotNone(match, f"Failed to match {parse_result.path}") + + query = QueryDict(parse_result.query) + + self.assertEqual( + {'job': [job.to_json()]}, + dict(query), + "Wrong query arguments printed", + ) + + demo_task_mock.assert_not_called() diff --git a/tests/urls.py b/tests/urls.py new file mode 100644 index 0000000..4111a45 --- /dev/null +++ b/tests/urls.py @@ -0,0 +1,5 @@ +from django.urls import path, include + +urlpatterns = [ + path('', include('django_lightweight_queue.urls', namespace='django-lightweight-queue')), +]