From a67793cf8ae7c4a2277a4cdfe343b319880cce66 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 25 May 2016 11:13:49 +0100 Subject: [PATCH] Updated date query so that the created_at date is truncated so that we get all jobs created number of days requested. --- app/dao/__init__.py | 5 +++++ app/dao/jobs_dao.py | 9 +++------ app/dao/notifications_dao.py | 7 ++----- tests/app/dao/test_jobs_dao.py | 23 ++++++++++++++++++++++- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/app/dao/__init__.py b/app/dao/__init__.py index 483e45fd1..a56fbce58 100644 --- a/app/dao/__init__.py +++ b/app/dao/__init__.py @@ -28,3 +28,8 @@ class DAOClass(object): db.session.delete(inst) if _commit: db.session.commit() + + +def days_ago(number_of_days): + from datetime import date, timedelta + return date.today() - timedelta(days=number_of_days) diff --git a/app/dao/jobs_dao.py b/app/dao/jobs_dao.py index 723f845b7..13742418a 100644 --- a/app/dao/jobs_dao.py +++ b/app/dao/jobs_dao.py @@ -1,7 +1,8 @@ from datetime import date, timedelta -from sqlalchemy import desc +from sqlalchemy import desc, cast, Date as sql_date from app import db +from app.dao import days_ago from app.models import Job @@ -12,7 +13,7 @@ def dao_get_job_by_service_id_and_job_id(service_id, job_id): def dao_get_jobs_by_service_id(service_id, limit_days=None): query_filter = [Job.service_id == service_id] if limit_days is not None: - query_filter.append(Job.created_at >= _days_ago(limit_days)) + query_filter.append(cast(Job.created_at, sql_date) >= days_ago(limit_days)) return Job.query.filter(*query_filter).order_by(desc(Job.created_at)).all() @@ -28,7 +29,3 @@ def dao_create_job(job): def dao_update_job(job): db.session.add(job) db.session.commit() - - -def _days_ago(number_of_days): - return date.today() - timedelta(days=number_of_days) diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index 57232b632..1c85a05dd 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -1,4 +1,4 @@ -from sqlalchemy import (desc, func, Integer, and_, or_, asc) +from sqlalchemy import (desc, func, Integer, or_, asc) from sqlalchemy.sql.expression import cast from datetime import ( @@ -11,6 +11,7 @@ from flask import current_app from werkzeug.datastructures import MultiDict from app import db +from app.dao import days_ago from app.models import ( Service, Notification, @@ -337,7 +338,3 @@ def delete_notifications_created_more_than_a_week_ago(status): ).delete(synchronize_session='fetch') db.session.commit() return deleted - - -def days_ago(number_of_days): - return date.today() - timedelta(days=number_of_days) diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index 472c3359c..4a7856086 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -64,7 +64,7 @@ def test_get_jobs_for_service(notify_db, notify_db_session, sample_template): assert one_job_from_db != other_job_from_db -def test_get_jobs_for_service(notify_db, notify_db_session, sample_template): +def test_get_jobs_for_service_with_limit_days_param(notify_db, notify_db_session, sample_template): from tests.app.conftest import sample_job as create_job one_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template) @@ -83,6 +83,27 @@ def test_get_jobs_for_service(notify_db, notify_db_session, sample_template): assert old_job not in jobs_limit_days +def test_get_jobs_for_service_with_limit_days_edge_case(notify_db, notify_db_session, sample_template): + from tests.app.conftest import sample_job as create_job + + one_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template) + job_two = create_job(notify_db, notify_db_session, sample_template.service, sample_template, + created_at=(datetime.now() - timedelta(days=7)).date()) + one_second_after_midnight = datetime.combine((datetime.now() - timedelta(days=7)).date(), + datetime.strptime("000001", "%H%M%S").time()) + just_after_midnight_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template, + created_at=one_second_after_midnight) + job_eight_days_old = create_job(notify_db, notify_db_session, sample_template.service, sample_template, + created_at=datetime.now() - timedelta(days=8)) + + jobs_limit_days = dao_get_jobs_by_service_id(one_job.service_id, limit_days=7) + assert len(jobs_limit_days) == 3 + assert one_job in jobs_limit_days + assert job_two in jobs_limit_days + assert just_after_midnight_job in jobs_limit_days + assert job_eight_days_old not in jobs_limit_days + + def test_get_jobs_for_service_in_created_at_order(notify_db, notify_db_session, sample_template): from tests.app.conftest import sample_job as create_job