Skip to content

Commit 5aa73d3

Browse files
authored
🐛Personalized-resource-limits: return default value when no product is defined (#4449)
1 parent 11812a9 commit 5aa73d3

File tree

2 files changed

+78
-16
lines changed
  • services/web/server

2 files changed

+78
-16
lines changed
Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
import contextlib
2+
13
import sqlalchemy as sa
24
from aiohttp import web
35
from aiopg.sa.connection import SAConnection
46
from aiopg.sa.result import ResultProxy
57
from models_library.users import GroupID, UserID
68
from simcore_postgres_database.models.users import UserStatus, users
79
from simcore_postgres_database.utils_groups_extra_properties import (
10+
GroupExtraPropertiesNotFound,
811
GroupExtraPropertiesRepo,
912
)
10-
from sqlalchemy.sql import func
1113

1214
from ..db.models import user_to_groups
1315
from ..db.plugin import get_database_engine
@@ -21,13 +23,12 @@ async def do_update_expired_users(conn: SAConnection) -> list[UserID]:
2123
.where(
2224
(users.c.expires_at.is_not(None))
2325
& (users.c.status == UserStatus.ACTIVE)
24-
& (users.c.expires_at < func.now())
26+
& (users.c.expires_at < sa.sql.func.now())
2527
)
2628
.returning(users.c.id)
2729
)
2830
if rows := await result.fetchall():
29-
expired = [r.id for r in rows]
30-
return expired
31+
return [r.id for r in rows]
3132
return []
3233

3334

@@ -44,17 +45,19 @@ async def get_users_ids_in_group(conn: SAConnection, gid: GroupID) -> set[UserID
4445
async def list_user_permissions(
4546
app: web.Application, *, user_id: UserID, product_name: str
4647
) -> list[Permission]:
47-
engine = get_database_engine(app)
48-
49-
async with engine.acquire() as conn:
50-
user_group_extra_properties = (
51-
await GroupExtraPropertiesRepo.get_aggregated_properties_for_user(
52-
conn, user_id=user_id, product_name=product_name
48+
override_services_specifications = Permission(
49+
name="override_services_specifications",
50+
allowed=False,
51+
)
52+
with contextlib.suppress(GroupExtraPropertiesNotFound):
53+
async with get_database_engine(app).acquire() as conn:
54+
user_group_extra_properties = (
55+
await GroupExtraPropertiesRepo.get_aggregated_properties_for_user(
56+
conn, user_id=user_id, product_name=product_name
57+
)
5358
)
59+
override_services_specifications.allowed = (
60+
user_group_extra_properties.override_services_specifications
5461
)
55-
return [
56-
Permission(
57-
name="override_services_specifications",
58-
allowed=user_group_extra_properties.override_services_specifications,
59-
)
60-
]
62+
63+
return [override_services_specifications]

services/web/server/tests/unit/with_dbs/03/test_users.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from typing import Any, AsyncIterable, AsyncIterator, Callable
1515
from unittest.mock import MagicMock, Mock
1616

17+
import aiopg.sa
1718
import pytest
1819
import redis.asyncio as aioredis
1920
from aiohttp import web
@@ -33,6 +34,7 @@
3334
from redis import Redis
3435
from servicelib.aiohttp.application import create_safe_application
3536
from servicelib.rest_constants import RESPONSE_MODEL_POLICY
37+
from simcore_postgres_database.models.products import products
3638
from simcore_postgres_database.models.users import UserRole
3739
from simcore_service_webserver._meta import api_version_prefix as API_VERSION
3840
from simcore_service_webserver.application_settings import setup_settings
@@ -727,3 +729,60 @@ async def test_list_permissions_with_overriden_extra_properties(
727729

728730
assert override_services_specifications.name == "override_services_specifications"
729731
assert override_services_specifications.allowed is True
732+
733+
734+
@pytest.fixture
735+
async def with_no_product_name_defined(
736+
aiopg_engine: aiopg.sa.engine.Engine,
737+
) -> AsyncIterator[None]:
738+
async with aiopg_engine.acquire() as conn:
739+
result = await conn.execute(products.select())
740+
assert result
741+
list_of_products = await result.fetchall()
742+
743+
# remove them all
744+
result = await conn.execute(products.delete())
745+
assert result
746+
747+
yield
748+
749+
# revert changes
750+
if list_of_products:
751+
async with aiopg_engine.acquire() as conn:
752+
await conn.execute(
753+
products.insert().values(
754+
[dict(product.items()) for product in list_of_products]
755+
)
756+
)
757+
758+
759+
@pytest.mark.parametrize(
760+
"user_role,expected_response",
761+
[
762+
(UserRole.USER, web.HTTPOk),
763+
],
764+
)
765+
async def test_list_permissions_with_no_group_defined_returns_default_false_for_services_override(
766+
logged_user: UserInfoDict,
767+
client: TestClient,
768+
expected_response: type[web.HTTPException],
769+
with_no_product_name_defined: None,
770+
):
771+
assert client.app
772+
url = client.app.router["list_user_permissions"].url_for()
773+
assert f"{url}" == "/v0/me/permissions"
774+
resp = await client.get(f"{url}")
775+
data, error = await assert_status(resp, expected_response)
776+
assert data
777+
assert not error
778+
list_of_permissions = parse_obj_as(list[PermissionGet], data)
779+
filtered_permissions = list(
780+
filter(
781+
lambda x: x.name == "override_services_specifications", list_of_permissions
782+
)
783+
)
784+
assert len(filtered_permissions) == 1
785+
override_services_specifications = filtered_permissions[0]
786+
787+
assert override_services_specifications.name == "override_services_specifications"
788+
assert override_services_specifications.allowed is False

0 commit comments

Comments
 (0)