Skip to content

Commit 2cdd838

Browse files
committed
Check transaction support when using ENQUEUE_ON_COMMIT
1 parent 33d12cc commit 2cdd838

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

django_tasks/backends/base.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,15 @@ def check(self, **kwargs: Any) -> Iterable[messages.CheckMessage]:
148148
yield messages.Error(
149149
"`ENQUEUE_ON_COMMIT` cannot be used when no databases are configured",
150150
hint="Set `ENQUEUE_ON_COMMIT` to False",
151+
id="tasks.E001",
152+
)
153+
154+
if (
155+
self.enqueue_on_commit
156+
and not connections["default"].features.supports_transactions
157+
):
158+
yield messages.Error(
159+
"ENQUEUE_ON_COMMIT cannot be used on a database which doesn't support transactions",
160+
hint="Set `ENQUEUE_ON_COMMIT` to False",
161+
id="tasks.E002",
151162
)

tests/tests/test_dummy_backend.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
SimpleTestCase,
99
TransactionTestCase,
1010
override_settings,
11+
skipIfDBFeature,
1112
)
1213
from django.urls import reverse
1314

@@ -191,10 +192,9 @@ def test_check(self) -> None:
191192
)
192193
@mock.patch("django_tasks.backends.base.connections", ConnectionHandler({}))
193194
def test_enqueue_on_commit_with_no_databases(self) -> None:
194-
errors = list(default_task_backend.check())
195-
196-
self.assertEqual(len(errors), 1)
197-
self.assertIn("Set `ENQUEUE_ON_COMMIT` to False", errors[0].hint) # type:ignore[arg-type]
195+
self.assertIn(
196+
"tasks.E001", {error.id for error in default_task_backend.check()}
197+
)
198198

199199
def test_takes_context(self) -> None:
200200
result = test_tasks.get_task_id.enqueue()
@@ -347,3 +347,17 @@ def test_task_specific_enqueue_on_commit(self) -> None:
347347
self.assertIsNone(result.enqueued_at)
348348
result.refresh()
349349
self.assertIsNotNone(result.enqueued_at)
350+
351+
@override_settings(
352+
TASKS={
353+
"default": {
354+
"BACKEND": "django_tasks.backends.dummy.DummyBackend",
355+
"ENQUEUE_ON_COMMIT": True,
356+
}
357+
}
358+
)
359+
@skipIfDBFeature("supports_transactions")
360+
def test_enqueue_on_commit_with_no_transactions(self) -> None:
361+
self.assertIn(
362+
"tasks.E002", {error.id for error in default_task_backend.check()}
363+
)

0 commit comments

Comments
 (0)