Skip to content

Commit 14cd0ae

Browse files
committed
insert_user_and_secrets
1 parent 9a1ce97 commit 14cd0ae

File tree

6 files changed

+73
-26
lines changed

6 files changed

+73
-26
lines changed

packages/postgres-database/tests/conftest.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@
1818
from aiopg.sa.engine import Engine
1919
from aiopg.sa.result import ResultProxy, RowProxy
2020
from faker import Faker
21-
from pytest_simcore.helpers import postgres_tools
21+
from pytest_simcore.helpers import postgres_tools, postgres_users
2222
from pytest_simcore.helpers.faker_factories import (
2323
random_group,
2424
random_project,
25-
random_user,
2625
)
2726
from simcore_postgres_database.models.products import products
2827
from simcore_postgres_database.models.projects import projects
@@ -268,10 +267,11 @@ def create_fake_user(sync_engine: sqlalchemy.engine.Engine) -> Iterator[Callable
268267
async def _creator(
269268
conn: SAConnection, group: RowProxy | None = None, **overrides
270269
) -> RowProxy:
271-
user_id = await conn.scalar(
272-
users.insert().values(**random_user(**overrides)).returning(users.c.id)
270+
271+
user_id = await postgres_users.insert_user_and_secrets(
272+
conn,
273+
**overrides,
273274
)
274-
assert user_id is not None
275275

276276
# This is done in two executions instead of one (e.g. returning(literal_column("*")) )
277277
# to allow triggering function in db that

packages/postgres-database/tests/test_models_api_keys.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import sqlalchemy as sa
1010
from aiopg.sa.connection import SAConnection
1111
from aiopg.sa.result import RowProxy
12+
from pytest_simcore.helpers import postgres_users
1213
from pytest_simcore.helpers.faker_factories import (
1314
random_api_auth,
1415
random_product,
15-
random_user,
1616
)
1717
from simcore_postgres_database.models.api_keys import api_keys
1818
from simcore_postgres_database.models.products import products
@@ -21,13 +21,12 @@
2121

2222
@pytest.fixture
2323
async def user_id(connection: SAConnection) -> AsyncIterable[int]:
24-
uid = await connection.scalar(
25-
users.insert().values(random_user()).returning(users.c.id)
26-
)
27-
assert uid
28-
yield uid
24+
user_id = await postgres_users.insert_user_and_secrets(connection)
25+
26+
assert user_id
27+
yield user_id
2928

30-
await connection.execute(users.delete().where(users.c.id == uid))
29+
await connection.execute(users.delete().where(users.c.id == user_id))
3130

3231

3332
@pytest.fixture
@@ -84,7 +83,10 @@ async def test_get_session_identity_for_api_server(
8483
# authorize a session
8584
#
8685
result = await connection.execute(
87-
sa.select(api_keys.c.user_id, api_keys.c.product_name,).where(
86+
sa.select(
87+
api_keys.c.user_id,
88+
api_keys.c.product_name,
89+
).where(
8890
(api_keys.c.api_key == session_auth.api_key)
8991
& (api_keys.c.api_secret == session_auth.api_secret),
9092
)

packages/postgres-database/tests/test_models_groups.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from aiopg.sa.connection import SAConnection
1111
from aiopg.sa.result import ResultProxy, RowProxy
1212
from psycopg2.errors import ForeignKeyViolation, RaiseException, UniqueViolation
13-
from pytest_simcore.helpers.faker_factories import random_user
13+
from pytest_simcore.helpers import postgres_users
1414
from simcore_postgres_database.webserver_models import (
1515
GroupType,
1616
groups,
@@ -64,9 +64,8 @@ async def test_all_group(
6464
await connection.execute(groups.delete().where(groups.c.gid == all_group_gid))
6565

6666
# check adding a user is automatically added to the all group
67-
result = await connection.execute(
68-
users.insert().values(**random_user()).returning(literal_column("*"))
69-
)
67+
user_id = await postgres_users.insert_user_and_secrets(connection)
68+
result = await connection.execute(users.select().where(users.c.id == user_id))
7069
user: RowProxy = await result.fetchone()
7170

7271
result = await connection.execute(
@@ -98,9 +97,8 @@ async def test_all_group(
9897
async def test_own_group(
9998
connection: SAConnection,
10099
):
101-
result = await connection.execute(
102-
users.insert().values(**random_user()).returning(literal_column("*"))
103-
)
100+
user_id = await postgres_users.insert_user_and_secrets(connection)
101+
result = await connection.execute(users.select().where(users.c.id == user_id))
104102
user: RowProxy = await result.fetchone()
105103
assert not user.primary_gid
106104

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

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,7 @@ def _compute_hash(password: str) -> str:
5555
_DEFAULT_HASH = _compute_hash(DEFAULT_TEST_PASSWORD)
5656

5757

58-
def random_user(
59-
fake: Faker = DEFAULT_FAKER, password: str | None = None, **overrides
60-
) -> dict[str, Any]:
58+
def random_user(fake: Faker = DEFAULT_FAKER, **overrides) -> dict[str, Any]:
6159
from simcore_postgres_database.models.users import users
6260
from simcore_postgres_database.webserver_models import UserStatus
6361

@@ -67,12 +65,34 @@ def random_user(
6765
# NOTE: ensures user name is unique to avoid flaky tests
6866
"name": f"{fake.user_name()}_{fake.uuid4()}",
6967
"email": f"{fake.uuid4()}_{fake.email().lower()}",
70-
"password_hash": _DEFAULT_HASH,
7168
"status": UserStatus.ACTIVE,
7269
}
73-
7470
assert set(data.keys()).issubset({c.name for c in users.columns})
7571

72+
data.update(overrides)
73+
return data
74+
75+
76+
def random_user_secrets(
77+
fake: Faker = DEFAULT_FAKER,
78+
*,
79+
# foreign keys
80+
user_id: int,
81+
password: str | None = None,
82+
**overrides,
83+
) -> dict[str, Any]:
84+
from simcore_postgres_database.models.users_secrets import users_secrets
85+
86+
assert fake # nosec
87+
88+
assert set(overrides.keys()).issubset({c.name for c in users_secrets.columns})
89+
90+
data = {
91+
"user_id": user_id,
92+
"password_hash": _DEFAULT_HASH,
93+
}
94+
assert set(data.keys()).issubset({c.name for c in users_secrets.columns})
95+
7696
# transform password in hash
7797
if password:
7898
assert len(password) >= 12
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from common_library.async_tools import maybe_await
2+
from simcore_postgres_database.models.users import users
3+
from simcore_postgres_database.models.users_secrets import users_secrets
4+
5+
from .faker_factories import random_user, random_user_secrets
6+
7+
8+
async def insert_user_and_secrets(conn, **overrides) -> int:
9+
password = overrides.pop("password")
10+
# user data
11+
user_id = await maybe_await(
12+
conn.scalar(
13+
users.insert().values(**random_user(**overrides)).returning(users.c.id)
14+
)
15+
)
16+
assert user_id is not None
17+
18+
# secrets
19+
await maybe_await(
20+
conn.execute(
21+
users_secrets.insert()
22+
.values(**random_user_secrets(user_id=user_id, password=password))
23+
.returning(users.c.id)
24+
)
25+
)
26+
27+
return user_id

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
from typing import Any, TypedDict
44

55
from aiohttp import web
6+
from common_library.users_enums import UserRole, UserStatus
67
from models_library.users import UserID
78
from simcore_postgres_database.models.users import users as users_table
8-
from simcore_service_webserver.db.models import UserRole, UserStatus
99
from simcore_service_webserver.db.plugin import get_asyncpg_engine
1010
from simcore_service_webserver.groups import api as groups_service
1111
from simcore_service_webserver.products.products_service import list_products

0 commit comments

Comments
 (0)