Files

54 lines
1.6 KiB
Python
Raw Permalink Normal View History

"""Interactive/bulk queue isolation (refactor §1, acceptance §10.5).
Bulk backfills and interactive user actions land on separate arq queues (run by
separate consumers with their own concurrency), so a burst of backfills can never
starve sends/flag changes. Here we assert the routing that guarantees it.
"""
from __future__ import annotations
from app import queue as app_queue
from app.queue import QUEUE_BULK, QUEUE_INTERACTIVE, queue_for
_INTERACTIVE_JOBS = [
"push_flags_job",
"move_job",
"move_thread_to_folder_job",
"delete_thread_job",
"send_job",
"push_draft_to_imap_job",
"remove_imap_draft_job",
"refresh_account_job",
]
def test_bulk_backfill_routes_to_bulk_queue() -> None:
assert queue_for("sync_bootstrap_account") == QUEUE_BULK
def test_interactive_jobs_route_to_interactive_queue() -> None:
for name in _INTERACTIVE_JOBS:
assert queue_for(name) == QUEUE_INTERACTIVE
async def test_enqueue_job_sets_queue_name(monkeypatch) -> None: # type: ignore[no-untyped-def]
captured: list[tuple[str, str | None]] = []
class FakePool:
async def enqueue_job(self, name: str, *args: object, **kwargs: object) -> None:
captured.append((name, kwargs.get("_queue_name"))) # type: ignore[arg-type]
return None
async def fake_pool() -> FakePool:
return FakePool()
monkeypatch.setattr(app_queue, "get_arq_pool", fake_pool)
await app_queue.enqueue_job("sync_bootstrap_account", "a")
await app_queue.enqueue_job("send_job", "b")
assert captured == [
("sync_bootstrap_account", QUEUE_BULK),
("send_job", QUEUE_INTERACTIVE),
]