Merge pull request #1377 from alphagov/rc-monthly-template-usage

Added scheduled task to get stats for template usage
This commit is contained in:
Richard Chapman
2017-11-09 16:28:30 +00:00
committed by GitHub
11 changed files with 336 additions and 6 deletions

View File

@@ -2,11 +2,13 @@ from datetime import datetime, timedelta
from functools import partial
from unittest.mock import call, patch, PropertyMock
import functools
from flask import current_app
import pytest
from freezegun import freeze_time
from app import db
from app.celery import scheduled_tasks
from app.celery.scheduled_tasks import (
check_job_status,
@@ -30,7 +32,8 @@ from app.celery.scheduled_tasks import (
send_total_sent_notifications_to_performance_platform,
switch_current_sms_provider_on_slow_delivery,
timeout_job_statistics,
timeout_notifications
timeout_notifications,
daily_stats_template_usage_by_month
)
from app.clients.performance_platform.performance_platform_client import PerformancePlatformClient
from app.config import QueueNames, TaskNames
@@ -49,14 +52,16 @@ from app.models import (
NOTIFICATION_PENDING,
NOTIFICATION_CREATED,
KEY_TYPE_TEST,
MonthlyBilling
)
MonthlyBilling,
StatsTemplateUsageByMonth)
from app.utils import get_london_midnight_in_utc
from app.v2.errors import JobIncompleteError
from tests.app.db import create_notification, create_service, create_template, create_job, create_rate
from tests.app.conftest import (
sample_job as create_sample_job,
sample_notification_history as create_notification_history,
sample_template as create_sample_template,
create_custom_template,
datetime_in_past
)
@@ -834,3 +839,107 @@ def test_check_job_status_task_raises_job_incomplete_error_for_multiple_jobs(moc
args=([str(job.id), str(job_2.id)],),
queue=QueueNames.JOBS
)
def test_daily_stats_template_usage_by_month(notify_db, notify_db_session):
notification_history = functools.partial(
create_notification_history,
notify_db,
notify_db_session,
status='delivered'
)
template_one = create_sample_template(notify_db, notify_db_session)
template_two = create_sample_template(notify_db, notify_db_session)
notification_history(created_at=datetime(2017, 10, 1), sample_template=template_one)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime.now(), sample_template=template_two)
daily_stats_template_usage_by_month()
result = db.session.query(
StatsTemplateUsageByMonth
).order_by(
StatsTemplateUsageByMonth.year,
StatsTemplateUsageByMonth.month
).all()
assert len(result) == 2
assert result[0].template_id == template_two.id
assert result[0].month == 4
assert result[0].year == 2016
assert result[0].count == 2
assert result[1].template_id == template_one.id
assert result[1].month == 10
assert result[1].year == 2017
assert result[1].count == 1
def test_daily_stats_template_usage_by_month_no_data():
daily_stats_template_usage_by_month()
results = db.session.query(StatsTemplateUsageByMonth).all()
assert len(results) == 0
def test_daily_stats_template_usage_by_month_multiple_runs(notify_db, notify_db_session):
notification_history = functools.partial(
create_notification_history,
notify_db,
notify_db_session,
status='delivered'
)
template_one = create_sample_template(notify_db, notify_db_session)
template_two = create_sample_template(notify_db, notify_db_session)
notification_history(created_at=datetime(2017, 11, 1), sample_template=template_one)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime.now(), sample_template=template_two)
daily_stats_template_usage_by_month()
template_three = create_sample_template(notify_db, notify_db_session)
notification_history(created_at=datetime(2017, 10, 1), sample_template=template_three)
notification_history(created_at=datetime(2017, 9, 1), sample_template=template_three)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime.now(), sample_template=template_two)
daily_stats_template_usage_by_month()
result = db.session.query(
StatsTemplateUsageByMonth
).order_by(
StatsTemplateUsageByMonth.year,
StatsTemplateUsageByMonth.month
).all()
assert len(result) == 4
assert result[0].template_id == template_two.id
assert result[0].month == 4
assert result[0].year == 2016
assert result[0].count == 4
assert result[1].template_id == template_three.id
assert result[1].month == 9
assert result[1].year == 2017
assert result[1].count == 1
assert result[2].template_id == template_three.id
assert result[2].month == 10
assert result[2].year == 2017
assert result[2].count == 1
assert result[3].template_id == template_one.id
assert result[3].month == 11
assert result[3].year == 2017
assert result[3].count == 1

View File

@@ -30,7 +30,8 @@ from app.dao.services_dao import (
dao_suspend_service,
dao_resume_service,
dao_fetch_active_users_for_service,
dao_fetch_service_by_inbound_number
dao_fetch_service_by_inbound_number,
dao_fetch_monthly_historical_stats_by_template
)
from app.dao.service_permissions_dao import dao_add_service_permission, dao_remove_service_permission
from app.dao.users_dao import save_model_user
@@ -1004,3 +1005,34 @@ def _assert_service_permissions(service_permissions, expected):
assert len(service_permissions) == len(expected)
assert set(expected) == set(p.permission for p in service_permissions)
def test_dao_fetch_monthly_historical_stats_by_template(notify_db, notify_db_session):
notification_history = functools.partial(
create_notification_history,
notify_db,
notify_db_session,
status='delivered'
)
template_one = create_sample_template(notify_db, notify_db_session, template_name='1')
template_two = create_sample_template(notify_db, notify_db_session, template_name='2')
notification_history(created_at=datetime(2017, 10, 1), sample_template=template_one)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime(2016, 4, 1), sample_template=template_two)
notification_history(created_at=datetime.now(), sample_template=template_two)
result = sorted(dao_fetch_monthly_historical_stats_by_template(), key=lambda x: (x.month, x.year))
assert len(result) == 2
assert result[0].template_id == template_two.id
assert result[0].month == 4
assert result[0].year == 2016
assert result[0].count == 2
assert result[1].template_id == template_one.id
assert result[1].month == 10
assert result[1].year == 2017
assert result[1].count == 1

View File

@@ -0,0 +1,45 @@
import pytest
from app.dao.stats_template_usage_by_month_dao import insert_or_update_stats_for_template
from app.models import StatsTemplateUsageByMonth
from tests.app.conftest import sample_notification, sample_email_template, sample_template, sample_job, sample_service
def test_create_stats_for_template(notify_db_session, sample_template):
assert StatsTemplateUsageByMonth.query.count() == 0
insert_or_update_stats_for_template(sample_template.id, 1, 2017, 10)
stats_by_month = StatsTemplateUsageByMonth.query.filter(
StatsTemplateUsageByMonth.template_id == sample_template.id
).all()
assert len(stats_by_month) == 1
assert stats_by_month[0].template_id == sample_template.id
assert stats_by_month[0].month == 1
assert stats_by_month[0].year == 2017
assert stats_by_month[0].count == 10
def test_update_stats_for_template(notify_db_session, sample_template):
assert StatsTemplateUsageByMonth.query.count() == 0
insert_or_update_stats_for_template(sample_template.id, 1, 2017, 10)
insert_or_update_stats_for_template(sample_template.id, 1, 2017, 20)
insert_or_update_stats_for_template(sample_template.id, 2, 2017, 30)
stats_by_month = StatsTemplateUsageByMonth.query.filter(
StatsTemplateUsageByMonth.template_id == sample_template.id
).order_by(StatsTemplateUsageByMonth.template_id).all()
assert len(stats_by_month) == 2
assert stats_by_month[0].template_id == sample_template.id
assert stats_by_month[0].month == 1
assert stats_by_month[0].year == 2017
assert stats_by_month[0].count == 20
assert stats_by_month[1].template_id == sample_template.id
assert stats_by_month[1].month == 2
assert stats_by_month[1].year == 2017
assert stats_by_month[1].count == 30