diff --git a/data-serving/reusable-data-service/reusable_data_service/controller/case_controller.py b/data-serving/reusable-data-service/reusable_data_service/controller/case_controller.py index e4ed803b2..8dd4589b1 100644 --- a/data-serving/reusable-data-service/reusable_data_service/controller/case_controller.py +++ b/data-serving/reusable-data-service/reusable_data_service/controller/case_controller.py @@ -19,23 +19,20 @@ def get_case(self, id: str): return f"No case with ID {id}", 404 return jsonify(case), 200 - def list_cases(self, page:int=None, limit:int=None): + def list_cases(self, page: int = None, limit: int = None): """Implements get /cases.""" page = 1 if page is None else page limit = 10 if limit is None else limit validation_error = None if page <= 0: - validation_error = { "message" : "page must be >0" } + validation_error = {"message": "page must be >0"} if limit <= 0: - validation_error = { "message" : "limit must be >0" } + validation_error = {"message": "limit must be >0"} if validation_error is not None: return jsonify(validation_error), 422 cases = self.store.fetch_cases(page, limit) count = self.store.count_cases() - response = { - "cases": cases, - "total": count - } + response = {"cases": cases, "total": count} if count > page * limit: response["nextPage"] = page + 1 diff --git a/data-serving/reusable-data-service/reusable_data_service/main.py b/data-serving/reusable-data-service/reusable_data_service/main.py index 6764c10bb..9baa14e69 100644 --- a/data-serving/reusable-data-service/reusable_data_service/main.py +++ b/data-serving/reusable-data-service/reusable_data_service/main.py @@ -18,8 +18,8 @@ def get_case(id): @app.route("/api/cases") def list_cases(): - page = request.args.get('page', type=int) - limit = request.args.get('limit', type=int) + page = request.args.get("page", type=int) + limit = request.args.get("limit", type=int) return case_controller.list_cases(page=page, limit=limit) diff --git a/data-serving/reusable-data-service/reusable_data_service/stores/mongo_store.py b/data-serving/reusable-data-service/reusable_data_service/stores/mongo_store.py index 8e8838c56..cbef1c404 100644 --- a/data-serving/reusable-data-service/reusable_data_service/stores/mongo_store.py +++ b/data-serving/reusable-data-service/reusable_data_service/stores/mongo_store.py @@ -38,7 +38,9 @@ def case_by_id(self, id: str): return None def fetch_cases(self, page: int, limit: int): - cases = self.get_case_collection().find({}, skip=(page - 1) * limit, limit = limit) + cases = self.get_case_collection().find( + {}, skip=(page - 1) * limit, limit=limit + ) return [Case.from_json(dumps(c)) for c in cases] def count_cases(self) -> int: diff --git a/data-serving/reusable-data-service/tests/test_case_controller.py b/data-serving/reusable-data-service/tests/test_case_controller.py index e5ee59f65..21afc4b3f 100644 --- a/data-serving/reusable-data-service/tests/test_case_controller.py +++ b/data-serving/reusable-data-service/tests/test_case_controller.py @@ -16,11 +16,12 @@ def put_case(self, id: str, case: Case): self.cases[id] = case def fetch_cases(self, page: int, limit: int): - return list(self.cases.values())[(page - 1) * limit: page * limit] + return list(self.cases.values())[(page - 1) * limit : page * limit] def count_cases(self): return len(self.cases) + @pytest.fixture def case_controller(): with app.app_context(): @@ -71,6 +72,7 @@ def test_list_cases_should_paginate(case_controller): assert response.json["nextPage"] == 2 assert response.json["total"] == 15 + def test_list_cases_last_page(case_controller): with open("./tests/data/case.minimal.json", "r") as minimal_file: case = Case.from_json(minimal_file.read()) @@ -82,6 +84,7 @@ def test_list_cases_last_page(case_controller): assert response.json["total"] == 15 assert "nextPage" not in response.json + def test_list_cases_nonexistent_page(case_controller): with open("./tests/data/case.minimal.json", "r") as minimal_file: case = Case.from_json(minimal_file.read()) diff --git a/data-serving/reusable-data-service/tests/test_case_end_to_end.py b/data-serving/reusable-data-service/tests/test_case_end_to_end.py index b38c995fb..072d2daa8 100644 --- a/data-serving/reusable-data-service/tests/test_case_end_to_end.py +++ b/data-serving/reusable-data-service/tests/test_case_end_to_end.py @@ -58,9 +58,12 @@ def test_list_cases_when_none_present_is_empty_list(client_with_patched_mongo): assert response.status_code == 200 assert response.json["cases"] == [] + def test_list_cases_with_pagination_query(client_with_patched_mongo): db = pymongo.MongoClient("mongodb://localhost:27017/outbreak") - db["outbreak"]["cases"].insert_many([{"confirmation_date": datetime(2020, 12, 24)} for i in range(25)]) + db["outbreak"]["cases"].insert_many( + [{"confirmation_date": datetime(2020, 12, 24)} for i in range(25)] + ) response = client_with_patched_mongo.get(f"/api/cases?page=2&limit=10") assert response.status_code == 200 assert len(response.json["cases"]) == 10