mirror of
https://github.com/GSA/notifications-api.git
synced 2026-01-21 10:01:59 -05:00
101 lines
2.9 KiB
Python
101 lines
2.9 KiB
Python
from collections import namedtuple
|
|
from datetime import datetime
|
|
|
|
import pytest
|
|
|
|
from app.dao.services_dao import get_specific_hours_stats
|
|
from app.enums import StatisticsType
|
|
from app.models import TemplateType
|
|
|
|
NotificationRow = namedtuple(
|
|
"NotificationRow", ["notification_type", "status", "timestamp", "count"]
|
|
)
|
|
|
|
|
|
def generate_expected_hourly_output(requested_sms_hours):
|
|
return {
|
|
hour: {
|
|
TemplateType.SMS: {
|
|
StatisticsType.REQUESTED: 1,
|
|
StatisticsType.DELIVERED: 0,
|
|
StatisticsType.FAILURE: 0,
|
|
StatisticsType.PENDING: 0,
|
|
},
|
|
TemplateType.EMAIL: {
|
|
StatisticsType.REQUESTED: 0,
|
|
StatisticsType.DELIVERED: 0,
|
|
StatisticsType.FAILURE: 0,
|
|
StatisticsType.PENDING: 0,
|
|
},
|
|
}
|
|
for hour in requested_sms_hours
|
|
}
|
|
|
|
|
|
def create_mock_notification(notification_type, status, timestamp, count=1):
|
|
"""
|
|
Creates a named tuple with the attributes required by format_statistics.
|
|
"""
|
|
return NotificationRow(
|
|
notification_type=notification_type,
|
|
status=status,
|
|
timestamp=timestamp.replace(minute=0, second=0, microsecond=0),
|
|
count=count,
|
|
)
|
|
|
|
|
|
test_cases = [
|
|
(
|
|
[
|
|
create_mock_notification(
|
|
TemplateType.SMS,
|
|
StatisticsType.REQUESTED,
|
|
datetime(2025, 2, 18, 14, 15, 0),
|
|
)
|
|
],
|
|
datetime(2025, 2, 18, 12, 0),
|
|
6,
|
|
generate_expected_hourly_output(["2025-02-18T14:00:00Z"]),
|
|
),
|
|
(
|
|
[
|
|
create_mock_notification(
|
|
TemplateType.SMS,
|
|
StatisticsType.REQUESTED,
|
|
datetime(2025, 2, 18, 17, 59, 59),
|
|
)
|
|
],
|
|
datetime(2025, 2, 18, 15, 0),
|
|
3,
|
|
generate_expected_hourly_output(["2025-02-18T17:00:00Z"]),
|
|
),
|
|
([], datetime(2025, 2, 18, 10, 0), 4, {}),
|
|
(
|
|
[
|
|
create_mock_notification(
|
|
TemplateType.SMS,
|
|
StatisticsType.REQUESTED,
|
|
datetime(2025, 2, 18, 9, 30, 0),
|
|
),
|
|
create_mock_notification(
|
|
TemplateType.SMS,
|
|
StatisticsType.REQUESTED,
|
|
datetime(2025, 2, 18, 11, 45, 0),
|
|
),
|
|
],
|
|
datetime(2025, 2, 18, 8, 0),
|
|
5,
|
|
generate_expected_hourly_output(
|
|
["2025-02-18T09:00:00Z", "2025-02-18T11:00:00Z"]
|
|
),
|
|
),
|
|
]
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"mocked_notifications, start_date, hours, expected_output", test_cases
|
|
)
|
|
def test_get_specific_hours(mocked_notifications, start_date, hours, expected_output):
|
|
results = get_specific_hours_stats(mocked_notifications, start_date, hours=hours)
|
|
assert results == expected_output, f"Expected {expected_output}, but got {results}"
|