89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
# ruff: noqa: INP001
|
|
"""Webhook queue helper unit tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import UTC, datetime
|
|
from uuid import UUID, uuid4
|
|
|
|
import pytest
|
|
|
|
from app.services.webhooks.queue import (
|
|
QueuedWebhookDelivery,
|
|
dequeue_webhook_delivery,
|
|
enqueue_webhook_delivery,
|
|
requeue_if_failed,
|
|
)
|
|
|
|
|
|
class _FakeRedis:
|
|
def __init__(self) -> None:
|
|
self.values: list[str] = []
|
|
|
|
def lpush(self, key: str, value: str) -> None:
|
|
self.values.insert(0, value)
|
|
|
|
def rpop(self, key: str) -> str | None:
|
|
if not self.values:
|
|
return None
|
|
return self.values.pop()
|
|
|
|
|
|
@pytest.mark.parametrize("attempts", [0, 1, 2])
|
|
def test_webhook_queue_roundtrip(monkeypatch: pytest.MonkeyPatch, attempts: int) -> None:
|
|
fake = _FakeRedis()
|
|
|
|
def _fake_redis() -> _FakeRedis:
|
|
return fake
|
|
|
|
board_id = uuid4()
|
|
webhook_id = uuid4()
|
|
payload_id = uuid4()
|
|
payload = QueuedWebhookDelivery(
|
|
board_id=board_id,
|
|
webhook_id=webhook_id,
|
|
payload_id=payload_id,
|
|
payload_event="push",
|
|
received_at=datetime.now(UTC),
|
|
attempts=attempts,
|
|
)
|
|
|
|
monkeypatch.setattr("app.services.webhooks.queue._redis_client", _fake_redis)
|
|
assert enqueue_webhook_delivery(payload)
|
|
|
|
dequeued = dequeue_webhook_delivery()
|
|
assert dequeued is not None
|
|
assert dequeued.board_id == board_id
|
|
assert dequeued.webhook_id == webhook_id
|
|
assert dequeued.payload_id == payload_id
|
|
assert dequeued.payload_event == "push"
|
|
assert dequeued.attempts == attempts
|
|
|
|
|
|
@pytest.mark.parametrize("attempts", [0, 1, 2, 3])
|
|
def test_requeue_respects_retry_cap(monkeypatch: pytest.MonkeyPatch, attempts: int) -> None:
|
|
fake = _FakeRedis()
|
|
|
|
def _fake_redis() -> _FakeRedis:
|
|
return fake
|
|
|
|
monkeypatch.setattr("app.services.webhooks.queue._redis_client", _fake_redis)
|
|
|
|
payload = QueuedWebhookDelivery(
|
|
board_id=uuid4(),
|
|
webhook_id=uuid4(),
|
|
payload_id=uuid4(),
|
|
payload_event="push",
|
|
received_at=datetime.now(UTC),
|
|
attempts=attempts,
|
|
)
|
|
|
|
if attempts >= 3:
|
|
assert requeue_if_failed(payload) is False
|
|
assert fake.values == []
|
|
else:
|
|
assert requeue_if_failed(payload) is True
|
|
requeued = dequeue_webhook_delivery()
|
|
assert requeued is not None
|
|
assert requeued.attempts == attempts + 1
|