From ba612b0f5b4e2fe83e0f02fe6272878c676afce2 Mon Sep 17 00:00:00 2001 From: Leo Hemsted Date: Thu, 5 Apr 2018 15:11:29 +0100 Subject: [PATCH] make sure redis command filters dates properly also write the tests that i should have written a while ago for this --- app/commands.py | 7 ++ tests/app/commands/__init__.py | 0 .../test_performance_platform_commands.py} | 0 tests/app/commands/test_populate_redis.py | 69 +++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 tests/app/commands/__init__.py rename tests/app/{test_commands.py => commands/test_performance_platform_commands.py} (100%) create mode 100644 tests/app/commands/test_populate_redis.py diff --git a/app/commands.py b/app/commands.py index c76f563f3..a3cd9b6da 100644 --- a/app/commands.py +++ b/app/commands.py @@ -504,7 +504,12 @@ def populate_redis_template_usage(service_id, day): Recalculate and replace the stats in redis for a day. To be used if redis data is lost for some reason. """ + # the day variable is set to midnight of that day assert current_app.config['REDIS_ENABLED'] + + start_time = get_london_midnight_in_utc(day) + end_time = get_london_midnight_in_utc(day + timedelta(days=1)) + usage = { str(row.template_id): row.count for row in db.session.query( @@ -512,6 +517,8 @@ def populate_redis_template_usage(service_id, day): func.count().label('count') ).filter( Notification.service_id == service_id, + Notification.created_at >= start_time, + Notification.created_at < end_time ).group_by( Notification.template_id ) diff --git a/tests/app/commands/__init__.py b/tests/app/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/app/test_commands.py b/tests/app/commands/test_performance_platform_commands.py similarity index 100% rename from tests/app/test_commands.py rename to tests/app/commands/test_performance_platform_commands.py diff --git a/tests/app/commands/test_populate_redis.py b/tests/app/commands/test_populate_redis.py new file mode 100644 index 000000000..8be92f277 --- /dev/null +++ b/tests/app/commands/test_populate_redis.py @@ -0,0 +1,69 @@ +from datetime import datetime + +from freezegun import freeze_time +import pytest + +from app.commands import populate_redis_template_usage + +from tests.conftest import set_config +from tests.app.db import create_notification, create_template, create_service + + +def test_populate_redis_template_usage_does_nothing_if_redis_disabled(mocker, notify_api, sample_service): + mock_redis = mocker.patch('app.commands.redis_store') + with set_config(notify_api, 'REDIS_ENABLED', False): + with pytest.raises(AssertionError): + populate_redis_template_usage.callback.__wrapped__(sample_service.id, datetime.utcnow()) + + assert not mock_redis.called + + +def test_populate_redis_template_usage_does_nothing_if_no_data(mocker, notify_api, sample_service): + mock_redis = mocker.patch('app.commands.redis_store') + with set_config(notify_api, 'REDIS_ENABLED', True): + populate_redis_template_usage.callback.__wrapped__(sample_service.id, datetime.utcnow()) + + assert not mock_redis.called + + +@freeze_time('2017-06-12') +def test_populate_redis_template_usage_only_populates_for_today(mocker, notify_api, sample_template): + mock_redis = mocker.patch('app.commands.redis_store') + # created at in utc + create_notification(sample_template, created_at=datetime(2017, 6, 9, 23, 0, 0)) + create_notification(sample_template, created_at=datetime(2017, 6, 9, 23, 0, 0)) + create_notification(sample_template, created_at=datetime(2017, 6, 10, 0, 0, 0)) + create_notification(sample_template, created_at=datetime(2017, 6, 10, 23, 0, 0)) # actually on 11th BST + + with set_config(notify_api, 'REDIS_ENABLED', True): + populate_redis_template_usage.callback.__wrapped__(sample_template.service_id, datetime(2017, 6, 10)) + + mock_redis.set_hash_and_expire.assert_called_once_with( + 'service-{}-template-usage-2017-06-10'.format(sample_template.service_id), + {str(sample_template.id): 3}, + notify_api.config['EXPIRE_CACHE_EIGHT_DAYS'] + ) + + +@freeze_time('2017-06-12') +def test_populate_redis_template_usage_only_populates_for_given_service(mocker, notify_api, notify_db_session): + mock_redis = mocker.patch('app.commands.redis_store') + # created at in utc + s1 = create_service(service_name='a') + s2 = create_service(service_name='b') + t1 = create_template(s1) + t2 = create_template(s2) + + create_notification(t1, created_at=datetime(2017, 6, 10)) + create_notification(t1, created_at=datetime(2017, 6, 10)) + + create_notification(t2, created_at=datetime(2017, 6, 10)) + + with set_config(notify_api, 'REDIS_ENABLED', True): + populate_redis_template_usage.callback.__wrapped__(s1.id, datetime(2017, 6, 10)) + + mock_redis.set_hash_and_expire.assert_called_once_with( + 'service-{}-template-usage-2017-06-10'.format(s1.id), + {str(t1.id): 2}, + notify_api.config['EXPIRE_CACHE_EIGHT_DAYS'] + )