From 019990f702144d5c17b7c160ea15455b92d3bce8 Mon Sep 17 00:00:00 2001 From: cching95 <73163191+cching95@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:43:44 +0000 Subject: [PATCH] Add Pagination to API responses (#659) * updates for pagination for raw api response Signed-off-by: Chloe Ching * update models for pagination Signed-off-by: Chloe Ching * added pagination logic to raw Signed-off-by: Chloe Ching * add pagination logic to all time series apis Signed-off-by: Chloe Ching * updates Signed-off-by: Chloe Ching * updated unit test for api pagination Signed-off-by: Chloe Ching --------- Signed-off-by: Chloe Ching --- src/api/v1/circular_average.py | 21 ++++++++++++++++++ src/api/v1/circular_standard_deviation.py | 22 +++++++++++++++++++ src/api/v1/interpolate.py | 21 ++++++++++++++++++ src/api/v1/interpolation_at_time.py | 21 ++++++++++++++++++ src/api/v1/latest.py | 20 +++++++++++++++++ src/api/v1/metadata.py | 21 ++++++++++++++++++ src/api/v1/models.py | 12 ++++++++++ src/api/v1/raw.py | 22 ++++++++++++++++++- src/api/v1/resample.py | 20 +++++++++++++++++ src/api/v1/summary.py | 20 +++++++++++++++++ src/api/v1/time_weighted_average.py | 21 ++++++++++++++++++ tests/api/v1/test_api_circular_average.py | 2 ++ .../test_api_circular_standard_deviation.py | 2 ++ tests/api/v1/test_api_interpolate.py | 2 ++ .../api/v1/test_api_interpolation_at_time.py | 2 ++ tests/api/v1/test_api_latest.py | 4 ++++ tests/api/v1/test_api_metadata.py | 3 +++ tests/api/v1/test_api_raw.py | 7 ++++++ tests/api/v1/test_api_resample.py | 2 ++ tests/api/v1/test_api_summary.py | 2 ++ .../api/v1/test_api_time_weighted_average.py | 2 ++ 21 files changed, 248 insertions(+), 1 deletion(-) diff --git a/src/api/v1/circular_average.py b/src/api/v1/circular_average.py index de2f4d013..dcaf15700 100644 --- a/src/api/v1/circular_average.py +++ b/src/api/v1/circular_average.py @@ -34,6 +34,7 @@ CircularAverageQueryParams, PivotQueryParams, LimitOffsetQueryParams, + PaginationRow, ) import src.api.v1.common @@ -61,15 +62,35 @@ def circular_average_events_get( ) data = circular_average.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + if parameters.get("pivot") == True: return PivotResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) else: return ResampleInterpolateResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) except Exception as e: logging.error(str(e)) diff --git a/src/api/v1/circular_standard_deviation.py b/src/api/v1/circular_standard_deviation.py index a5aaf6595..31303c298 100644 --- a/src/api/v1/circular_standard_deviation.py +++ b/src/api/v1/circular_standard_deviation.py @@ -34,6 +34,7 @@ PivotQueryParams, LimitOffsetQueryParams, CircularAverageQueryParams, + PaginationRow, ) import src.api.v1.common @@ -61,16 +62,37 @@ def circular_standard_deviation_events_get( ) data = circular_standard_deviation.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + if parameters.get("pivot") == True: return PivotResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) else: return ResampleInterpolateResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) + except Exception as e: logging.error(str(e)) raise HTTPException(status_code=400, detail=str(e)) diff --git a/src/api/v1/interpolate.py b/src/api/v1/interpolate.py index 6f7378e36..65efc2fb6 100644 --- a/src/api/v1/interpolate.py +++ b/src/api/v1/interpolate.py @@ -33,6 +33,7 @@ InterpolateQueryParams, PivotQueryParams, LimitOffsetQueryParams, + PaginationRow, ) import src.api.v1.common @@ -62,15 +63,35 @@ def interpolate_events_get( ) data = interpolate.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + if parameters.get("pivot") == True: return PivotResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) else: return ResampleInterpolateResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) except Exception as e: logging.error(str(e)) diff --git a/src/api/v1/interpolation_at_time.py b/src/api/v1/interpolation_at_time.py index 2a60e72a5..d1dc651ca 100644 --- a/src/api/v1/interpolation_at_time.py +++ b/src/api/v1/interpolation_at_time.py @@ -31,6 +31,7 @@ InterpolationAtTimeQueryParams, PivotQueryParams, LimitOffsetQueryParams, + PaginationRow, ) import src.api.v1.common @@ -56,15 +57,35 @@ def interpolation_at_time_events_get( ) data = interpolation_at_time.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + if parameters.get("pivot") == True: return PivotResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) else: return ResampleInterpolateResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) except Exception as e: logging.error(str(e)) diff --git a/src/api/v1/latest.py b/src/api/v1/latest.py index 15c2e84a3..189a7c313 100644 --- a/src/api/v1/latest.py +++ b/src/api/v1/latest.py @@ -27,6 +27,7 @@ LatestResponse, LimitOffsetQueryParams, HTTPError, + PaginationRow, ) from src.api.auth.azuread import oauth2_scheme from src.api.FastAPIApp import api_v1_router @@ -47,9 +48,28 @@ def latest_retrieval_get( ) data = latest.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + return LatestResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) except Exception as e: logging.error(str(e)) diff --git a/src/api/v1/metadata.py b/src/api/v1/metadata.py index 01d446c25..b891c2ba1 100644 --- a/src/api/v1/metadata.py +++ b/src/api/v1/metadata.py @@ -27,6 +27,7 @@ MetadataResponse, LimitOffsetQueryParams, HTTPError, + PaginationRow, ) from src.api.auth.azuread import oauth2_scheme from src.api.FastAPIApp import api_v1_router @@ -47,10 +48,30 @@ def metadata_retrieval_get( ) data = metadata.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + return MetadataResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) + except Exception as e: logging.error(str(e)) raise HTTPException(status_code=400, detail=str(e)) diff --git a/src/api/v1/models.py b/src/api/v1/models.py index 9bfdea7bf..980d5cd54 100644 --- a/src/api/v1/models.py +++ b/src/api/v1/models.py @@ -67,6 +67,12 @@ class LatestRow(BaseModel): GoodValueType: Union[str, None] +class PaginationRow(BaseModel): + limit: Union[int, None] + offset: Union[int, None] + next: Union[int, None] + + class RawRow(BaseModel): EventTime: datetime TagName: str @@ -90,6 +96,7 @@ class MetadataResponse(BaseModel): None, alias="schema", serialization_alias="schema" ) data: List[MetadataRow] + pagination: Union[PaginationRow, None] class LatestResponse(BaseModel): @@ -97,6 +104,7 @@ class LatestResponse(BaseModel): None, alias="schema", serialization_alias="schema" ) data: List[LatestRow] + pagination: Union[PaginationRow, None] class RawResponse(BaseModel): @@ -104,6 +112,7 @@ class RawResponse(BaseModel): None, alias="schema", serialization_alias="schema" ) data: List[RawRow] + pagination: Union[PaginationRow, None] class ResampleInterpolateRow(BaseModel): @@ -123,6 +132,7 @@ class ResampleInterpolateResponse(BaseModel): None, alias="schema", serialization_alias="schema" ) data: List[ResampleInterpolateRow] + pagination: Union[PaginationRow, None] class SummaryResponse(BaseModel): @@ -130,6 +140,7 @@ class SummaryResponse(BaseModel): None, alias="schema", serialization_alias="schema" ) data: List[SummaryRow] + pagination: Union[PaginationRow, None] class PivotResponse(BaseModel): @@ -137,6 +148,7 @@ class PivotResponse(BaseModel): None, alias="schema", serialization_alias="schema" ) data: List[PivotRow] + pagination: Union[PaginationRow, None] class HTTPError(BaseModel): diff --git a/src/api/v1/raw.py b/src/api/v1/raw.py index b849b995e..8d5a8cb56 100644 --- a/src/api/v1/raw.py +++ b/src/api/v1/raw.py @@ -18,7 +18,7 @@ from pandas.io.json import build_table_schema from fastapi import Query, HTTPException, Depends, Body import nest_asyncio -from src.sdk.python.rtdip_sdk.queries.time_series import raw +from src.sdk.python.rtdip_sdk.queries.time_series import raw, summary from src.api.v1.models import ( BaseHeaders, BaseQueryParams, @@ -28,6 +28,7 @@ TagsBodyParams, LimitOffsetQueryParams, HTTPError, + PaginationRow, ) from src.api.auth.azuread import oauth2_scheme from src.api.FastAPIApp import api_v1_router @@ -53,9 +54,28 @@ def raw_events_get( ) data = raw.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + return RawResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) except Exception as e: logging.error(str(e)) diff --git a/src/api/v1/resample.py b/src/api/v1/resample.py index fd4ed8992..e28a4c93d 100644 --- a/src/api/v1/resample.py +++ b/src/api/v1/resample.py @@ -34,6 +34,7 @@ ResampleQueryParams, PivotQueryParams, LimitOffsetQueryParams, + PaginationRow, ) import src.api.v1.common @@ -61,14 +62,33 @@ def resample_events_get( ) data = resample.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) if parameters.get("pivot") == True: return PivotResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) else: return ResampleInterpolateResponse( schema=build_table_schema(data, index=False, primary_key=False), + pagination=pagination, data=data.replace({np.nan: None}).to_dict(orient="records"), ) except Exception as e: diff --git a/src/api/v1/summary.py b/src/api/v1/summary.py index a50e35847..9a2814fe7 100644 --- a/src/api/v1/summary.py +++ b/src/api/v1/summary.py @@ -28,6 +28,7 @@ TagsBodyParams, LimitOffsetQueryParams, HTTPError, + PaginationRow, ) from src.api.auth.azuread import oauth2_scheme from src.api.FastAPIApp import api_v1_router @@ -53,9 +54,28 @@ def summary_events_get( ) data = summary.get(connection, parameters) + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + return SummaryResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) except Exception as e: logging.error(str(e)) diff --git a/src/api/v1/time_weighted_average.py b/src/api/v1/time_weighted_average.py index f4a3ca357..b49c465da 100644 --- a/src/api/v1/time_weighted_average.py +++ b/src/api/v1/time_weighted_average.py @@ -32,6 +32,7 @@ TimeWeightedAverageQueryParams, PivotQueryParams, LimitOffsetQueryParams, + PaginationRow, ) import src.api.v1.common @@ -60,15 +61,35 @@ def time_weighted_average_events_get( data = time_weighted_average.get(connection, parameters) data = data.reset_index() + + pagination = None + + if ( + limit_offset_parameters.limit is not None + and limit_offset_parameters.offset is not None + ): + next = None + + if len(data.index) == limit_offset_parameters.limit: + next = limit_offset_parameters.offset + limit_offset_parameters.limit + + pagination = PaginationRow( + limit=limit_offset_parameters.limit, + offset=limit_offset_parameters.offset, + next=next, + ) + if parameters.get("pivot") == True: return PivotResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) else: return ResampleInterpolateResponse( schema=build_table_schema(data, index=False, primary_key=False), data=data.replace({np.nan: None}).to_dict(orient="records"), + pagination=pagination, ) except Exception as e: logging.error(str(e)) diff --git a/tests/api/v1/test_api_circular_average.py b/tests/api/v1/test_api_circular_average.py index ac3e7f7ee..2cd838271 100644 --- a/tests/api/v1/test_api_circular_average.py +++ b/tests/api/v1/test_api_circular_average.py @@ -48,6 +48,7 @@ async def test_api_circular_average_get_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -109,6 +110,7 @@ async def test_api_circular_average_post_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_circular_standard_deviation.py b/tests/api/v1/test_api_circular_standard_deviation.py index b8cbbbd49..3365bba20 100644 --- a/tests/api/v1/test_api_circular_standard_deviation.py +++ b/tests/api/v1/test_api_circular_standard_deviation.py @@ -50,6 +50,7 @@ async def test_api_circular_standard_deviation_get_success(mocker: MockerFixture ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -113,6 +114,7 @@ async def test_api_circular_standard_deviation_post_success(mocker: MockerFixtur ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_interpolate.py b/tests/api/v1/test_api_interpolate.py index 50bcb4069..2d3d15b30 100644 --- a/tests/api/v1/test_api_interpolate.py +++ b/tests/api/v1/test_api_interpolate.py @@ -48,6 +48,7 @@ async def test_api_interpolate_get_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -109,6 +110,7 @@ async def test_api_interpolate_post_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_interpolation_at_time.py b/tests/api/v1/test_api_interpolation_at_time.py index 86c619ca2..cf8009d96 100644 --- a/tests/api/v1/test_api_interpolation_at_time.py +++ b/tests/api/v1/test_api_interpolation_at_time.py @@ -47,6 +47,7 @@ async def test_api_interpolation_at_time_get_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -109,6 +110,7 @@ async def test_api_interpolation_at_time_post_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_latest.py b/tests/api/v1/test_api_latest.py index 5dab1e13b..c4659154d 100644 --- a/tests/api/v1/test_api_latest.py +++ b/tests/api/v1/test_api_latest.py @@ -56,6 +56,7 @@ async def test_api_latest_get_tags_provided_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -85,6 +86,7 @@ async def test_api_latest_get_no_good_values_tags_provided_success( ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -116,6 +118,7 @@ async def test_api_latest_get_no_tags_provided_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -205,6 +208,7 @@ async def test_api_latest_post_tags_provided_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_metadata.py b/tests/api/v1/test_api_metadata.py index ac5067e0b..4446a2186 100644 --- a/tests/api/v1/test_api_metadata.py +++ b/tests/api/v1/test_api_metadata.py @@ -45,6 +45,7 @@ async def test_api_metadata_get_tags_provided_success(mocker: MockerFixture): ) actual = response.text expected = TEST_DATA.to_json(orient="table", index=False) + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -63,6 +64,7 @@ async def test_api_metadata_get_no_tags_provided_success(mocker: MockerFixture): ) actual = response.text expected = TEST_DATA.to_json(orient="table", index=False) + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -113,6 +115,7 @@ async def test_api_metadata_post_tags_provided_success(mocker: MockerFixture): ) actual = response.text expected = TEST_DATA.to_json(orient="table", index=False) + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_raw.py b/tests/api/v1/test_api_raw.py index fe2b762d7..4c7fc2aa3 100644 --- a/tests/api/v1/test_api_raw.py +++ b/tests/api/v1/test_api_raw.py @@ -15,6 +15,7 @@ import pytest from pytest_mock import MockerFixture import pandas as pd +import numpy as np from datetime import datetime from tests.api.v1.api_test_objects import ( RAW_MOCKED_PARAMETER_DICT, @@ -25,6 +26,10 @@ TEST_HEADERS, BASE_URL, ) +from src.api.v1.models import ( + RawResponse, +) +from pandas.io.json import build_table_schema from httpx import AsyncClient from src.api.v1 import app @@ -51,6 +56,7 @@ async def test_api_raw_get_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -123,6 +129,7 @@ async def test_api_raw_post_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_resample.py b/tests/api/v1/test_api_resample.py index fc9123df2..6a0c97837 100644 --- a/tests/api/v1/test_api_resample.py +++ b/tests/api/v1/test_api_resample.py @@ -46,6 +46,7 @@ async def test_api_resample_get_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -105,6 +106,7 @@ async def test_api_resample_post_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_summary.py b/tests/api/v1/test_api_summary.py index aa285aebd..2649a0dcb 100644 --- a/tests/api/v1/test_api_summary.py +++ b/tests/api/v1/test_api_summary.py @@ -56,6 +56,7 @@ async def test_api_summary_get_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -106,6 +107,7 @@ async def test_api_summary_post_success(mocker: MockerFixture): ) actual = response.text expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected diff --git a/tests/api/v1/test_api_time_weighted_average.py b/tests/api/v1/test_api_time_weighted_average.py index 0037a6312..193d280f7 100644 --- a/tests/api/v1/test_api_time_weighted_average.py +++ b/tests/api/v1/test_api_time_weighted_average.py @@ -50,6 +50,7 @@ async def test_api_time_weighted_average_get_success(mocker: MockerFixture): actual = response.text test_data = test_data.reset_index() expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected @@ -113,6 +114,7 @@ async def test_api_time_weighted_average_post_success(mocker: MockerFixture): actual = response.text test_data = test_data.reset_index() expected = test_data.to_json(orient="table", index=False, date_unit="us") + expected = expected.rstrip("}") + ',"pagination":null}' assert response.status_code == 200 assert actual == expected