mirror of
https://github.com/Sea-Haven-Industries/meal-order-manager.git
synced 2026-09-30 04:13:12 +00:00
Initialize the SDK on gunicorn and the SQS worker with afterhours-style scrubbing. Store the DSN in SSM and inject only the parameter name onto the live task.
70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
"""SQS worker deletes completed jobs and leaves skipped messages for retry."""
|
|
|
|
import json
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from server import worker
|
|
|
|
|
|
def _one_message_then_stop(body: dict):
|
|
def receive_message(**_kwargs):
|
|
worker._stop(None, None)
|
|
return {
|
|
"Messages": [
|
|
{
|
|
"ReceiptHandle": "rh-1",
|
|
"Body": json.dumps(body),
|
|
}
|
|
]
|
|
}
|
|
|
|
return receive_message
|
|
|
|
|
|
@patch("server.worker.boto3.client")
|
|
@patch("server.worker.run_job")
|
|
def test_worker_does_not_delete_skipped_jobs(mock_run, mock_client):
|
|
sqs = MagicMock()
|
|
mock_client.return_value = sqs
|
|
sqs.receive_message.side_effect = _one_message_then_stop({"event": "close"})
|
|
mock_run.return_value = {"status": "skipped", "reason": "outside window"}
|
|
|
|
with patch.dict("os.environ", {"JOBS_QUEUE_URL": "https://sqs.example/jobs"}):
|
|
worker._running = True
|
|
worker.main()
|
|
|
|
sqs.delete_message.assert_not_called()
|
|
|
|
|
|
@patch("server.worker.boto3.client")
|
|
@patch("server.worker.run_job")
|
|
def test_worker_deletes_completed_jobs(mock_run, mock_client):
|
|
sqs = MagicMock()
|
|
mock_client.return_value = sqs
|
|
sqs.receive_message.side_effect = _one_message_then_stop({"event": "close"})
|
|
mock_run.return_value = {"status": "closed", "week": "2026-W19"}
|
|
|
|
with patch.dict("os.environ", {"JOBS_QUEUE_URL": "https://sqs.example/jobs"}):
|
|
worker._running = True
|
|
worker.main()
|
|
|
|
sqs.delete_message.assert_called_once_with(
|
|
QueueUrl="https://sqs.example/jobs", ReceiptHandle="rh-1"
|
|
)
|
|
|
|
|
|
@patch("server.worker.sentry_sdk.capture_exception")
|
|
@patch("server.worker.boto3.client")
|
|
@patch("server.worker.run_job")
|
|
def test_worker_captures_job_failures(mock_run, mock_client, mock_capture):
|
|
sqs = MagicMock()
|
|
mock_client.return_value = sqs
|
|
sqs.receive_message.side_effect = _one_message_then_stop({"event": "close"})
|
|
mock_run.side_effect = RuntimeError("boom")
|
|
|
|
with patch.dict("os.environ", {"JOBS_QUEUE_URL": "https://sqs.example/jobs"}):
|
|
worker._running = True
|
|
worker.main()
|
|
|
|
mock_capture.assert_called_once()
|
|
sqs.delete_message.assert_not_called()
|