diff --git a/app/service/rest.py b/app/service/rest.py index ad0c39d12..e8c585d1f 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -446,29 +446,35 @@ def get_monthly_template_stats(service_id): @service_blueprint.route('//yearly-sms-billable-units') def get_yearly_sms_billable_units(service_id): - try: - cache_key = sms_billable_units_cache_key(service_id) - cached_billable_sms_units = redis_store.get(cache_key) - if cached_billable_sms_units: - return jsonify({ - 'billable_sms_units': int(cached_billable_sms_units[0]), - 'total_cost': float(cached_billable_sms_units[1]) - }) - else: + cache_key = sms_billable_units_cache_key(service_id) + cached_billable_sms_units = redis_store.get_all_from_hash(cache_key) + if cached_billable_sms_units: + return jsonify({ + 'billable_sms_units': int(cached_billable_sms_units[b'billable_units']), + 'total_cost': float(cached_billable_sms_units[b'total_cost']) + }) + else: + try: start_date, end_date = get_financial_year(int(request.args.get('year'))) - billable_units, total_cost = get_total_billable_units_for_sent_sms_notifications_in_date_range( - start_date, - end_date, - service_id) - redis_store.set(cache_key, billable_units, ex=60) - return jsonify({ - 'billable_sms_units': billable_units, - 'total_cost': total_cost - }) + except (ValueError, TypeError) as e: + current_app.logger.exception(e) + return jsonify(result='error', message='No valid year provided'), 400 - except (ValueError, TypeError) as e: - print(e) - return jsonify(result='error', message='No valid year provided'), 400 + billable_units, total_cost = get_total_billable_units_for_sent_sms_notifications_in_date_range( + start_date, + end_date, + service_id) + + cached_values = { + 'billable_units': billable_units, + 'total_cost': total_cost + } + + redis_store.set_hash_and_expire(cache_key, cached_values, expire_in_seconds=60) + return jsonify({ + 'billable_sms_units': billable_units, + 'total_cost': total_cost + }) @service_blueprint.route('//yearly-usage') diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 4231de249..691f0895c 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -1736,8 +1736,8 @@ def test_get_yearly_billing_usage_count_returns_400_if_missing_year(client, samp def test_get_yearly_billing_usage_count_returns_400_if_invalid_year(client, sample_service, mocker): - redis_get_mock = mocker.patch('app.service.rest.redis_store.get', return_value=None) - redis_set_mock = mocker.patch('app.service.rest.redis_store.set') + redis_get_mock = mocker.patch('app.service.rest.redis_store.get_all_from_hash', return_value=None) + redis_set_mock = mocker.patch('app.service.rest.redis_store.set_hash_and_expire') response = client.get( '/service/{}/yearly-sms-billable-units?year=HAHAHAHAH'.format(sample_service.id), @@ -1752,8 +1752,8 @@ def test_get_yearly_billing_usage_count_returns_400_if_invalid_year(client, samp def test_get_yearly_billing_usage_count_returns_200_if_year_provided(client, sample_service, mocker): - redis_get_mock = mocker.patch('app.service.rest.redis_store.get', return_value=None) - redis_set_mock = mocker.patch('app.service.rest.redis_store.set') + redis_get_mock = mocker.patch('app.service.rest.redis_store.get_all_from_hash', return_value=None) + redis_set_mock = mocker.patch('app.service.rest.redis_store.set_hash_and_expire') start = datetime.utcnow() end = datetime.utcnow() + timedelta(minutes=10) @@ -1773,12 +1773,19 @@ def test_get_yearly_billing_usage_count_returns_200_if_year_provided(client, sam mock_query.assert_called_once_with(start, end, sample_service.id) mock_year.assert_called_once_with(2016) redis_get_mock.assert_called_once_with("{}-sms_billable_units".format(str(sample_service.id))) - redis_set_mock.assert_called_once_with("{}-sms_billable_units".format(str(sample_service.id)), 100, ex=60) + redis_set_mock.assert_called_once_with( + "{}-sms_billable_units".format(str(sample_service.id)), + {'billable_units': 100, 'total_cost': 200.0}, + expire_in_seconds=60 + ) def test_get_yearly_billing_usage_count_returns_from_cache_if_present(client, sample_service, mocker): - redis_get_mock = mocker.patch('app.service.rest.redis_store.get', return_value=(50, 100.0)) - redis_set_mock = mocker.patch('app.service.rest.redis_store.set') + redis_get_mock = mocker.patch( + 'app.service.rest.redis_store.get_all_from_hash', + return_value={b'total_cost': 100.0, b'billable_units': 50} + ) + redis_set_mock = mocker.patch('app.service.rest.redis_store.set_hash_and_expire') mock_query = mocker.patch( 'app.service.rest.get_total_billable_units_for_sent_sms_notifications_in_date_range', return_value=(50, 100.0) )