Merge pull request #1248 from GSA/notify-apy-283

Need to remove priority logic
This commit is contained in:
Cliff Hill
2024-08-16 12:36:55 -04:00
committed by GitHub
14 changed files with 36 additions and 214 deletions

View File

@@ -2,11 +2,9 @@ from datetime import datetime, timedelta
import pytest
from freezegun import freeze_time
from sqlalchemy.sql import desc
from app import notification_provider_clients
from app.dao.provider_details_dao import (
_adjust_provider_priority,
_get_sms_providers_for_update,
dao_get_provider_stats,
dao_update_provider_details,
@@ -16,7 +14,6 @@ from app.dao.provider_details_dao import (
)
from app.enums import NotificationType, TemplateType
from app.models import ProviderDetails, ProviderDetailsHistory
from app.utils import utc_now
from tests.app.db import create_ft_billing, create_service, create_template
from tests.conftest import set_config
@@ -33,9 +30,6 @@ def set_primary_sms_provider(identifier):
get_alternative_sms_provider(identifier)
)
primary_provider.priority = 10
secondary_provider.priority = 20
dao_update_provider_details(primary_provider)
dao_update_provider_details(secondary_provider)
@@ -55,18 +49,6 @@ def test_can_get_sms_international_providers(notify_db_session):
assert all(prov.supports_international for prov in sms_providers)
def test_can_get_sms_providers_in_order_of_priority(notify_db_session):
providers = get_provider_details_by_notification_type(NotificationType.SMS, False)
priorities = [provider.priority for provider in providers]
assert priorities == sorted(priorities)
def test_can_get_email_providers_in_order_of_priority(notify_db_session):
providers = get_provider_details_by_notification_type(NotificationType.EMAIL)
assert providers[0].identifier == "ses"
def test_can_get_email_providers(notify_db_session):
assert len(get_provider_details_by_notification_type(NotificationType.EMAIL)) == 1
types = [
@@ -146,61 +128,6 @@ def test_get_alternative_sms_provider_fails_if_unrecognised():
get_alternative_sms_provider("ses")
@freeze_time("2016-01-01 00:30")
def test_adjust_provider_priority_sets_priority(
restore_provider_details,
notify_user,
sns_provider,
):
# need to update these manually to avoid triggering the `onupdate` clause of the updated_at column
ProviderDetails.query.filter(ProviderDetails.identifier == "sns").update(
{"updated_at": datetime.min}
)
_adjust_provider_priority(sns_provider, 50)
assert sns_provider.updated_at == utc_now()
assert sns_provider.created_by.id == notify_user.id
assert sns_provider.priority == 50
@freeze_time("2016-01-01 00:30")
def test_adjust_provider_priority_adds_history(
restore_provider_details,
notify_user,
sns_provider,
):
# need to update these manually to avoid triggering the `onupdate` clause of the updated_at column
ProviderDetails.query.filter(ProviderDetails.identifier == "sns").update(
{"updated_at": datetime.min}
)
old_provider_history_rows = (
ProviderDetailsHistory.query.filter(
ProviderDetailsHistory.id == sns_provider.id
)
.order_by(desc(ProviderDetailsHistory.version))
.all()
)
_adjust_provider_priority(sns_provider, 50)
updated_provider_history_rows = (
ProviderDetailsHistory.query.filter(
ProviderDetailsHistory.id == sns_provider.id
)
.order_by(desc(ProviderDetailsHistory.version))
.all()
)
assert len(updated_provider_history_rows) - len(old_provider_history_rows) == 1
assert (
updated_provider_history_rows[0].version - old_provider_history_rows[0].version
== 1
)
assert updated_provider_history_rows[0].priority == 50
@freeze_time("2016-01-01 01:00")
def test_get_sms_providers_for_update_returns_providers(restore_provider_details):
ProviderDetails.query.filter(ProviderDetails.identifier == "sns").update(

View File

@@ -42,7 +42,6 @@ def test_get_provider_contains_correct_fields(client, sample_template):
"created_by_name",
"display_name",
"identifier",
"priority",
"notification_type",
"active",
"updated_at",
@@ -53,24 +52,6 @@ def test_get_provider_contains_correct_fields(client, sample_template):
assert allowed_keys == set(json_resp[0].keys())
def test_should_be_able_to_update_priority(client, restore_provider_details):
provider = ProviderDetails.query.first()
update_resp = client.post(
"/provider-details/{}".format(provider.id),
headers=[
("Content-Type", "application/json"),
create_admin_authorization_header(),
],
data=json.dumps({"priority": 5}),
)
assert update_resp.status_code == 200
update_json = json.loads(update_resp.get_data(as_text=True))["provider_details"]
assert update_json["identifier"] == provider.identifier
assert update_json["priority"] == 5
assert provider.priority == 5
def test_should_be_able_to_update_status(client, restore_provider_details):
provider = ProviderDetails.query.first()
@@ -124,7 +105,6 @@ def test_get_provider_versions_contains_correct_fields(client, notify_db_session
"created_by",
"display_name",
"identifier",
"priority",
"notification_type",
"active",
"version",

View File

@@ -11,7 +11,7 @@ from app.dao import notifications_dao
from app.dao.api_key_dao import save_model_api_key
from app.dao.services_dao import dao_update_service
from app.dao.templates_dao import dao_get_all_templates_for_service, dao_update_template
from app.enums import KeyType, NotificationType, TemplateProcessType, TemplateType
from app.enums import KeyType, NotificationType, TemplateType
from app.errors import InvalidRequest, RateLimitError
from app.models import ApiKey, Notification, NotificationHistory, Template
from app.service.send_notification import send_one_off_notification
@@ -1113,49 +1113,6 @@ def test_create_template_raises_invalid_request_when_content_too_large(
}
@pytest.mark.parametrize(
"notification_type,send_to",
[
(NotificationType.SMS, "2028675309"),
(
NotificationType.EMAIL,
"sample@email.com",
),
],
)
def test_send_notification_uses_priority_queue_when_template_is_marked_as_priority(
client,
sample_service,
mocker,
notification_type,
send_to,
):
sample = create_template(
sample_service,
template_type=notification_type,
process_type=TemplateProcessType.PRIORITY,
)
mocked = mocker.patch(
f"app.celery.provider_tasks.deliver_{notification_type}.apply_async"
)
data = {"to": send_to, "template": str(sample.id)}
auth_header = create_service_authorization_header(service_id=sample.service_id)
response = client.post(
path=f"/notifications/{notification_type}",
data=json.dumps(data),
headers=[("Content-Type", "application/json"), auth_header],
)
response_data = json.loads(response.data)["data"]
notification_id = response_data["notification"]["id"]
assert response.status_code == 201
mocked.assert_called_once_with([notification_id], queue="priority-tasks")
@pytest.mark.parametrize(
"notification_type, send_to",
[

View File

@@ -3,14 +3,12 @@ from unittest.mock import Mock
import pytest
from app.config import QueueNames
from app.dao.service_guest_list_dao import dao_add_and_commit_guest_list_contacts
from app.enums import (
KeyType,
NotificationType,
RecipientType,
ServicePermissionType,
TemplateProcessType,
TemplateType,
)
from app.errors import BadRequestError
@@ -161,24 +159,6 @@ def test_send_one_off_notification_calls_persist_correctly_for_email(
)
def test_send_one_off_notification_honors_priority(
notify_db_session, persist_mock, celery_mock
):
service = create_service()
template = create_template(service=service)
template.process_type = TemplateProcessType.PRIORITY
post_data = {
"template_id": str(template.id),
"to": "202-867-5309",
"created_by": str(service.created_by_id),
}
send_one_off_notification(service.id, post_data)
assert celery_mock.call_args[1]["queue"] == QueueNames.PRIORITY
def test_send_one_off_notification_raises_if_invalid_recipient(notify_db_session):
service = create_service()
template = create_template(service=service)

View File

@@ -4,10 +4,9 @@ from app.config import QueueNames
def test_queue_names_all_queues_correct():
# Need to ensure that all_queues() only returns queue names used in API
queues = QueueNames.all_queues()
assert len(queues) == 15
assert len(queues) == 14
assert set(
[
QueueNames.PRIORITY,
QueueNames.PERIODIC,
QueueNames.DATABASE,
QueueNames.SEND_SMS,

View File

@@ -8,7 +8,6 @@ from flask import Flask
from sqlalchemy_utils import create_database, database_exists, drop_database
from app import create_app
from app.dao.provider_details_dao import get_provider_details_by_identifier
@pytest.fixture(scope="session")
@@ -80,12 +79,8 @@ def _notify_db(notify_api):
@pytest.fixture(scope="function")
def sms_providers(_notify_db):
"""
In production we randomly choose which provider to use based on their priority. To guarantee tests run the same each
time, make sure we always choose sns. You'll need to override them in your tests if you wish to do something
different.
"""
get_provider_details_by_identifier("sns").priority = 100
pass
# get_provider_details_by_identifier("sns").priority = 100
@pytest.fixture(scope="function")