Skip to content

Commit 0d89516

Browse files
committed
refactor: simplify user creation in tests by utilizing sync_insert_and_get_user_and_secrets_lifespan and removing unused asyncpg_storage_system_mock fixture
1 parent 4f79051 commit 0d89516

File tree

4 files changed

+55
-35
lines changed

4 files changed

+55
-35
lines changed

packages/pytest-simcore/src/pytest_simcore/db_entries_mocks.py

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# pylint:disable=redefined-outer-name
44
# pylint:disable=no-value-for-parameter
55

6+
import contextlib
67
from collections.abc import AsyncIterator, Awaitable, Callable, Iterator
78
from typing import Any
89
from uuid import uuid4
@@ -19,14 +20,15 @@
1920
from simcore_postgres_database.models.projects import ProjectType, projects
2021
from simcore_postgres_database.models.projects_to_products import projects_to_products
2122
from simcore_postgres_database.models.services import services_access_rights
22-
from simcore_postgres_database.models.users import UserRole, UserStatus, users
23+
from simcore_postgres_database.models.users import UserRole, UserStatus
2324
from simcore_postgres_database.utils_projects_nodes import (
2425
ProjectNodeCreate,
2526
ProjectNodesRepo,
2627
)
2728
from sqlalchemy.ext.asyncio import AsyncEngine
2829

2930
from .helpers.postgres_tools import insert_and_get_row_lifespan
31+
from .helpers.postgres_users import sync_insert_and_get_user_and_secrets_lifespan
3032

3133

3234
@pytest.fixture()
@@ -35,36 +37,27 @@ def create_registered_user(
3537
) -> Iterator[Callable[..., dict]]:
3638
created_user_ids = []
3739

38-
def _(**user_kwargs) -> dict[str, Any]:
39-
with postgres_db.connect() as con:
40-
# removes all users before continuing
41-
user_config = {
42-
"id": len(created_user_ids) + 1,
43-
"name": faker.name(),
44-
"email": faker.email(),
45-
"password_hash": faker.password(),
46-
"status": UserStatus.ACTIVE,
47-
"role": UserRole.USER,
48-
}
49-
user_config.update(user_kwargs)
40+
with contextlib.ExitStack() as stack:
5041

51-
con.execute(
52-
users.insert().values(user_config).returning(sa.literal_column("*"))
53-
)
54-
# this is needed to get the primary_gid correctly
55-
result = con.execute(
56-
sa.select(users).where(users.c.id == user_config["id"])
42+
def _(**user_kwargs) -> dict[str, Any]:
43+
44+
user_id = len(created_user_ids) + 1
45+
user = stack.enter_context(
46+
sync_insert_and_get_user_and_secrets_lifespan(
47+
postgres_db,
48+
status=UserStatus.ACTIVE,
49+
role=UserRole.USER,
50+
**user_kwargs,
51+
)
5752
)
58-
user = result.first()
59-
assert user
53+
6054
print(f"--> created {user=}")
55+
assert user["id"] == user_id
6156
created_user_ids.append(user["id"])
62-
return dict(user._asdict())
57+
return user
6358

64-
yield _
59+
yield _
6560

66-
with postgres_db.connect() as con:
67-
con.execute(users.delete().where(users.c.id.in_(created_user_ids)))
6861
print(f"<-- deleted users {created_user_ids=}")
6962

7063

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

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import contextlib
22

3+
import sqlalchemy as sa
34
from simcore_postgres_database.models.users import users
45
from simcore_postgres_database.models.users_secrets import users_secrets
56
from sqlalchemy.ext.asyncio import AsyncEngine
67

78
from .faker_factories import random_user, random_user_secrets
8-
from .postgres_tools import insert_and_get_row_lifespan
9+
from .postgres_tools import (
10+
insert_and_get_row_lifespan,
11+
sync_insert_and_get_row_lifespan,
12+
)
913

1014

1115
def _get_kwargs_from_overrides(overrides: dict) -> tuple[dict, dict]:
@@ -48,6 +52,38 @@ async def insert_and_get_user_and_secrets_lifespan(
4852
yield {**user, **secrets}
4953

5054

55+
@contextlib.contextmanager
56+
def sync_insert_and_get_user_and_secrets_lifespan(
57+
sqlalchemy_sync_engine: sa.engine.Engine, **overrides
58+
):
59+
user_kwargs, secrets_kwargs = _get_kwargs_from_overrides(overrides)
60+
61+
with contextlib.ExitStack() as stack:
62+
# users
63+
user = stack.enter_context(
64+
sync_insert_and_get_row_lifespan(
65+
sqlalchemy_sync_engine,
66+
table=users,
67+
values=random_user(**user_kwargs),
68+
pk_col=users.c.id,
69+
)
70+
)
71+
72+
# users_secrets
73+
secrets = stack.enter_context(
74+
sync_insert_and_get_row_lifespan(
75+
sqlalchemy_sync_engine,
76+
table=users_secrets,
77+
values=random_user_secrets(user_id=user["id"], **secrets_kwargs),
78+
pk_col=users_secrets.c.user_id,
79+
)
80+
)
81+
82+
assert secrets.pop("user_id", None) == user["id"]
83+
84+
yield {**user, **secrets}
85+
86+
5187
async def insert_user_and_secrets(conn, **overrides) -> int:
5288
# NOTE: Legacy adapter. Use insert_and_get_user_and_secrets_lifespan instead
5389
# Temporarily used where conn is produce by aiopg_engine

services/web/server/tests/unit/with_dbs/04/garbage_collector/test_resource_manager.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,6 @@ async def test_interactive_services_removed_per_project(
673673
mocked_notification_system,
674674
socketio_client_factory: Callable,
675675
client_session_id_factory: Callable[[], str],
676-
asyncpg_storage_system_mock,
677676
storage_subsystem_mock, # when guest user logs out garbage is collected
678677
expected_save_state: bool,
679678
open_project: Callable,

services/web/server/tests/unit/with_dbs/conftest.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -420,14 +420,6 @@ async def _mock_result() -> None:
420420
return MockedStorageSubsystem(mock, mock1, mock2, mock3)
421421

422422

423-
@pytest.fixture
424-
def asyncpg_storage_system_mock(mocker):
425-
return mocker.patch(
426-
"simcore_service_webserver.login._login_repository_legacy.AsyncpgStorage.delete_user",
427-
return_value="",
428-
)
429-
430-
431423
@pytest.fixture
432424
async def mocked_dynamic_services_interface(
433425
mocker: MockerFixture,

0 commit comments

Comments
 (0)