meal-order-manager/tests/test_secrets.py
Cursor Agent 6bc5ccaedd
fix: Email order filenames, SSM param TTL, DST-safe reopen_at
- Flask dev server: persist orders under lowercase email slug (match Lambda/Dynamo)
- shared.secrets: split secret vs SSM caches; expire get_parameter entries every 5 minutes
- form-status reopen_at: calendar Monday + datetime.combine for 8am ET (not 24h timedelta)
- Add _eastern_now() for testability; tests for SSM TTL and DST weekend edge case

Co-authored-by: Adam Moussa <amoussa1229@users.noreply.github.com>
2026-05-13 18:32:08 +00:00

50 lines
1.6 KiB
Python

"""Tests for shared.secrets caching."""
from unittest.mock import MagicMock, patch
def test_get_parameter_refetches_after_ttl():
"""SSM parameter values expire so callers can observe rotations."""
from shared import secrets
secrets._secret_cache.clear()
secrets._parameter_cache.clear()
mock_ssm = MagicMock()
mock_ssm.get_parameter.side_effect = [
{"Parameter": {"Value": "first"}},
{"Parameter": {"Value": "second"}},
]
with patch.object(secrets, "_ssm", mock_ssm):
with patch.object(secrets, "PARAM_CACHE_TTL_SECONDS", 10.0):
with patch(
"shared.secrets.time.monotonic",
side_effect=[0.0, 5.0, 15.0],
):
assert secrets.get_parameter("/test/param") == "first"
assert secrets.get_parameter("/test/param") == "first"
assert secrets.get_parameter("/test/param") == "second"
assert mock_ssm.get_parameter.call_count == 2
def test_get_secret_stays_cached():
"""Secrets Manager values remain cached (no TTL)."""
from shared import secrets
secrets._secret_cache.clear()
secrets._parameter_cache.clear()
mock_sm = MagicMock()
mock_sm.get_secret_value.side_effect = [
{"SecretString": "a"},
{"SecretString": "b"},
]
with patch.object(secrets, "_sm", mock_sm):
with patch("shared.secrets.time.monotonic", side_effect=[0.0, 5000.0]):
assert secrets.get_secret("arn:aws:secret") == "a"
assert secrets.get_secret("arn:aws:secret") == "a"
assert mock_sm.get_secret_value.call_count == 1