Skip to content

Commit f794286

Browse files
committed
add some tests for exceptions
1 parent 8240f47 commit f794286

File tree

2 files changed

+67
-13
lines changed

2 files changed

+67
-13
lines changed

services/api-server/src/simcore_service_api_server/api/routes/wallets.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,21 @@
22
from typing import Annotated, Any
33

44
from fastapi import APIRouter, Depends, status
5-
from fastapi_pagination import Page
65
from models_library.licensed_items import LicensedItemID
76
from pydantic import PositiveInt
8-
from simcore_service_api_server.api.dependencies.authentication import (
9-
get_current_user_id,
10-
get_product_name,
11-
)
12-
from simcore_service_api_server.api.dependencies.webserver_rpc import (
13-
get_wb_api_rpc_client,
14-
)
15-
from simcore_service_api_server.models.pagination import PaginationParams
16-
from simcore_service_api_server.models.schemas.licensed_items import (
17-
LicensedItemCheckoutData,
18-
)
19-
from simcore_service_api_server.services_rpc.wb_api_server import WbApiRpcClient
207

8+
from ...api.dependencies.authentication import get_current_user_id, get_product_name
9+
from ...api.dependencies.webserver_rpc import get_wb_api_rpc_client
2110
from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES
11+
from ...models.pagination import Page, PaginationParams
2212
from ...models.schemas.errors import ErrorGet
13+
from ...models.schemas.licensed_items import LicensedItemCheckoutData
2314
from ...models.schemas.model_adapter import (
2415
LicensedItemCheckoutGet,
2516
LicensedItemGet,
2617
WalletGetWithAvailableCreditsLegacy,
2718
)
19+
from ...services_rpc.wb_api_server import WbApiRpcClient
2820
from ..dependencies.webserver_http import AuthSession, get_webserver_session
2921
from ._constants import FMSG_CHANGELOG_NEW_IN_VERSION
3022

services/api-server/tests/unit/test_licensed_items.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from functools import partial
77

88
import pytest
9+
from faker import Faker
910
from fastapi import FastAPI, status
1011
from httpx import AsyncClient, BasicAuth
1112
from models_library.api_schemas_webserver.licensed_items import (
@@ -14,10 +15,16 @@
1415
from models_library.api_schemas_webserver.licensed_items import (
1516
LicensedItemGetPage as _LicensedItemGetPage,
1617
)
18+
from models_library.users import UserID
19+
from models_library.wallets import WalletID
1720
from pydantic import TypeAdapter
1821
from pytest_mock import MockerFixture
1922
from servicelib.rabbitmq._client_rpc import RabbitMQRPCClient
2023
from servicelib.rabbitmq._errors import RemoteMethodNotRegisteredError
24+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker.errors import (
25+
CanNotCheckoutNotEnoughAvailableSeatsError,
26+
NotEnoughAvailableSeatsError,
27+
)
2128
from simcore_service_api_server._meta import API_VTAG
2229
from simcore_service_api_server.api.dependencies.webserver_rpc import (
2330
get_wb_api_rpc_client,
@@ -96,3 +103,58 @@ async def test_get_licensed_items_502(
96103
)
97104
resp = await client.get(f"{API_VTAG}/licensed-items", auth=auth)
98105
assert resp.status_code == status.HTTP_502_BAD_GATEWAY
106+
107+
108+
@pytest.mark.parametrize(
109+
"exception_to_raise,expected_api_server_status_code",
110+
[
111+
(None, status.HTTP_200_OK),
112+
(NotEnoughAvailableSeatsError(), status.HTTP_409_CONFLICT),
113+
(
114+
CanNotCheckoutNotEnoughAvailableSeatsError(
115+
licensed_item_id="2e1af95b-f664-4793-81ae-5512708db3b1",
116+
num_of_seats=3,
117+
available_num_of_seats=2,
118+
),
119+
status.HTTP_409_CONFLICT,
120+
),
121+
],
122+
)
123+
async def test_get_licensed_items_for_wallet(
124+
mock_wb_api_server_rcp: MockerFixture,
125+
client: AsyncClient,
126+
auth: BasicAuth,
127+
exception_to_raise: Exception | None,
128+
expected_api_server_status_code: int,
129+
faker: Faker,
130+
):
131+
_wallet_id = faker.pyint(min_value=1)
132+
133+
async def side_effect(
134+
rabbitmq_rpc_client: RabbitMQRPCClient,
135+
product_name: str,
136+
wallet_id: WalletID,
137+
user_id: UserID,
138+
offset: int,
139+
limit: int,
140+
) -> _LicensedItemGetPage:
141+
assert _wallet_id == wallet_id
142+
if exception_to_raise is not None:
143+
raise exception_to_raise
144+
extra = _LicensedItemGet.model_config.get("json_schema_extra")
145+
assert isinstance(extra, dict)
146+
examples = extra.get("examples")
147+
assert isinstance(examples, list)
148+
return _LicensedItemGetPage(
149+
items=[_LicensedItemGet.model_validate(ex) for ex in examples],
150+
total=len(examples),
151+
)
152+
153+
mock_wb_api_server_rcp.patch(
154+
"simcore_service_api_server.services_rpc.wb_api_server._get_available_licensed_items_for_wallet",
155+
side_effect,
156+
)
157+
resp = await client.get(
158+
f"{API_VTAG}/wallets/{_wallet_id}/licensed-items", auth=auth
159+
)
160+
assert resp.status_code == expected_api_server_status_code

0 commit comments

Comments
 (0)