Skip to content

Commit e0c83b0

Browse files
fix tests
1 parent b74c9f4 commit e0c83b0

File tree

4 files changed

+75
-7
lines changed

4 files changed

+75
-7
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
from collections.abc import AsyncIterable, Iterable
55
from typing import Final
6+
from common_library.pydantic_networks_extension import AnyHttpUrlLegacy
67

78
import arrow
89
import pytest
@@ -77,7 +78,8 @@ async def thick_client(request_timeout: int) -> AsyncIterable[FakeThickClient]:
7778

7879
@pytest.fixture
7980
def test_url() -> str:
80-
return str(TypeAdapter(AnyHttpUrl).validate_python("http://missing-host:1111"))
81+
url =TypeAdapter(AnyHttpUrlLegacy).validate_python("http://missing-host:1111")
82+
return f"{url}"
8183

8284

8385
async def test_connection_error(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_exclusive_min_openapi_issue(app: FastAPI):
4444

4545
def test_overriding_openapi_method(app: FastAPI):
4646
assert not hasattr(app, "_original_openapi")
47-
assert app.openapi.__doc__ is None
47+
#assert app.openapi.__doc__ is None # PC why was this set to check that it is none? it's coming from the base fastapi applicaiton and now they provide some docs
4848

4949
override_fastapi_openapi_method(app)
5050

packages/simcore-sdk/src/simcore_sdk/node_ports_v2/nodeports_v2.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
from asyncio import Task
2+
import traceback
13
import logging
24
from collections.abc import Callable, Coroutine
35
from pathlib import Path
46
from typing import Any
57

8+
from pydantic_core import InitErrorDetails
9+
610
from models_library.api_schemas_storage import LinkType
711
from models_library.basic_types import IDStr
812
from models_library.projects import ProjectIDStr
@@ -26,6 +30,16 @@
2630
log = logging.getLogger(__name__)
2731

2832

33+
def _format_error(task:Task)-> str:
34+
# pylint:disable=protected-access
35+
assert task._exception #nosec
36+
error_list= traceback.format_exception(type(task._exception), task._exception, task._exception.__traceback__)
37+
return "\n".join(error_list)
38+
39+
def _get_error_details(task:Task, port_key:str)->InitErrorDetails:
40+
# pylint:disable=protected-access
41+
return InitErrorDetails(type="value_error", loc=(f"{port_key}",), input=_format_error(task), ctx={"error":task._exception})
42+
2943
class Nodeports(BaseModel):
3044
"""
3145
Represents a node in a project and all its input/output ports
@@ -180,9 +194,8 @@ async def set_multiple(
180194
await self.save_to_db_cb(self)
181195

182196
# groups all ValidationErrors pre-pending 'port_key' to loc and raises ValidationError
183-
if errors := [
184-
list(flatten_errors([r], self.__config__, loc=(f"{port_key}",)))
197+
if error_details:= [
198+
_get_error_details(r, port_key)
185199
for port_key, r in zip(port_values.keys(), results)
186-
if isinstance(r, ValidationError)
187200
]:
188-
raise ValidationError(errors, model=type(self))
201+
raise ValidationError.from_exception_data(title="Multiple port_key errors",line_errors=error_details)

packages/simcore-sdk/tests/unit/test_node_ports_v2_nodeports_v2.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
# pylint:disable=redefined-outer-name
44
# pylint:disable=protected-access
55

6+
import asyncio
67
from pathlib import Path
78
from typing import Any, Callable
89

10+
from pydantic import ValidationError
911
import pytest
1012
from faker import Faker
1113
from pytest_mock import MockFixture
@@ -14,7 +16,7 @@
1416
from simcore_sdk.node_ports_v2 import Nodeports, exceptions, ports
1517
from simcore_sdk.node_ports_v2.ports_mapping import InputsList, OutputsList
1618
from utils_port_v2 import create_valid_port_mapping
17-
19+
from pytest_mock import MockerFixture
1820

1921
@pytest.mark.parametrize(
2022
"auto_update",
@@ -221,3 +223,54 @@ async def test_node_ports_v2_packages(
221223
db_manager = mock_db_manager(default_configuration)
222224
node_ports = await ports(user_id, project_id, node_uuid)
223225
node_ports = await ports(user_id, project_id, node_uuid, db_manager=db_manager)
226+
227+
228+
@pytest.fixture
229+
def mock_port_set(mocker: MockFixture)->None:
230+
async def _always_raise_error(*args, **kwargs):
231+
async def _i_raise_errors():
232+
raise ValidationError("invalid")
233+
return asyncio.create_task(_i_raise_errors())
234+
235+
mocker.patch("simcore_sdk.node_ports_v2.port.Port._set", side_effect=_always_raise_error)
236+
237+
async def test_node_ports_v2_set_multiple_catch_multiple_failing_set_ports(
238+
mock_port_set:None,
239+
mock_db_manager: Callable,
240+
default_configuration: dict[str, Any],
241+
user_id: int,
242+
project_id: str,
243+
node_uuid: str,
244+
faker: Faker,
245+
):
246+
db_manager = mock_db_manager(default_configuration)
247+
248+
original_inputs = create_valid_port_mapping(InputsList, suffix="original")
249+
original_outputs = create_valid_port_mapping(OutputsList, suffix="original")
250+
251+
252+
async def _mock_callback(*args,**kwargs):
253+
pass
254+
255+
node_ports = Nodeports(
256+
inputs=original_inputs,
257+
outputs=original_outputs,
258+
db_manager=db_manager,
259+
user_id=user_id,
260+
project_id=project_id,
261+
node_uuid=node_uuid,
262+
io_log_redirect_cb=None,
263+
save_to_db_cb=_mock_callback,
264+
node_port_creator_cb=_mock_callback,
265+
auto_update=False,
266+
)
267+
async with ProgressBarData(num_steps=1, description=faker.pystr()) as progress_bar:
268+
with pytest.raises(ValidationError):
269+
await node_ports.set_multiple(
270+
{
271+
port.key: (port.value, None)
272+
for port in list(original_inputs.values())
273+
+ list(original_outputs.values())
274+
},
275+
progress_bar=progress_bar,
276+
)

0 commit comments

Comments
 (0)