Skip to content

Commit

Permalink
Task: Filter Heartbeats (#2108)
Browse files Browse the repository at this point in the history
* Add filter for heartbeat template

* fix formatting

* Edit and add a test

* test for rest endpoint

* Add filter heartbeats for live service data
  • Loading branch information
jzbahrai authored Feb 20, 2024
1 parent 2e26af0 commit 5bcdb72
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 10 deletions.
15 changes: 12 additions & 3 deletions app/dao/fact_notification_status_dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ def fetch_notification_status_for_service_by_month(start_date, end_date, service
)


def fetch_delivered_notification_stats_by_month():
return (
def fetch_delivered_notification_stats_by_month(filter_heartbeats=None):
query = (
db.session.query(
func.date_trunc("month", FactNotificationStatus.bst_date).cast(db.Text).label("month"),
FactNotificationStatus.notification_type,
Expand All @@ -169,8 +169,17 @@ def fetch_delivered_notification_stats_by_month():
func.date_trunc("month", FactNotificationStatus.bst_date).desc(),
FactNotificationStatus.notification_type,
)
.all()
)
if filter_heartbeats:
query = query.filter(
FactNotificationStatus.template_id != current_app.config["HEARTBEAT_TEMPLATE_EMAIL_LOW"],
FactNotificationStatus.template_id != current_app.config["HEARTBEAT_TEMPLATE_EMAIL_MEDIUM"],
FactNotificationStatus.template_id != current_app.config["HEARTBEAT_TEMPLATE_EMAIL_HIGH"],
FactNotificationStatus.template_id != current_app.config["HEARTBEAT_TEMPLATE_SMS_LOW"],
FactNotificationStatus.template_id != current_app.config["HEARTBEAT_TEMPLATE_SMS_MEDIUM"],
FactNotificationStatus.template_id != current_app.config["HEARTBEAT_TEMPLATE_SMS_HIGH"],
)
return query.all()


def fetch_notification_stats_for_trial_services():
Expand Down
13 changes: 11 additions & 2 deletions app/dao/services_dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def dao_count_live_services():
).count()


def dao_fetch_live_services_data():
def dao_fetch_live_services_data(filter_heartbeats=None):
year_start_date, year_end_date = get_current_financial_year()

most_recent_annual_billing = (
Expand Down Expand Up @@ -175,8 +175,17 @@ def dao_fetch_live_services_data():
AnnualBilling.free_sms_fragment_limit,
)
.order_by(asc(Service.go_live_at))
.all()
)
if filter_heartbeats:
data = data.join(Template, Service.id == Template.service_id).filter(
Template.id != current_app.config["HEARTBEAT_TEMPLATE_EMAIL_LOW"],
Template.id != current_app.config["HEARTBEAT_TEMPLATE_EMAIL_MEDIUM"],
Template.id != current_app.config["HEARTBEAT_TEMPLATE_EMAIL_HIGH"],
Template.id != current_app.config["HEARTBEAT_TEMPLATE_SMS_LOW"],
Template.id != current_app.config["HEARTBEAT_TEMPLATE_SMS_MEDIUM"],
Template.id != current_app.config["HEARTBEAT_TEMPLATE_SMS_HIGH"],
)
data = data.all()
results = []
for row in data:
existing_service = next((x for x in results if x["service_id"] == row.service_id), None)
Expand Down
6 changes: 4 additions & 2 deletions app/service/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,13 +209,15 @@ def find_services_by_name():

@service_blueprint.route("/live-services-data", methods=["GET"])
def get_live_services_data():
data = dao_fetch_live_services_data()
filter_heartbeats = request.args.get("filter_heartbeats", None) == "True"
data = dao_fetch_live_services_data(filter_heartbeats=filter_heartbeats)
return jsonify(data=data)


@service_blueprint.route("/delivered-notifications-stats-by-month-data", methods=["GET"])
def get_delivered_notification_stats_by_month_data():
return jsonify(data=fetch_delivered_notification_stats_by_month())
filter_heartbeats = request.args.get("filter_heartbeats", None) == "True"
return jsonify(data=fetch_delivered_notification_stats_by_month(filter_heartbeats=filter_heartbeats))


@service_blueprint.route("/<uuid:service_id>", methods=["GET"])
Expand Down
57 changes: 57 additions & 0 deletions tests/app/dao/test_fact_notification_status_dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
create_template,
save_notification,
)
from tests.conftest import set_config


def test_update_fact_notification_status(notify_db_session):
Expand Down Expand Up @@ -728,6 +729,62 @@ def test_fetch_delivered_notification_stats_by_month(sample_service):
assert results[3].count == 6


@freeze_time("2020-11-02 14:00")
def test_fetch_delivered_notification_stats_by_month_filter_heartbeats(notify_api, sample_service):
sms_template = create_template(service=sample_service, template_type="sms", template_name="a")
email_template = create_template(service=sample_service, template_type="email", template_name="b")

# Not counted: before GC Notify started
create_ft_notification_status(
utc_date=date(2019, 10, 10),
service=sample_service,
template=email_template,
count=3,
)

create_ft_notification_status(
utc_date=date(2019, 12, 10),
service=sample_service,
template=email_template,
count=3,
)

create_ft_notification_status(
utc_date=date(2019, 12, 5),
service=sample_service,
template=sms_template,
notification_status=NOTIFICATION_DELIVERED,
count=6,
)

create_ft_notification_status(
utc_date=date(2020, 1, 1),
service=sample_service,
template=sms_template,
notification_status=NOTIFICATION_SENT,
count=4,
)

# Not counted: failed notifications
create_ft_notification_status(
utc_date=date(2020, 1, 1),
service=sample_service,
template=sms_template,
notification_status=NOTIFICATION_FAILED,
count=10,
)

create_ft_notification_status(
utc_date=date(2020, 3, 1),
service=sample_service,
template=email_template,
count=5,
)
with set_config(notify_api, "HEARTBEAT_TEMPLATE_EMAIL_LOW", email_template.id):
results = fetch_delivered_notification_stats_by_month(filter_heartbeats=True)
assert len(results) == 2


def test_fetch_delivered_notification_stats_by_month_empty():
assert fetch_delivered_notification_stats_by_month() == []

Expand Down
12 changes: 9 additions & 3 deletions tests/app/dao/test_services_dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
create_user,
save_notification,
)
from tests.conftest import set_config

# from unittest import mock

Expand Down Expand Up @@ -493,7 +494,8 @@ def test_get_all_user_services_should_return_empty_list_if_no_services_for_user(


@freeze_time("2019-04-23T10:00:00")
def test_dao_fetch_live_services_data(sample_user):
@pytest.mark.parametrize("filter_heartbeats", [True, False])
def test_dao_fetch_live_services_data_filter_heartbeats(notify_api, sample_user, filter_heartbeats):
org = create_organisation(organisation_type="nhs_central")
service = create_service(go_live_user=sample_user, go_live_at="2014-04-20T10:00:00")
template = create_template(service=service)
Expand Down Expand Up @@ -561,8 +563,12 @@ def test_dao_fetch_live_services_data(sample_user):
# 3rd service: billing from 2019
create_annual_billing(service_3.id, 200, 2019)

results = dao_fetch_live_services_data()
assert len(results) == 3
with set_config(notify_api, "HEARTBEAT_TEMPLATE_EMAIL_LOW", template.id):
results = dao_fetch_live_services_data(filter_heartbeats=filter_heartbeats)
if not filter_heartbeats:
assert len(results) == 3
else:
assert len(results) == 2
# checks the results and that they are ordered by date:
# @todo: this test is temporarily forced to pass until we can add the fiscal year back into
# the query and create a new endpoint for the homepage stats
Expand Down
15 changes: 15 additions & 0 deletions tests/app/service/test_rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
create_user,
save_notification,
)
from tests.conftest import set_config


def test_get_service_list(client, service_factory):
Expand Down Expand Up @@ -253,6 +254,20 @@ def test_get_delivered_notification_stats_by_month_data(admin_request, sample_se
assert first["count"] == 3


def test_get_delivered_notification_stats_by_month_data_without_heartbeat(notify_api, admin_request, sample_service):
email_template = create_template(service=sample_service, template_type="email", template_name="b")

create_ft_notification_status(
utc_date=date(2019, 12, 10),
service=sample_service,
template=email_template,
count=3,
)
with set_config(notify_api, "HEARTBEAT_TEMPLATE_EMAIL_LOW", email_template.id):
response = admin_request.get("service.get_delivered_notification_stats_by_month_data", filter_heartbeats=True)["data"]
assert len(response) == 0


def test_get_service_by_id(admin_request, sample_service):
json_resp = admin_request.get("service.get_service_by_id", service_id=sample_service.id)
assert json_resp["data"]["name"] == sample_service.name
Expand Down

0 comments on commit 5bcdb72

Please sign in to comment.