update fact_billing_dao::get_rate to use dates not datetimes

update unit tests too
This commit is contained in:
Leo Hemsted
2019-04-03 14:52:41 +01:00
parent 6f41f6c7d7
commit 9f1f858997
3 changed files with 18 additions and 14 deletions

View File

@@ -21,6 +21,7 @@ from app.models import (
EMAIL_TYPE, EMAIL_TYPE,
NOTIFICATION_STATUS_TYPES_BILLABLE_FOR_LETTERS NOTIFICATION_STATUS_TYPES_BILLABLE_FOR_LETTERS
) )
from app.utils import get_london_midnight_in_utc
def fetch_billing_totals_for_year(service_id, year): def fetch_billing_totals_for_year(service_id, year):
@@ -228,13 +229,15 @@ def get_service_ids_that_need_billing_populated(start_date, end_date):
def get_rate( def get_rate(
non_letter_rates, letter_rates, notification_type, date, crown=None, letter_page_count=None, post_class='second' non_letter_rates, letter_rates, notification_type, date, crown=None, letter_page_count=None, post_class='second'
): ):
start_of_day = get_london_midnight_in_utc(date)
if notification_type == LETTER_TYPE: if notification_type == LETTER_TYPE:
if letter_page_count == 0: if letter_page_count == 0:
return 0 return 0
return next( return next(
r.rate r.rate
for r in letter_rates if ( for r in letter_rates if (
date >= r.start_date and start_of_day >= r.start_date and
crown == r.crown and crown == r.crown and
letter_page_count == r.sheet_count and letter_page_count == r.sheet_count and
post_class == r.post_class post_class == r.post_class
@@ -245,7 +248,7 @@ def get_rate(
r.rate r.rate
for r in non_letter_rates if ( for r in non_letter_rates if (
notification_type == r.notification_type and notification_type == r.notification_type and
date >= r.valid_from start_of_day >= r.valid_from
) )
) )
else: else:

View File

@@ -3,7 +3,6 @@ from decimal import Decimal
import pytest import pytest
from freezegun import freeze_time from freezegun import freeze_time
from sqlalchemy import desc
from app.celery.reporting_tasks import create_nightly_billing, create_nightly_notification_status from app.celery.reporting_tasks import create_nightly_billing, create_nightly_notification_status
from app.dao.fact_billing_dao import get_rate from app.dao.fact_billing_dao import get_rate
@@ -19,7 +18,7 @@ from tests.app.db import create_service, create_template, create_notification, c
def mocker_get_rate( def mocker_get_rate(
non_letter_rates, letter_rates, notification_type, date, crown=None, rate_multiplier=None, post_class="second" non_letter_rates, letter_rates, notification_type, bst_date, crown=None, rate_multiplier=None, post_class="second"
): ):
if notification_type == LETTER_TYPE: if notification_type == LETTER_TYPE:
return Decimal(2.1) return Decimal(2.1)
@@ -326,20 +325,20 @@ def test_get_rate_for_letter_latest(notify_db_session):
old = create_letter_rate(datetime(2016, 12, 1), crown=True, sheet_count=1, rate=0.30, post_class='second') old = create_letter_rate(datetime(2016, 12, 1), crown=True, sheet_count=1, rate=0.30, post_class='second')
letter_rates = [new, old] letter_rates = [new, old]
rate = get_rate([], letter_rates, LETTER_TYPE, datetime(2018, 1, 1), True, 1) rate = get_rate([], letter_rates, LETTER_TYPE, date(2018, 1, 1), True, 1)
assert rate == Decimal(0.33) assert rate == Decimal(0.33)
def test_get_rate_for_sms_and_email(notify_db_session): def test_get_rate_for_sms_and_email(notify_db_session):
non_letter_rates = [ non_letter_rates = [
create_rate(datetime(2017, 12, 1), 0.15, SMS_TYPE) create_rate(datetime(2017, 12, 1), 0.15, SMS_TYPE),
create_rate(datetime(2017, 12, 1), 0, EMAIL_TYPE) create_rate(datetime(2017, 12, 1), 0, EMAIL_TYPE)
] ]
rate = get_rate(non_letter_rates, [], SMS_TYPE, datetime(2018, 1, 1)) rate = get_rate(non_letter_rates, [], SMS_TYPE, date(2018, 1, 1))
assert rate == Decimal(0.15) assert rate == Decimal(0.15)
rate = get_rate(non_letter_rates, [], EMAIL_TYPE, datetime(2018, 1, 1)) rate = get_rate(non_letter_rates, [], EMAIL_TYPE, date(2018, 1, 1))
assert rate == Decimal(0) assert rate == Decimal(0)

View File

@@ -1,7 +1,7 @@
from calendar import monthrange from calendar import monthrange
from decimal import Decimal from decimal import Decimal
from datetime import datetime, timedelta from datetime import datetime, timedelta, date
from freezegun import freeze_time from freezegun import freeze_time
import pytest import pytest
@@ -288,18 +288,20 @@ def test_get_rates_for_billing(notify_db_session):
assert len(letter_rates) == 29 assert len(letter_rates) == 29
@freeze_time('2017-06-01 12:00')
def test_get_rate(notify_db_session): def test_get_rate(notify_db_session):
create_rate(start_date=datetime.utcnow(), value=1.2, notification_type='email') create_rate(start_date=datetime(2017, 5, 30, 23, 00), value=1.2, notification_type='email')
create_rate(start_date=datetime.utcnow(), value=2.2, notification_type='sms') create_rate(start_date=datetime(2017, 5, 30, 23, 00), value=2.2, notification_type='sms')
create_rate(start_date=datetime.utcnow(), value=3.3, notification_type='email') create_rate(start_date=datetime(2017, 5, 30, 23, 00), value=3.3, notification_type='email')
non_letter_rates, letter_rates = get_rates_for_billing() non_letter_rates, letter_rates = get_rates_for_billing()
rate = get_rate(non_letter_rates=non_letter_rates, letter_rates=letter_rates, notification_type='sms', rate = get_rate(non_letter_rates=non_letter_rates, letter_rates=letter_rates, notification_type='sms',
date=datetime.utcnow()) date=date(2017, 6, 1))
letter_rate = get_rate(non_letter_rates=non_letter_rates, letter_rates=letter_rates, letter_rate = get_rate(non_letter_rates=non_letter_rates, letter_rates=letter_rates,
notification_type='letter', notification_type='letter',
crown=True, crown=True,
letter_page_count=1, letter_page_count=1,
date=datetime.utcnow()) date=date(2017, 6, 1))
assert rate == 2.2 assert rate == 2.2
assert letter_rate == Decimal('0.3') assert letter_rate == Decimal('0.3')