Skip to content

Commit b735f46

Browse files
committed
fixes tests
1 parent 78f1421 commit b735f46

File tree

6 files changed

+38
-27
lines changed

6 files changed

+38
-27
lines changed

packages/models-library/src/models_library/rest_ordering.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from .basic_types import IDStr
88
from .rest_base import RequestParameters
9-
from .utils.common_validators import load_if_json_encoded_pre_validator
9+
from .utils.common_validators import parse_json_pre_validator
1010

1111

1212
class OrderDirection(str, Enum):
@@ -77,7 +77,7 @@ class _OrderQueryParams(_BaseOrderQueryParams):
7777
)
7878

7979
_pre_parse_string = validator("order_by", allow_reuse=True, pre=True)(
80-
load_if_json_encoded_pre_validator
80+
parse_json_pre_validator
8181
)
8282

8383
return _OrderQueryParams

packages/models-library/src/models_library/utils/common_validators.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class MyModel(BaseModel):
2020
import operator
2121
from typing import Any
2222

23+
from orjson import JSONDecodeError
24+
2325
from .json_serialization import json_loads
2426

2527

@@ -41,10 +43,13 @@ def none_to_empty_list_pre_validator(value: Any):
4143
return value
4244

4345

44-
def load_if_json_encoded_pre_validator(value: Any):
46+
def parse_json_pre_validator(value: Any):
4547
if isinstance(value, str):
46-
# raises JsonEncoderError which is a TypeError
47-
return json_loads(value)
48+
try:
49+
return json_loads(value)
50+
except JSONDecodeError as err:
51+
msg = f"Invalid JSON {value=}: {err}"
52+
raise TypeError(msg) from err
4853
return value
4954

5055

packages/pytest-simcore/src/pytest_simcore/helpers/assert_checks.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,13 @@ def _do_assert_error(
8282

8383
assert is_error(expected_status_code)
8484

85-
assert len(error["errors"]) == 1
86-
87-
err = error["errors"][0]
85+
assert len(error["errors"]) >= 1
8886
if expected_msg:
89-
assert expected_msg in err["message"]
87+
messages = [detail["message"] for detail in error["errors"]]
88+
assert expected_msg in messages
9089

9190
if expected_error_code:
92-
assert expected_error_code == err["code"]
91+
codes = [detail["code"] for detail in error["errors"]]
92+
assert expected_error_code in codes
9393

9494
return data, error

packages/service-library/tests/aiohttp/test_requests_validation.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ async def test_parse_request_with_invalid_headers_params(
363363

364364
def test_parse_request_query_parameters_as_with_order_by_query_models():
365365

366-
OrderByModel = create_ordering_query_model_classes(
366+
OrderQueryModel = create_ordering_query_model_classes(
367367
ordering_fields={"modified", "name"}, default=OrderBy(field="name")
368368
)
369369

@@ -373,12 +373,5 @@ def test_parse_request_query_parameters_as_with_order_by_query_models():
373373

374374
request = make_mocked_request("GET", path=f"{url}")
375375

376-
query_params = parse_request_query_parameters_as(OrderByModel, request)
376+
query_params = parse_request_query_parameters_as(OrderQueryModel, request)
377377
assert query_params.order_by == expected
378-
379-
expected_schema = {"type": "string", "format": "json-string"}
380-
assert {
381-
k: v
382-
for k, v in OrderByModel.schema()["properties"]["order_by"]
383-
if k in expected
384-
} == expected_schema

packages/service-library/tests/fastapi/test_request_decorators.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
import subprocess
77
import sys
88
import time
9+
from collections.abc import Callable, Iterator
910
from contextlib import contextmanager
1011
from pathlib import Path
11-
from typing import Callable, Iterator, NamedTuple
12+
from typing import NamedTuple
1213

1314
import pytest
1415
import requests

services/web/server/tests/unit/with_dbs/03/resource_usage/test_usage_services__list.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626

2727
_SERVICE_RUN_GET = ServiceRunPage(
2828
items=[
29-
ServiceRunGet(
30-
**{
29+
ServiceRunGet.parse_obj(
30+
{
3131
"service_run_id": "comp_1_5c2110be-441b-11ee-a0e8-02420a000040_1",
3232
"wallet_id": 1,
3333
"wallet_name": "the super wallet!",
@@ -55,12 +55,11 @@
5555

5656
@pytest.fixture
5757
def mock_list_usage_services(mocker: MockerFixture) -> tuple:
58-
mock_list_usage = mocker.patch(
58+
return mocker.patch(
5959
"simcore_service_webserver.resource_usage._service_runs_api.service_runs.get_service_run_page",
6060
spec=True,
6161
return_value=_SERVICE_RUN_GET,
6262
)
63-
return mock_list_usage
6463

6564

6665
@pytest.fixture()
@@ -79,7 +78,10 @@ def setup_wallets_db(
7978
.returning(sa.literal_column("*"))
8079
)
8180
row = result.fetchone()
81+
assert row
82+
8283
yield cast(int, row[0])
84+
8385
con.execute(wallets.delete())
8486

8587

@@ -160,6 +162,8 @@ async def test_list_service_usage_with_order_by_query_param(
160162
setup_wallets_db,
161163
mock_list_usage_services,
162164
):
165+
assert client.app
166+
163167
# without any additional query parameter
164168
url = client.app.router["list_resource_usage_services"].url_for()
165169
resp = await client.get(f"{url}")
@@ -237,9 +241,13 @@ async def test_list_service_usage_with_order_by_query_param(
237241
_, error = await assert_status(resp, status.HTTP_422_UNPROCESSABLE_ENTITY)
238242
assert mock_list_usage_services.called
239243
assert error["status"] == status.HTTP_422_UNPROCESSABLE_ENTITY
240-
assert error["errors"][0]["message"].startswith(
241-
"value is not a valid enumeration member"
242-
)
244+
245+
errors = {(e["code"], e["field"]) for e in error["errors"]}
246+
assert {
247+
("value_error", "order_by.field"),
248+
("type_error.enum", "order_by.direction"),
249+
} == errors
250+
assert len(errors) == 2
243251

244252
# without field
245253
_filter = {"direction": "asc"}
@@ -253,6 +261,8 @@ async def test_list_service_usage_with_order_by_query_param(
253261
assert mock_list_usage_services.called
254262
assert error["status"] == status.HTTP_422_UNPROCESSABLE_ENTITY
255263
assert error["errors"][0]["message"].startswith("field required")
264+
assert error["errors"][0]["code"] == "value_error.missing"
265+
assert error["errors"][0]["field"] == "order_by.field"
256266

257267

258268
@pytest.mark.parametrize("user_role", [(UserRole.USER)])
@@ -262,6 +272,8 @@ async def test_list_service_usage_with_filters_query_param(
262272
setup_wallets_db,
263273
mock_list_usage_services,
264274
):
275+
assert client.app
276+
265277
# with unable to decode filter query parameter
266278
url = (
267279
client.app.router["list_resource_usage_services"]

0 commit comments

Comments
 (0)