Files
notifications-api/tests/app/inbound_sms/test_rest.py

310 lines
9.3 KiB
Python
Raw Normal View History

from datetime import datetime, timedelta
import pytest
from freezegun import freeze_time
from app.enums import NotificationType
2017-11-29 14:30:02 +00:00
from tests.app.db import (
2021-03-10 13:55:06 +00:00
create_inbound_sms,
create_service,
create_service_data_retention,
create_service_with_inbound_number,
2017-11-29 14:30:02 +00:00
)
def test_post_to_get_inbound_sms_with_no_params(admin_request, sample_service):
one = create_inbound_sms(sample_service)
two = create_inbound_sms(sample_service)
sms = admin_request.post(
2023-08-29 14:54:30 -07:00
"inbound_sms.post_inbound_sms_for_service",
service_id=sample_service.id,
2023-08-29 14:54:30 -07:00
_data={},
)["data"]
assert len(sms) == 2
2023-08-29 14:54:30 -07:00
assert {inbound["id"] for inbound in sms} == {str(one.id), str(two.id)}
assert sms[0]["content"] == "Hello"
assert set(sms[0].keys()) == {
2023-08-29 14:54:30 -07:00
"id",
"created_at",
"service_id",
"notify_number",
"user_number",
"content",
}
2023-08-29 14:54:30 -07:00
@pytest.mark.parametrize(
"user_number",
[
"(07700) 900-001",
"+4407700900001",
"447700900001",
],
)
@pytest.mark.skip(
reason="Needs updating for TTS. Don't need to test UK numbers right now"
)
def test_post_to_get_inbound_sms_filters_user_number(
admin_request, sample_service, user_number
):
# user_number in the db is international and normalised
2023-08-29 14:54:30 -07:00
one = create_inbound_sms(sample_service, user_number="447700900001")
create_inbound_sms(sample_service, user_number="447700900002")
2023-08-29 14:54:30 -07:00
data = {"phone_number": user_number}
sms = admin_request.post(
2023-08-29 14:54:30 -07:00
"inbound_sms.post_inbound_sms_for_service",
service_id=sample_service.id,
2023-08-29 14:54:30 -07:00
_data=data,
)["data"]
assert len(sms) == 1
2023-08-29 14:54:30 -07:00
assert sms[0]["id"] == str(one.id)
assert sms[0]["user_number"] == str(one.user_number)
2023-08-29 14:54:30 -07:00
def test_post_to_get_inbound_sms_filters_international_user_number(
admin_request, sample_service
):
# user_number in the db is international and normalised
2023-08-29 14:54:30 -07:00
one = create_inbound_sms(sample_service, user_number="12025550104")
create_inbound_sms(sample_service)
2023-08-29 14:54:30 -07:00
data = {"phone_number": "12025550104"}
sms = admin_request.post(
2023-08-29 14:54:30 -07:00
"inbound_sms.post_inbound_sms_for_service",
service_id=sample_service.id,
2023-08-29 14:54:30 -07:00
_data=data,
)["data"]
2022-10-03 20:07:42 -07:00
assert len(sms) == 2
2023-08-29 14:54:30 -07:00
assert sms[1]["id"] == str(one.id)
assert sms[1]["user_number"] == str(one.user_number)
2023-08-29 14:54:30 -07:00
def test_post_to_get_inbound_sms_allows_badly_formatted_number(
admin_request, sample_service
):
one = create_inbound_sms(sample_service, user_number="ALPHANUM3R1C")
sms = admin_request.post(
2023-08-29 14:54:30 -07:00
"inbound_sms.post_inbound_sms_for_service",
service_id=sample_service.id,
2023-08-29 14:54:30 -07:00
_data={"phone_number": "ALPHANUM3R1C"},
)["data"]
assert len(sms) == 1
2023-08-29 14:54:30 -07:00
assert sms[0]["id"] == str(one.id)
assert sms[0]["user_number"] == str(one.user_number)
2023-08-29 14:54:30 -07:00
@freeze_time("Monday 10th April 2017 12:00")
def test_post_to_get_most_recent_inbound_sms_for_service_limits_to_a_week(
admin_request, sample_service
):
create_inbound_sms(sample_service, created_at=datetime(2017, 4, 2, 23, 59))
2023-08-29 14:54:30 -07:00
returned_inbound = create_inbound_sms(
sample_service, created_at=datetime(2017, 4, 3, 0, 30)
)
2023-08-29 14:54:30 -07:00
sms = admin_request.post(
"inbound_sms.post_inbound_sms_for_service",
service_id=sample_service.id,
_data={},
)
2023-08-29 14:54:30 -07:00
assert len(sms["data"]) == 1
assert sms["data"][0]["id"] == str(returned_inbound.id)
2023-08-29 14:54:30 -07:00
@pytest.mark.parametrize(
"days_of_retention, too_old_date, returned_date",
[
(5, datetime(2017, 4, 4, 22, 59), datetime(2017, 4, 5, 12, 0)),
(14, datetime(2017, 3, 26, 22, 59), datetime(2017, 3, 27, 12, 0)),
],
)
@freeze_time("Monday 10th April 2017 12:00")
def test_post_to_get_inbound_sms_for_service_respects_data_retention(
2023-08-29 14:54:30 -07:00
admin_request, sample_service, days_of_retention, too_old_date, returned_date
):
create_service_data_retention(
sample_service,
NotificationType.SMS,
days_of_retention,
)
create_inbound_sms(sample_service, created_at=too_old_date)
returned_inbound = create_inbound_sms(sample_service, created_at=returned_date)
2023-08-29 14:54:30 -07:00
sms = admin_request.post(
"inbound_sms.post_inbound_sms_for_service",
service_id=sample_service.id,
_data={},
)
2023-08-29 14:54:30 -07:00
assert len(sms["data"]) == 1
assert sms["data"][0]["id"] == str(returned_inbound.id)
def test_get_inbound_sms_summary(admin_request, sample_service):
2023-08-29 14:54:30 -07:00
other_service = create_service(service_name="other_service")
with freeze_time("2017-01-01"):
create_inbound_sms(sample_service)
2023-08-29 14:54:30 -07:00
with freeze_time("2017-01-02"):
create_inbound_sms(sample_service)
2023-08-29 14:54:30 -07:00
with freeze_time("2017-01-03"):
create_inbound_sms(other_service)
summary = admin_request.get(
2023-08-29 14:54:30 -07:00
"inbound_sms.get_inbound_sms_summary_for_service",
service_id=sample_service.id,
)
2023-08-29 14:54:30 -07:00
assert summary == {"count": 2, "most_recent": datetime(2017, 1, 2).isoformat()}
def test_get_inbound_sms_summary_with_no_inbound(admin_request, sample_service):
summary = admin_request.get(
2023-08-29 14:54:30 -07:00
"inbound_sms.get_inbound_sms_summary_for_service", service_id=sample_service.id
)
2023-08-29 14:54:30 -07:00
assert summary == {"count": 0, "most_recent": None}
2017-06-06 17:12:21 +01:00
def test_get_inbound_sms_by_id_returns_200(admin_request, notify_db_session):
2023-08-29 14:54:30 -07:00
service = create_service_with_inbound_number(inbound_number="12345")
inbound = create_inbound_sms(service=service, user_number="447700900001")
2017-06-06 17:12:21 +01:00
response = admin_request.get(
2023-08-29 14:54:30 -07:00
"inbound_sms.get_inbound_by_id",
service_id=service.id,
inbound_sms_id=inbound.id,
2017-06-06 17:12:21 +01:00
)
2023-08-29 14:54:30 -07:00
assert response["user_number"] == "447700900001"
assert response["service_id"] == str(service.id)
2017-06-06 17:12:21 +01:00
def test_get_inbound_sms_by_id_invalid_id_returns_404(admin_request, sample_service):
2017-06-06 17:12:21 +01:00
assert admin_request.get(
2023-08-29 14:54:30 -07:00
"inbound_sms.get_inbound_by_id",
service_id=sample_service.id,
2023-08-29 14:54:30 -07:00
inbound_sms_id="bar",
_expected_status=404,
)
2023-08-29 14:54:30 -07:00
def test_get_inbound_sms_by_id_with_invalid_service_id_returns_404(
admin_request, sample_service
):
assert admin_request.get(
2023-08-29 14:54:30 -07:00
"inbound_sms.get_inbound_by_id",
service_id="foo",
inbound_sms_id="2cfbd6a1-1575-4664-8969-f27be0ea40d9",
_expected_status=404,
2017-06-06 17:12:21 +01:00
)
2018-04-04 16:59:48 +01:00
2023-08-29 14:54:30 -07:00
@pytest.mark.parametrize(
"page_given, expected_rows, has_next_link",
[(True, 10, False), (False, 50, True)],
2023-08-29 14:54:30 -07:00
)
2018-04-04 16:59:48 +01:00
def test_get_most_recent_inbound_sms_for_service(
admin_request,
page_given,
sample_service,
expected_rows,
has_next_link,
2018-04-04 16:59:48 +01:00
):
for i in range(60):
2023-08-29 14:54:30 -07:00
create_inbound_sms(
service=sample_service, user_number="44770090000{}".format(i)
)
2018-04-04 16:59:48 +01:00
2023-08-29 14:54:30 -07:00
request_args = {"page": 2} if page_given else {}
2018-04-04 16:59:48 +01:00
response = admin_request.get(
2023-08-29 14:54:30 -07:00
"inbound_sms.get_most_recent_inbound_sms_for_service",
2018-04-04 16:59:48 +01:00
service_id=sample_service.id,
**request_args
)
2023-08-29 14:54:30 -07:00
assert len(response["data"]) == expected_rows
assert response["has_next"] == has_next_link
2023-08-29 14:54:30 -07:00
@freeze_time("Monday 10th April 2017 12:00")
def test_get_most_recent_inbound_sms_for_service_respects_data_retention(
admin_request,
sample_service,
):
create_service_data_retention(sample_service, NotificationType.SMS, 5)
for i in range(10):
created = datetime.utcnow() - timedelta(days=i)
2023-08-29 14:54:30 -07:00
create_inbound_sms(
sample_service,
user_number="44770090000{}".format(i),
created_at=created,
2023-08-29 14:54:30 -07:00
)
response = admin_request.get(
"inbound_sms.get_most_recent_inbound_sms_for_service",
service_id=sample_service.id,
)
assert len(response["data"]) == 6
assert [x["created_at"] for x in response["data"]] == [
"2017-04-10T12:00:00.000000Z",
"2017-04-09T12:00:00.000000Z",
"2017-04-08T12:00:00.000000Z",
"2017-04-07T12:00:00.000000Z",
"2017-04-06T12:00:00.000000Z",
"2017-04-05T12:00:00.000000Z",
]
2023-08-29 14:54:30 -07:00
@freeze_time("Monday 10th April 2017 12:00")
def test_get_most_recent_inbound_sms_for_service_respects_data_retention_if_older_than_a_week(
2023-08-29 14:54:30 -07:00
admin_request, sample_service
):
create_service_data_retention(sample_service, NotificationType.SMS, 14)
create_inbound_sms(sample_service, created_at=datetime(2017, 4, 1, 12, 0))
2023-08-29 14:54:30 -07:00
response = admin_request.get(
"inbound_sms.get_most_recent_inbound_sms_for_service",
service_id=sample_service.id,
)
2023-08-29 14:54:30 -07:00
assert len(response["data"]) == 1
assert response["data"][0]["created_at"] == "2017-04-01T12:00:00.000000Z"
2023-08-29 14:54:30 -07:00
@freeze_time("Monday 10th April 2017 12:00")
def test_get_inbound_sms_for_service_respects_data_retention(
2023-08-29 14:54:30 -07:00
admin_request, sample_service
):
create_service_data_retention(sample_service, NotificationType.SMS, 5)
for i in range(10):
created = datetime.utcnow() - timedelta(days=i)
2023-08-29 14:54:30 -07:00
create_inbound_sms(
sample_service, user_number="44770090000{}".format(i), created_at=created
)
response = admin_request.get(
"inbound_sms.get_most_recent_inbound_sms_for_service",
service_id=sample_service.id,
)
assert len(response["data"]) == 6
assert [x["created_at"] for x in response["data"]] == [
"2017-04-10T12:00:00.000000Z",
"2017-04-09T12:00:00.000000Z",
"2017-04-08T12:00:00.000000Z",
"2017-04-07T12:00:00.000000Z",
"2017-04-06T12:00:00.000000Z",
"2017-04-05T12:00:00.000000Z",
]