Skip to content

Commit 42f82d4

Browse files
committed
deepdiff
1 parent 2863bfa commit 42f82d4

File tree

4 files changed

+107
-60
lines changed

4 files changed

+107
-60
lines changed

services/web/server/tests/unit/with_dbs/02/test_projects_crud_handlers.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import sqlalchemy as sa
1616
from aiohttp.test_utils import TestClient
1717
from aioresponses import aioresponses
18+
from deepdiff import DeepDiff
1819
from faker import Faker
1920
from models_library.api_schemas_directorv2.dynamic_services import (
2021
GetProjectInactivityResponse,
@@ -23,7 +24,10 @@
2324
from models_library.products import ProductName
2425
from pydantic import TypeAdapter
2526
from pytest_mock import MockerFixture
26-
from pytest_simcore.helpers.assert_checks import assert_status
27+
from pytest_simcore.helpers.assert_checks import (
28+
assert_equal_ignoring_none,
29+
assert_status,
30+
)
2731
from pytest_simcore.helpers.webserver_parametrizations import (
2832
ExpectedResponse,
2933
MockedStorageSubsystem,
@@ -174,7 +178,9 @@ async def _assert_get_same_project(
174178
project_permalink = data.pop("permalink", None)
175179
folder_id = data.pop("folderId", None)
176180

177-
assert data == {k: project[k] for k in data}
181+
assert not DeepDiff(
182+
data, {k: project[k] for k in data}, exclude_paths="root['lastChangeDate']"
183+
)
178184

179185
if project_state:
180186
assert ProjectStateOutputSchema.model_validate(project_state)
@@ -215,7 +221,11 @@ async def test_list_projects(
215221
project_permalink = got.pop("permalink")
216222
folder_id = got.pop("folderId")
217223

218-
assert got == {k: template_project[k] for k in got}
224+
assert not DeepDiff(
225+
got,
226+
{k: template_project[k] for k in got},
227+
exclude_paths="root['lastChangeDate']",
228+
)
219229

220230
assert not ProjectStateOutputSchema(
221231
**project_state
@@ -228,7 +238,11 @@ async def test_list_projects(
228238
project_permalink = got.pop("permalink", None)
229239
folder_id = got.pop("folderId")
230240

231-
assert got == {k: user_project[k] for k in got}
241+
assert not DeepDiff(
242+
got,
243+
{k: user_project[k] for k in got},
244+
exclude_paths="root['lastChangeDate']",
245+
)
232246

233247
assert ProjectStateOutputSchema(**project_state)
234248
assert project_permalink is None
@@ -245,7 +259,12 @@ async def test_list_projects(
245259
project_permalink = got.pop("permalink", None)
246260
folder_id = got.pop("folderId")
247261

248-
assert got == {k: user_project[k] for k in got}
262+
assert not DeepDiff(
263+
got,
264+
{k: user_project[k] for k in got},
265+
exclude_paths="root['lastChangeDate']",
266+
)
267+
249268
assert not ProjectStateOutputSchema(
250269
**project_state
251270
).share_state.locked, "Single user does not lock"
@@ -263,7 +282,11 @@ async def test_list_projects(
263282
project_permalink = got.pop("permalink")
264283
folder_id = got.pop("folderId")
265284

266-
assert got == {k: template_project[k] for k in got}
285+
assert not DeepDiff(
286+
got,
287+
{k: template_project[k] for k in got},
288+
exclude_paths="root['lastChangeDate']",
289+
)
267290
assert not ProjectStateOutputSchema(
268291
**project_state
269292
).share_state.locked, "Templates are not locked"
@@ -632,7 +655,7 @@ async def test_new_template_from_project(
632655
)
633656

634657
assert len(templates) == 1
635-
assert templates[0] == template_project
658+
assert_equal_ignoring_none(template_project, templates[0])
636659

637660
assert template_project["name"] == user_project["name"]
638661
assert template_project["description"] == user_project["description"]

services/web/server/tests/unit/with_dbs/02/test_projects_nodes_handlers__patch.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import pytest
1414
from aiohttp.test_utils import TestClient
15+
from deepdiff import DeepDiff
1516
from pytest_mock.plugin import MockerFixture
1617
from pytest_simcore.helpers.assert_checks import assert_status
1718
from pytest_simcore.helpers.webserver_users import UserInfoDict
@@ -168,7 +169,9 @@ async def test_patch_project_node(
168169
"output_1": {
169170
"store": 0,
170171
"path": "9934cba6-4b51-11ef-968a-02420a00f1c1/571ffc8d-fa6e-411f-afc8-9c62d08dd2fa/matus.txt",
172+
"label": "matus.txt",
171173
"eTag": "d41d8cd98f00b204e9800998ecf8427e",
174+
"dataset": None,
172175
}
173176
}
174177
}
@@ -185,7 +188,6 @@ async def test_patch_project_node(
185188
_tested_node = data["workbench"][node_id]
186189

187190
assert _tested_node["label"] == "testing-string"
188-
assert _tested_node["progress"] is None
189191
assert _tested_node["key"] == _patch_key["key"]
190192
assert _tested_node["version"] == _patch_version["version"]
191193
assert _tested_node["inputs"] == _patch_inputs["inputs"]
@@ -262,10 +264,14 @@ async def test_patch_project_node_inputs_notifies(
262264
await assert_status(resp, expected)
263265
assert mocked_notify_project_node_update.call_count > 1
264266
# 1 message per node updated
265-
assert [
266-
call_args[0][2]
267-
for call_args in mocked_notify_project_node_update.await_args_list
268-
] == list(user_project["workbench"].keys())
267+
assert not DeepDiff(
268+
[
269+
call_args[0][2]
270+
for call_args in mocked_notify_project_node_update.await_args_list
271+
],
272+
list(user_project["workbench"].keys()),
273+
ignore_order=True,
274+
)
269275

270276

271277
@pytest.mark.parametrize(

services/web/server/tests/unit/with_dbs/02/test_projects_ports_handlers.py

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import pytest
1313
from aiohttp.test_utils import TestClient
1414
from aioresponses import aioresponses as AioResponsesMock # noqa: N812
15+
from deepdiff import DeepDiff
1516
from models_library.api_schemas_directorv2.computations import TasksOutputs
1617
from models_library.api_schemas_webserver.projects import ProjectGet
1718
from models_library.utils.fastapi_encoders import jsonable_encoder
@@ -74,7 +75,7 @@ def mock_directorv2_service_api_responses(
7475
return aioresponses_mocker
7576

7677

77-
@pytest.mark.acceptance_test()
78+
@pytest.mark.acceptance_test
7879
@pytest.mark.parametrize(
7980
"user_role,expected",
8081
[
@@ -109,55 +110,62 @@ async def test_io_workflow(
109110
ports_meta, error = await assert_status(resp, expected_status_code=expected)
110111

111112
if not error:
112-
assert ports_meta == [
113-
{
114-
"key": "38a0d401-af4b-4ea7-ab4c-5005c712a546",
115-
"kind": "input",
116-
"content_schema": {
117-
"description": "Input integer value",
118-
"title": "X",
119-
"type": "integer",
113+
diff = DeepDiff(
114+
ports_meta,
115+
[
116+
{
117+
"key": "38a0d401-af4b-4ea7-ab4c-5005c712a546",
118+
"kind": "input",
119+
"content_schema": {
120+
"description": "Input integer value",
121+
"title": "X",
122+
"type": "integer",
123+
},
120124
},
121-
},
122-
{
123-
"key": "fc48252a-9dbb-4e07-bf9a-7af65a18f612",
124-
"kind": "input",
125-
"content_schema": {
126-
"description": "Input integer value",
127-
"title": "Z",
128-
"type": "integer",
125+
{
126+
"key": "fc48252a-9dbb-4e07-bf9a-7af65a18f612",
127+
"kind": "input",
128+
"content_schema": {
129+
"description": "Input integer value",
130+
"title": "Z",
131+
"type": "integer",
132+
},
129133
},
130-
},
131-
{
132-
"key": "7bf0741f-bae4-410b-b662-fc34b47c27c9",
133-
"kind": "input",
134-
"content_schema": {
135-
"description": "Input boolean value",
136-
"title": "on",
137-
"type": "boolean",
134+
{
135+
"key": "7bf0741f-bae4-410b-b662-fc34b47c27c9",
136+
"kind": "input",
137+
"content_schema": {
138+
"description": "Input boolean value",
139+
"title": "on",
140+
"type": "boolean",
141+
},
138142
},
139-
},
140-
{
141-
"key": "09fd512e-0768-44ca-81fa-0cecab74ec1a",
142-
"kind": "output",
143-
"content_schema": {
144-
"description": "Output integer value",
145-
"title": "Random sleep interval_2",
146-
"type": "integer",
143+
{
144+
"key": "09fd512e-0768-44ca-81fa-0cecab74ec1a",
145+
"kind": "output",
146+
"content_schema": {
147+
"description": "Output integer value",
148+
"title": "Random sleep interval_2",
149+
"type": "integer",
150+
},
147151
},
148-
},
149-
{
150-
"key": "76f607b4-8761-4f96-824d-cab670bc45f5",
151-
"kind": "output",
152-
"content_schema": {
153-
"description": "Output integer value",
154-
"title": "Random sleep interval",
155-
"type": "integer",
152+
{
153+
"key": "76f607b4-8761-4f96-824d-cab670bc45f5",
154+
"kind": "output",
155+
"content_schema": {
156+
"description": "Output integer value",
157+
"title": "Random sleep interval",
158+
"type": "integer",
159+
},
156160
},
157-
},
158-
]
161+
],
162+
ignore_order=True,
163+
)
159164

160-
assert ports_meta == PROJECTS_METADATA_PORTS_RESPONSE_BODY_DATA
165+
assert not diff
166+
assert not DeepDiff(
167+
ports_meta, PROJECTS_METADATA_PORTS_RESPONSE_BODY_DATA, ignore_order=True
168+
)
161169

162170
# get_project_inputs
163171
expected_url = client.app.router["get_project_inputs"].url_for(

services/web/server/tests/unit/with_dbs/02/test_projects_states_handlers.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import sqlalchemy as sa
2323
from aiohttp import ClientResponse
2424
from aiohttp.test_utils import TestClient, TestServer
25+
from deepdiff import DeepDiff # type: ignore[attr-defined]
2526
from faker import Faker
2627
from models_library.api_schemas_directorv2.dynamic_services import DynamicServiceGet
2728
from models_library.api_schemas_dynamic_scheduler.dynamic_services import (
@@ -95,10 +96,15 @@ def assert_replaced(current_project, update_data):
9596
def _extract(dikt, keys):
9697
return {k: dikt[k] for k in keys}
9798

98-
modified = [
99+
skip = [
99100
"lastChangeDate",
101+
"templateType",
102+
"trashedAt",
103+
"trashedBy",
104+
"workspaceId",
105+
"folderId",
100106
]
101-
keep = [k for k in update_data if k not in modified]
107+
keep = [k for k in update_data if k not in skip]
102108

103109
assert _extract(current_project, keep) == _extract(update_data, keep)
104110

@@ -1200,7 +1206,7 @@ async def test_get_active_project(
12001206
)
12011207
assert not error
12021208
assert ProjectStateOutputSchema(**data.pop("state")).share_state.locked
1203-
data.pop("folderId")
1209+
data.pop("folderId", None)
12041210

12051211
user_project_last_change_date = user_project.pop("lastChangeDate")
12061212
data_last_change_date = data.pop("lastChangeDate")
@@ -2114,7 +2120,11 @@ async def test_open_shared_project_at_same_time(
21142120
elif data:
21152121
project_status = ProjectStateOutputSchema(**data.pop("state"))
21162122
data.pop("folderId")
2117-
assert data == {k: shared_project[k] for k in data}
2123+
assert not DeepDiff(
2124+
data,
2125+
{k: shared_project[k] for k in data},
2126+
exclude_paths=["root['lastChangeDate']"],
2127+
)
21182128
assert project_status.share_state.locked
21192129
assert project_status.share_state.current_user_groupids
21202130
assert len(project_status.share_state.current_user_groupids) == 1

0 commit comments

Comments
 (0)