Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 29 additions & 6 deletions src/api/v1/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@
# See the License for the specific language governing permissions and
# limitations under the License.

from datetime import datetime
import json
import os
import numpy as np
import pandas as pd
import importlib.util
from typing import Any
from fastapi import Response

import dateutil.parser
from pandas import DataFrame
from pandas.io.json import build_table_schema
from src.sdk.python.rtdip_sdk.connectors import DatabricksSQLConnection
Expand Down Expand Up @@ -76,6 +78,7 @@ def common_api_setup_tasks( # NOSONAR
)

parameters = base_query_parameters.__dict__
parameters["to_json"] = True

if metadata_query_parameters != None:
parameters = dict(parameters, **metadata_query_parameters.__dict__)
Expand Down Expand Up @@ -161,18 +164,38 @@ def pagination(limit_offset_parameters: LimitOffsetQueryParams, data: DataFrame)
return pagination


def datetime_parser(json_dict):
for key, value in json_dict.items():
try:
json_dict[key] = (
dateutil.parser.parse(value, ignoretz=True)
if isinstance(value, str) and "eventtime" in key.lower()
else value
)
except Exception:
pass
return json_dict


def json_response(
data: DataFrame, limit_offset_parameters: LimitOffsetQueryParams
) -> Response:
schema_df = pd.DataFrame()
if not data.empty:
json_str = data.loc[0, "Value"]
json_dict = json.loads(json_str, object_hook=datetime_parser)
schema_df = pd.json_normalize(json_dict)

return Response(
content="{"
+ '"schema":{},"data":{},"pagination":{}'.format(
FieldSchema.model_validate(
build_table_schema(data, index=False, primary_key=False),
build_table_schema(schema_df, index=False, primary_key=False),
).model_dump_json(),
data.replace({np.nan: None}).to_json(
orient="records", date_format="iso", date_unit="ns"
),
"[" + ",".join(data["Value"]) + "]",
# data.replace({np.nan: None}).to_json(
# orient="records", date_format="iso", date_unit="ns"
# ),
pagination(limit_offset_parameters, data).model_dump_json(),
)
+ "}",
Expand Down

Large diffs are not rendered by default.

91 changes: 25 additions & 66 deletions tests/api/v1/test_api_circular_average.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import json
import pytest
from pytest_mock import MockerFixture
import pandas as pd
Expand All @@ -34,15 +35,8 @@
pytestmark = pytest.mark.anyio


async def test_api_circular_average_get_success(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.5],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
async def test_api_circular_average_get_success(mocker: MockerFixture, api_test_data):
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.get(
Expand All @@ -51,25 +45,15 @@ async def test_api_circular_average_get_success(mocker: MockerFixture):
params=CIRCULAR_AVERAGE_MOCKED_PARAMETER_DICT,
)
actual = response.text
expected = test_data.to_json(orient="table", index=False, date_unit="ns")
expected = (
expected.replace(',"tz":"UTC"', "").rstrip("}")
+ ',"pagination":{"limit":null,"offset":null,"next":null}}'
)

assert response.status_code == 200
assert actual == expected
assert actual == api_test_data["expected_agg"]


async def test_api_circular_average_get_validation_error(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
async def test_api_circular_average_get_validation_error(
mocker: MockerFixture, api_test_data
):
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.get(
Expand All @@ -86,16 +70,12 @@ async def test_api_circular_average_get_validation_error(mocker: MockerFixture):
)


async def test_api_circular_average_get_error(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
async def test_api_circular_average_get_error(mocker: MockerFixture, api_test_data):
mocker = mocker_setup(
mocker, MOCK_METHOD, test_data, Exception("Error Connecting to Database")
mocker,
MOCK_METHOD,
api_test_data["mock_data_agg"],
Exception("Error Connecting to Database"),
)

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
Expand All @@ -110,15 +90,8 @@ async def test_api_circular_average_get_error(mocker: MockerFixture):
assert actual == '{"detail":"Error Connecting to Database"}'


async def test_api_circular_average_post_success(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.5],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
async def test_api_circular_average_post_success(mocker: MockerFixture, api_test_data):
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.post(
Expand All @@ -128,25 +101,15 @@ async def test_api_circular_average_post_success(mocker: MockerFixture):
json=CIRCULAR_AVERAGE_POST_BODY_MOCKED_PARAMETER_DICT,
)
actual = response.text
expected = test_data.to_json(orient="table", index=False, date_unit="ns")
expected = (
expected.replace(',"tz":"UTC"', "").rstrip("}")
+ ',"pagination":{"limit":null,"offset":null,"next":null}}'
)

assert response.status_code == 200
assert actual == expected
assert actual == api_test_data["expected_agg"]


async def test_api_circular_average_post_validation_error(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
async def test_api_circular_average_post_validation_error(
mocker: MockerFixture, api_test_data
):
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.post(
Expand All @@ -164,16 +127,12 @@ async def test_api_circular_average_post_validation_error(mocker: MockerFixture)
)


async def test_api_circular_average_post_error(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
async def test_api_circular_average_post_error(mocker: MockerFixture, api_test_data):
mocker = mocker_setup(
mocker, MOCK_METHOD, test_data, Exception("Error Connecting to Database")
mocker,
MOCK_METHOD,
api_test_data["mock_data_agg"],
Exception("Error Connecting to Database"),
)

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
Expand Down
94 changes: 28 additions & 66 deletions tests/api/v1/test_api_circular_standard_deviation.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,10 @@
pytestmark = pytest.mark.anyio


async def test_api_circular_standard_deviation_get_success(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.5],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
async def test_api_circular_standard_deviation_get_success(
mocker: MockerFixture, api_test_data
):
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.get(
Expand All @@ -53,27 +48,15 @@ async def test_api_circular_standard_deviation_get_success(mocker: MockerFixture
params=CIRCULAR_AVERAGE_MOCKED_PARAMETER_DICT,
)
actual = response.text
expected = test_data.to_json(orient="table", index=False, date_unit="ns")
expected = (
expected.replace(',"tz":"UTC"', "").rstrip("}")
+ ',"pagination":{"limit":null,"offset":null,"next":null}}'
)

assert response.status_code == 200
assert actual == expected
assert actual == api_test_data["expected_agg"]


async def test_api_circular_standard_deviation_get_validation_error(
mocker: MockerFixture,
mocker: MockerFixture, api_test_data
):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.get(
Expand All @@ -90,16 +73,14 @@ async def test_api_circular_standard_deviation_get_validation_error(
)


async def test_api_circular_standard_deviation_get_error(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
async def test_api_circular_standard_deviation_get_error(
mocker: MockerFixture, api_test_data
):
mocker = mocker_setup(
mocker, MOCK_METHOD, test_data, Exception("Error Connecting to Database")
mocker,
MOCK_METHOD,
api_test_data["mock_data_agg"],
Exception("Error Connecting to Database"),
)

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
Expand All @@ -114,15 +95,10 @@ async def test_api_circular_standard_deviation_get_error(mocker: MockerFixture):
assert actual == '{"detail":"Error Connecting to Database"}'


async def test_api_circular_standard_deviation_post_success(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.5],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
async def test_api_circular_standard_deviation_post_success(
mocker: MockerFixture, api_test_data
):
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.post(
Expand All @@ -132,27 +108,15 @@ async def test_api_circular_standard_deviation_post_success(mocker: MockerFixtur
json=CIRCULAR_AVERAGE_POST_BODY_MOCKED_PARAMETER_DICT,
)
actual = response.text
expected = test_data.to_json(orient="table", index=False, date_unit="ns")
expected = (
expected.replace(',"tz":"UTC"', "").rstrip("}")
+ ',"pagination":{"limit":null,"offset":null,"next":null}}'
)

assert response.status_code == 200
assert actual == expected
assert actual == api_test_data["expected_agg"]


async def test_api_circular_standard_deviation_post_validation_error(
mocker: MockerFixture,
mocker: MockerFixture, api_test_data
):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
mocker = mocker_setup(mocker, MOCK_METHOD, test_data)
mocker = mocker_setup(mocker, MOCK_METHOD, api_test_data["mock_data_agg"])

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
response = await ac.post(
Expand All @@ -170,16 +134,14 @@ async def test_api_circular_standard_deviation_post_validation_error(
)


async def test_api_circular_standard_deviation_post_error(mocker: MockerFixture):
test_data = pd.DataFrame(
{
"EventTime": [datetime.now(timezone.utc)],
"TagName": ["TestTag"],
"Value": [1.01],
}
)
async def test_api_circular_standard_deviation_post_error(
mocker: MockerFixture, api_test_data
):
mocker = mocker_setup(
mocker, MOCK_METHOD, test_data, Exception("Error Connecting to Database")
mocker,
MOCK_METHOD,
api_test_data["mock_data_agg"],
Exception("Error Connecting to Database"),
)

async with AsyncClient(app=app, base_url=BASE_URL) as ac:
Expand Down
Loading