Skip to content

Commit 0165cde

Browse files
add unit test
1 parent 250f41a commit 0165cde

File tree

4 files changed

+118
-91
lines changed

4 files changed

+118
-91
lines changed

services/web/server/src/simcore_service_webserver/resource_usage/_pricing_plans_handlers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ async def get_pricing_plan_unit(request: web.Request):
8181
name="list_pricing_plans",
8282
)
8383
@login_required
84-
@permission_required("resource-usage.write")
84+
@permission_required("resource-usage.read")
8585
@_handle_resource_usage_exceptions
8686
async def list_pricing_plans(request: web.Request):
8787
req_ctx = RequestContext.model_validate(request)
@@ -112,7 +112,7 @@ async def list_pricing_plans(request: web.Request):
112112
name="get_pricing_plan",
113113
)
114114
@login_required
115-
@permission_required("resource-usage.write")
115+
@permission_required("resource-usage.read")
116116
@_handle_resource_usage_exceptions
117117
async def get_pricing_plan(request: web.Request):
118118
req_ctx = RequestContext.model_validate(request)

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

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,16 @@
33
# pylint:disable=redefined-outer-name
44

55

6+
from unittest.mock import MagicMock
7+
68
import pytest
9+
from faker import Faker
10+
from models_library.api_schemas_resource_usage_tracker.pricing_plans import (
11+
PricingPlanGet,
12+
PricingPlanToServiceGet,
13+
PricingUnitGet,
14+
)
15+
from pytest_mock import MockerFixture
716
from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict
817
from pytest_simcore.helpers.typing_env import EnvVarsDict
918

@@ -27,3 +36,85 @@ def app_environment(app_environment: EnvVarsDict, monkeypatch: pytest.MonkeyPatc
2736
"WEBSERVER_ANNOUNCEMENTS": "1",
2837
},
2938
)
39+
40+
41+
@pytest.fixture
42+
def mock_rpc_resource_usage_tracker_service_api(
43+
mocker: MockerFixture, faker: Faker
44+
) -> dict[str, MagicMock]:
45+
return {
46+
## Pricing plans
47+
"list_pricing_plans": mocker.patch(
48+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.list_pricing_plans",
49+
autospec=True,
50+
return_value=[
51+
PricingPlanGet.model_validate(
52+
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
53+
)
54+
],
55+
),
56+
"get_pricing_plan": mocker.patch(
57+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.get_pricing_plan",
58+
autospec=True,
59+
return_value=PricingPlanGet.model_validate(
60+
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
61+
),
62+
),
63+
"create_pricing_plan": mocker.patch(
64+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.create_pricing_plan",
65+
autospec=True,
66+
return_value=PricingPlanGet.model_validate(
67+
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
68+
),
69+
),
70+
"update_pricing_plan": mocker.patch(
71+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.update_pricing_plan",
72+
autospec=True,
73+
return_value=PricingPlanGet.model_validate(
74+
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
75+
),
76+
),
77+
## Pricing units
78+
"get_pricing_unit": mocker.patch(
79+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_units.get_pricing_unit",
80+
autospec=True,
81+
return_value=PricingUnitGet.model_validate(
82+
PricingUnitGet.model_config["json_schema_extra"]["examples"][0],
83+
),
84+
),
85+
"create_pricing_unit": mocker.patch(
86+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_units.create_pricing_unit",
87+
autospec=True,
88+
return_value=PricingUnitGet.model_validate(
89+
PricingUnitGet.model_config["json_schema_extra"]["examples"][0],
90+
),
91+
),
92+
"update_pricing_unit": mocker.patch(
93+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_units.update_pricing_unit",
94+
autospec=True,
95+
return_value=PricingUnitGet.model_validate(
96+
PricingUnitGet.model_config["json_schema_extra"]["examples"][0],
97+
),
98+
),
99+
## Pricing plan to service
100+
"list_connected_services_to_pricing_plan_by_pricing_plan": mocker.patch(
101+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.list_connected_services_to_pricing_plan_by_pricing_plan",
102+
autospec=True,
103+
return_value=[
104+
PricingPlanToServiceGet.model_validate(
105+
PricingPlanToServiceGet.model_config["json_schema_extra"][
106+
"examples"
107+
][0],
108+
)
109+
],
110+
),
111+
"connect_service_to_pricing_plan": mocker.patch(
112+
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.connect_service_to_pricing_plan",
113+
autospec=True,
114+
return_value=PricingPlanToServiceGet.model_validate(
115+
PricingPlanToServiceGet.model_config["json_schema_extra"]["examples"][
116+
0
117+
],
118+
),
119+
),
120+
}

services/web/server/tests/unit/with_dbs/03/resource_usage/test_admin_pricing_plans.py

Lines changed: 4 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@
1111
import pytest
1212
from aiohttp.test_utils import TestClient
1313
from faker import Faker
14-
from models_library.api_schemas_resource_usage_tracker.pricing_plans import (
15-
PricingPlanGet,
16-
PricingPlanToServiceGet,
17-
PricingUnitGet,
18-
)
1914
from models_library.resource_tracker import PricingPlanClassification
2015
from pytest_mock import MockerFixture
2116
from pytest_simcore.helpers.assert_checks import assert_status
@@ -24,88 +19,6 @@
2419
from simcore_service_webserver.db.models import UserRole
2520

2621

27-
@pytest.fixture
28-
def mock_rpc_resource_usage_tracker_service_api(
29-
mocker: MockerFixture, faker: Faker
30-
) -> dict[str, MagicMock]:
31-
return {
32-
## Pricing plans
33-
"list_pricing_plans": mocker.patch(
34-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.list_pricing_plans",
35-
autospec=True,
36-
return_value=[
37-
PricingPlanGet.model_validate(
38-
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
39-
)
40-
],
41-
),
42-
"get_pricing_plan": mocker.patch(
43-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.get_pricing_plan",
44-
autospec=True,
45-
return_value=PricingPlanGet.model_validate(
46-
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
47-
),
48-
),
49-
"create_pricing_plan": mocker.patch(
50-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.create_pricing_plan",
51-
autospec=True,
52-
return_value=PricingPlanGet.model_validate(
53-
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
54-
),
55-
),
56-
"update_pricing_plan": mocker.patch(
57-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.update_pricing_plan",
58-
autospec=True,
59-
return_value=PricingPlanGet.model_validate(
60-
PricingPlanGet.model_config["json_schema_extra"]["examples"][0],
61-
),
62-
),
63-
## Pricing units
64-
"get_pricing_unit": mocker.patch(
65-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_units.get_pricing_unit",
66-
autospec=True,
67-
return_value=PricingUnitGet.model_validate(
68-
PricingUnitGet.model_config["json_schema_extra"]["examples"][0],
69-
),
70-
),
71-
"create_pricing_unit": mocker.patch(
72-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_units.create_pricing_unit",
73-
autospec=True,
74-
return_value=PricingUnitGet.model_validate(
75-
PricingUnitGet.model_config["json_schema_extra"]["examples"][0],
76-
),
77-
),
78-
"update_pricing_unit": mocker.patch(
79-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_units.update_pricing_unit",
80-
autospec=True,
81-
return_value=PricingUnitGet.model_validate(
82-
PricingUnitGet.model_config["json_schema_extra"]["examples"][0],
83-
),
84-
),
85-
## Pricing plan to service
86-
"list_connected_services_to_pricing_plan_by_pricing_plan": mocker.patch(
87-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.list_connected_services_to_pricing_plan_by_pricing_plan",
88-
autospec=True,
89-
return_value=[
90-
PricingPlanToServiceGet.model_validate(
91-
PricingPlanToServiceGet.model_config["json_schema_extra"][
92-
"examples"
93-
][0],
94-
)
95-
],
96-
),
97-
"connect_service_to_pricing_plan": mocker.patch(
98-
"simcore_service_webserver.resource_usage._pricing_plans_admin_api.pricing_plans.connect_service_to_pricing_plan",
99-
autospec=True,
100-
return_value=PricingPlanToServiceGet.model_validate(
101-
PricingPlanToServiceGet.model_config["json_schema_extra"]["examples"][
102-
0
103-
],
104-
),
105-
),
106-
}
107-
108-
10922
@pytest.fixture
11023
def mock_catalog_client(mocker: MockerFixture, faker: Faker) -> dict[str, MagicMock]:
11124
return {
@@ -137,11 +50,13 @@ async def test_get_admin_pricing_endpoints_user_role_access(
13750
):
13851
## Pricing plans
13952

140-
url = client.app.router["list_pricing_plans"].url_for()
53+
url = client.app.router["list_pricing_plans_for_admin_user"].url_for()
14154
resp = await client.get(f"{url}")
14255
await assert_status(resp, expected)
14356

144-
url = client.app.router["get_pricing_plan"].url_for(pricing_plan_id="1")
57+
url = client.app.router["get_pricing_plan_for_admin_user"].url_for(
58+
pricing_plan_id="1"
59+
)
14560
resp = await client.get(f"{url}")
14661
await assert_status(resp, expected)
14762

services/web/server/tests/unit/with_dbs/03/resource_usage/test_pricing_plans.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
PricingPlanGet,
1515
PricingUnitGet,
1616
)
17+
from models_library.api_schemas_webserver import resource_usage as webserver_api
1718
from models_library.utils.fastapi_encoders import jsonable_encoder
1819
from pytest_simcore.aioresponses_mocker import AioResponsesMock
1920
from pytest_simcore.helpers.assert_checks import assert_status
@@ -101,3 +102,23 @@ async def test_get_pricing_plan(
101102
data, _ = await assert_status(resp, status.HTTP_200_OK)
102103
assert data["pricingPlanKey"] == "pricing-plan-sleeper"
103104
assert len(data["pricingUnits"]) == 1
105+
106+
107+
@pytest.mark.parametrize("user_role", [(UserRole.USER)])
108+
async def test_list_pricing_plans(
109+
client: TestClient,
110+
logged_user: UserInfoDict,
111+
mock_rpc_resource_usage_tracker_service_api: AioResponsesMock,
112+
):
113+
url = client.app.router["list_pricing_plans"].url_for()
114+
resp = await client.get(f"{url}")
115+
data, _ = await assert_status(resp, status.HTTP_200_OK)
116+
assert isinstance(data, list)
117+
for item in data:
118+
assert webserver_api.PricingPlanGet(**item)
119+
assert len(item) == len(webserver_api.PricingPlanGet(**item).model_dump())
120+
url = client.app.router["get_pricing_plan"].url_for(pricing_plan_id="1")
121+
resp = await client.get(f"{url}")
122+
data, _ = await assert_status(resp, status.HTTP_200_OK)
123+
assert webserver_api.PricingPlanGet(**data)
124+
assert len(data) == len(webserver_api.PricingPlanGet(**data).model_dump())

0 commit comments

Comments
 (0)