mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-26 17:23:50 -04:00
make dao_get_jobs_by_service_id paginated
it can return a pretty long list, especially when we run lots of smoke tests, so make it accept pagination parameters, and return a pagination object
This commit is contained in:
@@ -1,10 +1,11 @@
|
|||||||
from datetime import date, timedelta, datetime
|
from datetime import datetime
|
||||||
from sqlalchemy import desc, asc, cast, Date as sql_date
|
|
||||||
|
from sqlalchemy import func, desc, asc, cast, Date as sql_date
|
||||||
|
|
||||||
from app import db
|
from app import db
|
||||||
from app.dao import days_ago
|
from app.dao import days_ago
|
||||||
from app.models import Job, NotificationHistory, JOB_STATUS_SCHEDULED
|
from app.models import Job, NotificationHistory, JOB_STATUS_SCHEDULED
|
||||||
from app.statsd_decorators import statsd
|
from app.statsd_decorators import statsd
|
||||||
from sqlalchemy import func, asc
|
|
||||||
|
|
||||||
|
|
||||||
@statsd(namespace="dao")
|
@statsd(namespace="dao")
|
||||||
@@ -26,11 +27,14 @@ def dao_get_job_by_service_id_and_job_id(service_id, job_id):
|
|||||||
return Job.query.filter_by(service_id=service_id, id=job_id).one()
|
return Job.query.filter_by(service_id=service_id, id=job_id).one()
|
||||||
|
|
||||||
|
|
||||||
def dao_get_jobs_by_service_id(service_id, limit_days=None):
|
def dao_get_jobs_by_service_id(service_id, limit_days=None, page=1, page_size=50):
|
||||||
query_filter = [Job.service_id == service_id]
|
query_filter = [Job.service_id == service_id]
|
||||||
if limit_days is not None:
|
if limit_days is not None:
|
||||||
query_filter.append(cast(Job.created_at, sql_date) >= 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()
|
return Job.query \
|
||||||
|
.filter(*query_filter) \
|
||||||
|
.order_by(desc(Job.created_at)) \
|
||||||
|
.paginate(page=page, per_page=page_size)
|
||||||
|
|
||||||
|
|
||||||
def dao_get_job_by_id(job_id):
|
def dao_get_job_by_id(job_id):
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from datetime import (datetime, timedelta)
|
from datetime import datetime, timedelta
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from freezegun import freeze_time
|
from freezegun import freeze_time
|
||||||
|
|
||||||
from app.dao.jobs_dao import (
|
from app.dao.jobs_dao import (
|
||||||
@@ -10,9 +11,10 @@ from app.dao.jobs_dao import (
|
|||||||
dao_get_scheduled_jobs,
|
dao_get_scheduled_jobs,
|
||||||
dao_get_future_scheduled_job_by_id_and_service_id,
|
dao_get_future_scheduled_job_by_id_and_service_id,
|
||||||
dao_get_notification_outcomes_for_job,
|
dao_get_notification_outcomes_for_job,
|
||||||
dao_get_jobs_older_than)
|
dao_get_jobs_older_than
|
||||||
|
)
|
||||||
from app.models import Job
|
from app.models import Job
|
||||||
|
|
||||||
from tests.app.conftest import sample_notification, sample_job, sample_service
|
from tests.app.conftest import sample_notification, sample_job, sample_service
|
||||||
|
|
||||||
|
|
||||||
@@ -143,8 +145,8 @@ def test_get_jobs_for_service(notify_db, notify_db_session, sample_template):
|
|||||||
other_template = create_template(notify_db, notify_db_session, service=other_service)
|
other_template = create_template(notify_db, notify_db_session, service=other_service)
|
||||||
other_job = create_job(notify_db, notify_db_session, service=other_service, template=other_template)
|
other_job = create_job(notify_db, notify_db_session, service=other_service, template=other_template)
|
||||||
|
|
||||||
one_job_from_db = dao_get_jobs_by_service_id(one_job.service_id)
|
one_job_from_db = dao_get_jobs_by_service_id(one_job.service_id).items
|
||||||
other_job_from_db = dao_get_jobs_by_service_id(other_job.service_id)
|
other_job_from_db = dao_get_jobs_by_service_id(other_job.service_id).items
|
||||||
|
|
||||||
assert len(one_job_from_db) == 1
|
assert len(one_job_from_db) == 1
|
||||||
assert one_job == one_job_from_db[0]
|
assert one_job == one_job_from_db[0]
|
||||||
@@ -162,13 +164,13 @@ def test_get_jobs_for_service_with_limit_days_param(notify_db, notify_db_session
|
|||||||
old_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
|
old_job = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
|
||||||
created_at=datetime.now() - timedelta(days=8))
|
created_at=datetime.now() - timedelta(days=8))
|
||||||
|
|
||||||
jobs = dao_get_jobs_by_service_id(one_job.service_id)
|
jobs = dao_get_jobs_by_service_id(one_job.service_id).items
|
||||||
|
|
||||||
assert len(jobs) == 2
|
assert len(jobs) == 2
|
||||||
assert one_job in jobs
|
assert one_job in jobs
|
||||||
assert old_job in jobs
|
assert old_job in jobs
|
||||||
|
|
||||||
jobs_limit_days = dao_get_jobs_by_service_id(one_job.service_id, limit_days=7)
|
jobs_limit_days = dao_get_jobs_by_service_id(one_job.service_id, limit_days=7).items
|
||||||
assert len(jobs_limit_days) == 1
|
assert len(jobs_limit_days) == 1
|
||||||
assert one_job in jobs_limit_days
|
assert one_job in jobs_limit_days
|
||||||
assert old_job not in jobs_limit_days
|
assert old_job not in jobs_limit_days
|
||||||
@@ -187,7 +189,7 @@ def test_get_jobs_for_service_with_limit_days_edge_case(notify_db, notify_db_ses
|
|||||||
job_eight_days_old = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
|
job_eight_days_old = create_job(notify_db, notify_db_session, sample_template.service, sample_template,
|
||||||
created_at=datetime.now() - timedelta(days=8))
|
created_at=datetime.now() - timedelta(days=8))
|
||||||
|
|
||||||
jobs_limit_days = dao_get_jobs_by_service_id(one_job.service_id, limit_days=7)
|
jobs_limit_days = dao_get_jobs_by_service_id(one_job.service_id, limit_days=7).items
|
||||||
assert len(jobs_limit_days) == 3
|
assert len(jobs_limit_days) == 3
|
||||||
assert one_job in jobs_limit_days
|
assert one_job in jobs_limit_days
|
||||||
assert job_two in jobs_limit_days
|
assert job_two in jobs_limit_days
|
||||||
@@ -207,7 +209,7 @@ def test_get_jobs_for_service_in_created_at_order(notify_db, notify_db_session,
|
|||||||
job_4 = create_job(
|
job_4 = create_job(
|
||||||
notify_db, notify_db_session, sample_template.service, sample_template, created_at=datetime.utcnow())
|
notify_db, notify_db_session, sample_template.service, sample_template, created_at=datetime.utcnow())
|
||||||
|
|
||||||
jobs = dao_get_jobs_by_service_id(sample_template.service.id)
|
jobs = dao_get_jobs_by_service_id(sample_template.service.id).items
|
||||||
|
|
||||||
assert len(jobs) == 4
|
assert len(jobs) == 4
|
||||||
assert jobs[0].id == job_4.id
|
assert jobs[0].id == job_4.id
|
||||||
@@ -271,3 +273,27 @@ def test_should_get_jobs_older_than_seven_days(notify_db, notify_db_session):
|
|||||||
jobs = dao_get_jobs_older_than(7)
|
jobs = dao_get_jobs_older_than(7)
|
||||||
assert len(jobs) == 1
|
assert len(jobs) == 1
|
||||||
assert jobs[0].id == job_1.id
|
assert jobs[0].id == job_1.id
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_jobs_for_service_is_paginated(notify_db, notify_db_session, sample_service, sample_template):
|
||||||
|
|
||||||
|
from tests.app.conftest import sample_job as create_job
|
||||||
|
|
||||||
|
with freeze_time('2015-01-01T00:00:00') as the_time:
|
||||||
|
for _ in range(10):
|
||||||
|
the_time.tick(timedelta(hours=1))
|
||||||
|
create_job(notify_db, notify_db_session, sample_service, sample_template)
|
||||||
|
|
||||||
|
res = dao_get_jobs_by_service_id(sample_service.id, page=1, page_size=2)
|
||||||
|
|
||||||
|
assert res.per_page == 2
|
||||||
|
assert res.total == 10
|
||||||
|
assert len(res.items) == 2
|
||||||
|
assert res.items[0].created_at == datetime(2015, 1, 1, 10)
|
||||||
|
assert res.items[1].created_at == datetime(2015, 1, 1, 9)
|
||||||
|
|
||||||
|
res = dao_get_jobs_by_service_id(sample_service.id, page=2, page_size=2)
|
||||||
|
|
||||||
|
assert len(res.items) == 2
|
||||||
|
assert res.items[0].created_at == datetime(2015, 1, 1, 8)
|
||||||
|
assert res.items[1].created_at == datetime(2015, 1, 1, 7)
|
||||||
|
|||||||
Reference in New Issue
Block a user