Merge pull request #3528 from alphagov/tidy-up-usage-tests-181934027

Minor refactorings to usage API tests
This commit is contained in:
Ben Thorner
2022-05-04 10:31:09 +01:00
committed by GitHub
2 changed files with 89 additions and 155 deletions

View File

@@ -1,15 +1,11 @@
from calendar import monthrange
from datetime import datetime
from datetime import date, datetime
import pytest
from freezegun import freeze_time
from app.billing.rest import update_free_sms_fragment_limit_data
from app.dao.annual_billing_dao import dao_get_free_sms_fragment_limit_for_year
from app.dao.date_util import (
get_current_financial_year_start_year,
get_month_start_and_end_date_in_utc,
)
from app.dao.date_util import get_current_financial_year_start_year
from tests.app.db import (
create_annual_billing,
create_ft_billing,
@@ -125,35 +121,18 @@ def test_update_free_sms_fragment_limit_data(client, sample_service):
assert annual_billing.free_sms_fragment_limit == 9999
def set_up_monthly_data():
def test_get_yearly_usage_by_monthly_from_ft_billing(admin_request, notify_db_session):
service = create_service()
create_annual_billing(service_id=service.id, free_sms_fragment_limit=1, financial_year_start=2016)
sms_template = create_template(service=service, template_type="sms")
email_template = create_template(service=service, template_type="email")
letter_template = create_template(service=service, template_type="letter")
for month in range(1, 13):
mon = str(month).zfill(2)
for day in range(1, monthrange(2016, month)[1] + 1):
d = str(day).zfill(2)
create_ft_billing(bst_date='2016-{}-{}'.format(mon, d),
template=sms_template,
billable_unit=1,
rate=0.162)
create_ft_billing(bst_date='2016-{}-{}'.format(mon, d),
template=email_template,
rate=0)
create_ft_billing(bst_date='2016-{}-{}'.format(mon, d),
template=letter_template,
billable_unit=1,
rate=0.33,
postage='second')
create_annual_billing(service_id=service.id, free_sms_fragment_limit=4, financial_year_start=2016)
return service
def test_get_yearly_usage_by_monthly_from_ft_billing(admin_request, notify_db_session):
service = set_up_monthly_data()
for dt in (date(2016, 4, 28), date(2016, 11, 10), date(2017, 2, 26)):
create_ft_billing(bst_date=dt, template=sms_template, rate=0.0162)
create_ft_billing(bst_date=dt, template=email_template, billable_unit=0, rate=0)
create_ft_billing(bst_date=dt, template=letter_template, rate=0.33, postage='second')
json_response = admin_request.get(
'billing.get_yearly_usage_by_monthly_from_ft_billing',
@@ -161,7 +140,7 @@ def test_get_yearly_usage_by_monthly_from_ft_billing(admin_request, notify_db_se
year=2016
)
assert len(json_response) == 18
assert len(json_response) == 6 # 3 billed months for SMS and letters
email_rows = [row for row in json_response if row['notification_type'] == 'email']
assert len(email_rows) == 0
@@ -171,57 +150,26 @@ def test_get_yearly_usage_by_monthly_from_ft_billing(admin_request, notify_db_se
assert letter_row["month"] == "April"
assert letter_row["notification_type"] == "letter"
assert letter_row["billing_units"] == 30
assert letter_row["chargeable_units"] == 30
assert letter_row["notifications_sent"] == 30
assert letter_row["billing_units"] == 1
assert letter_row["chargeable_units"] == 1
assert letter_row["notifications_sent"] == 1
assert letter_row["rate"] == 0.33
assert letter_row["postage"] == "second"
assert letter_row["cost"] == 9.9
assert letter_row["cost"] == 0.33
assert letter_row["free_allowance_used"] == 0
assert letter_row["charged_units"] == 30
assert letter_row["charged_units"] == 1
assert sms_row["month"] == "April"
assert sms_row["notification_type"] == "sms"
assert sms_row["billing_units"] == 30
assert sms_row["chargeable_units"] == 30
assert sms_row["notifications_sent"] == 30
assert sms_row["rate"] == 0.162
assert sms_row["billing_units"] == 1
assert sms_row["chargeable_units"] == 1
assert sms_row["notifications_sent"] == 1
assert sms_row["rate"] == 0.0162
assert sms_row["postage"] == "none"
# free allowance is 4, so (30 - 4) * 0.162
assert sms_row["cost"] == 4.212
assert sms_row["free_allowance_used"] == 4
assert sms_row["charged_units"] == 26
def set_up_yearly_data():
service = create_service()
sms_template = create_template(service=service, template_type="sms")
email_template = create_template(service=service, template_type="email")
letter_template = create_template(service=service, template_type="letter")
for month in range(1, 13):
mon = str(month).zfill(2)
for day in range(1, monthrange(2016, month)[1] + 1):
d = str(day).zfill(2)
create_ft_billing(bst_date='2016-{}-{}'.format(mon, d),
template=sms_template,
rate=0.0162)
create_ft_billing(bst_date='2016-{}-{}'.format(mon, d),
template=sms_template,
rate_multiplier=2,
rate=0.0162)
create_ft_billing(bst_date='2016-{}-{}'.format(mon, d),
template=email_template,
billable_unit=0,
rate=0)
create_ft_billing(bst_date='2016-{}-{}'.format(mon, d),
template=letter_template,
rate=0.33,
postage='second')
start_date, end_date = get_month_start_and_end_date_in_utc(datetime(2016, int(mon), 1))
create_annual_billing(service_id=service.id, free_sms_fragment_limit=4, financial_year_start=2016)
return service
# free allowance is 1
assert sms_row["cost"] == 0
assert sms_row["free_allowance_used"] == 1
assert sms_row["charged_units"] == 0
def test_get_yearly_billing_usage_summary_from_ft_billing_returns_400_if_missing_year(admin_request, sample_service):
@@ -247,7 +195,17 @@ def test_get_yearly_billing_usage_summary_from_ft_billing_returns_empty_list_if_
def test_get_yearly_billing_usage_summary_from_ft_billing(admin_request, notify_db_session):
service = set_up_yearly_data()
service = create_service()
create_annual_billing(service_id=service.id, free_sms_fragment_limit=1, financial_year_start=2016)
sms_template = create_template(service=service, template_type="sms")
email_template = create_template(service=service, template_type="email")
letter_template = create_template(service=service, template_type="letter")
for dt in (date(2016, 4, 28), date(2016, 11, 10), date(2017, 2, 26)):
create_ft_billing(bst_date=dt, template=sms_template, rate=0.0162)
create_ft_billing(bst_date=dt, template=email_template, billable_unit=0, rate=0)
create_ft_billing(bst_date=dt, template=letter_template, rate=0.33, postage='second')
json_response = admin_request.get(
'billing.get_yearly_billing_usage_summary_from_ft_billing',
@@ -258,9 +216,9 @@ def test_get_yearly_billing_usage_summary_from_ft_billing(admin_request, notify_
assert len(json_response) == 3
assert json_response[0]['notification_type'] == 'email'
assert json_response[0]['billing_units'] == 275
assert json_response[0]['billing_units'] == 3
assert json_response[0]['chargeable_units'] == 0
assert json_response[0]['notifications_sent'] == 275
assert json_response[0]['notifications_sent'] == 3
assert json_response[0]['rate'] == 0
assert json_response[0]['letter_total'] == 0
assert json_response[0]['cost'] == 0
@@ -268,21 +226,21 @@ def test_get_yearly_billing_usage_summary_from_ft_billing(admin_request, notify_
assert json_response[0]['charged_units'] == 0
assert json_response[1]['notification_type'] == 'letter'
assert json_response[1]['billing_units'] == 275
assert json_response[1]['chargeable_units'] == 275
assert json_response[1]['notifications_sent'] == 275
assert json_response[1]['billing_units'] == 3
assert json_response[1]['chargeable_units'] == 3
assert json_response[1]['notifications_sent'] == 3
assert json_response[1]['rate'] == 0.33
assert json_response[1]['letter_total'] == 90.75
assert json_response[1]['cost'] == 90.75
assert json_response[1]['letter_total'] == 0.99
assert json_response[1]['cost'] == 0.99
assert json_response[1]['free_allowance_used'] == 0
assert json_response[1]['charged_units'] == 275
assert json_response[1]['charged_units'] == 3
assert json_response[2]['notification_type'] == 'sms'
assert json_response[2]['billing_units'] == 825
assert json_response[2]['chargeable_units'] == 825
assert json_response[2]['notifications_sent'] == 550
assert json_response[2]['billing_units'] == 3
assert json_response[2]['chargeable_units'] == 3
assert json_response[2]['notifications_sent'] == 3
assert json_response[2]['rate'] == 0.0162
assert json_response[2]['letter_total'] == 0
assert json_response[2]['cost'] == 13.3002
assert json_response[2]['free_allowance_used'] == 4
assert json_response[2]['charged_units'] == 821
assert json_response[2]['cost'] == 0.0324
assert json_response[2]['free_allowance_used'] == 1
assert json_response[2]['charged_units'] == 2

View File

@@ -50,18 +50,13 @@ def set_up_yearly_data():
for dt in (date(2016, 3, 31), date(2017, 4, 1)):
create_ft_billing(bst_date=dt, template=sms_template, rate=0.163)
create_ft_billing(bst_date=dt, template=email_template, rate=0, billable_unit=0)
create_ft_billing(bst_date=dt, template=letter_template, rate=0.34, postage='second')
create_ft_billing(bst_date=dt, template=letter_template, rate=0.31, postage='second')
start_date = date(2016, 4, 1)
end_date = date(2017, 4, 1)
for n in range((end_date - start_date).days):
dt = start_date + timedelta(days=n)
# a selection of dates that represent the extreme ends of the financial year
# and some arbitrary dates in between
for dt in (date(2016, 4, 1), date(2016, 4, 29), date(2017, 2, 6), date(2017, 3, 31)):
create_ft_billing(bst_date=dt, template=sms_template, rate=0.162)
create_ft_billing(bst_date=dt, template=email_template, rate=0, billable_unit=0)
create_ft_billing(bst_date=dt, template=letter_template, rate=0.33, postage='second')
create_ft_billing(bst_date=dt, template=letter_template, rate=0.30, postage='second')
return service
@@ -426,15 +421,15 @@ def test_get_rate_for_letters_when_page_count_is_zero(notify_db_session):
def test_fetch_monthly_billing_for_year(notify_db_session):
service = set_up_yearly_data()
create_annual_billing(service_id=service.id, free_sms_fragment_limit=10, financial_year_start=2016)
create_annual_billing(service_id=service.id, free_sms_fragment_limit=1, financial_year_start=2016)
results = fetch_monthly_billing_for_year(service.id, 2016)
assert len(results) == 48
assert len(results) == 9 # 3 billed months for each type
assert str(results[0].month) == "2016-04-01"
assert results[0].notification_type == 'email'
assert results[0].notifications_sent == 30
assert results[0].billable_units == 30
assert results[0].notifications_sent == 2
assert results[0].billable_units == 2
assert results[0].chargeable_units == 0
assert results[0].rate == Decimal('0')
assert results[0].cost == Decimal('0')
@@ -443,37 +438,27 @@ def test_fetch_monthly_billing_for_year(notify_db_session):
assert str(results[1].month) == "2016-04-01"
assert results[1].notification_type == 'letter'
assert results[1].notifications_sent == 30
assert results[1].billable_units == 30
assert results[1].chargeable_units == 30
assert results[1].notifications_sent == 2
assert results[1].billable_units == 2
assert results[1].chargeable_units == 2
assert results[1].rate == Decimal('0.30')
assert results[1].cost == Decimal('9')
assert results[1].cost == Decimal('0.60')
assert results[1].free_allowance_used == 0
assert results[1].charged_units == 30
assert results[1].charged_units == 2
assert str(results[1].month) == "2016-04-01"
assert results[2].notification_type == 'letter'
assert results[2].notifications_sent == 30
assert results[2].billable_units == 30
assert results[2].chargeable_units == 30
assert results[2].rate == Decimal('0.33')
assert results[2].cost == Decimal('9.9')
assert results[2].free_allowance_used == 0
assert results[2].charged_units == 30
assert str(results[2].month) == "2016-04-01"
assert results[2].notification_type == 'sms'
assert results[2].notifications_sent == 2
assert results[2].billable_units == 2
assert results[2].chargeable_units == 2
assert results[2].rate == Decimal('0.162')
# free allowance is 1
assert results[2].cost == Decimal('0.162')
assert results[2].free_allowance_used == 1
assert results[2].charged_units == 1
assert str(results[3].month) == "2016-04-01"
assert results[3].notification_type == 'sms'
assert results[3].notifications_sent == 30
assert results[3].billable_units == 30
assert results[3].chargeable_units == 30
assert results[3].rate == Decimal('0.162')
# free allowance is 10, so (30 - 10) * 0.162
assert results[3].cost == Decimal('3.24')
assert results[3].free_allowance_used == 10
assert results[3].charged_units == 20
assert str(results[4].month) == "2016-05-01"
assert str(results[47].month) == "2017-03-01"
assert str(results[3].month) == "2017-02-01"
assert str(results[8].month) == "2017-03-01"
def test_fetch_monthly_billing_for_year_variable_rates(notify_db_session):
@@ -552,10 +537,10 @@ def test_fetch_billing_totals_for_year(notify_db_session):
create_annual_billing(service_id=service.id, free_sms_fragment_limit=1000, financial_year_start=2016)
results = fetch_billing_totals_for_year(service_id=service.id, year=2016)
assert len(results) == 4
assert len(results) == 3
assert results[0].notification_type == 'email'
assert results[0].notifications_sent == 365
assert results[0].billable_units == 365
assert results[0].notifications_sent == 4
assert results[0].billable_units == 4
assert results[0].chargeable_units == 0
assert results[0].rate == Decimal('0')
assert results[0].cost == Decimal('0')
@@ -563,31 +548,22 @@ def test_fetch_billing_totals_for_year(notify_db_session):
assert results[0].charged_units == 0
assert results[1].notification_type == 'letter'
assert results[1].notifications_sent == 365
assert results[1].billable_units == 365
assert results[1].chargeable_units == 365
assert results[1].notifications_sent == 4
assert results[1].billable_units == 4
assert results[1].chargeable_units == 4
assert results[1].rate == Decimal('0.3')
assert results[1].cost == Decimal('109.5')
assert results[1].cost == Decimal('1.2')
assert results[1].free_allowance_used == 0
assert results[1].charged_units == 365
assert results[1].charged_units == 4
assert results[2].notification_type == 'letter'
assert results[2].notifications_sent == 365
assert results[2].billable_units == 365
assert results[2].chargeable_units == 365
assert results[2].rate == Decimal('0.33')
assert results[2].cost == Decimal('120.45')
assert results[2].free_allowance_used == 0
assert results[2].charged_units == 365
assert results[3].notification_type == 'sms'
assert results[3].notifications_sent == 365
assert results[3].billable_units == 365
assert results[3].chargeable_units == 365
assert results[3].rate == Decimal('0.162')
assert results[3].cost == Decimal('0')
assert results[3].free_allowance_used == 365
assert results[3].charged_units == 0
assert results[2].notification_type == 'sms'
assert results[2].notifications_sent == 4
assert results[2].billable_units == 4
assert results[2].chargeable_units == 4
assert results[2].rate == Decimal('0.162')
assert results[2].cost == Decimal('0')
assert results[2].free_allowance_used == 4
assert results[2].charged_units == 0
def test_fetch_billing_totals_for_year_uses_current_annual_billing(notify_db_session):
@@ -601,7 +577,7 @@ def test_fetch_billing_totals_for_year_uses_current_annual_billing(notify_db_ses
if result.notification_type == 'sms'
)
assert result.chargeable_units == 365
assert result.chargeable_units == 4
assert result.cost > 0