Skip to content

Commit e21c8aa

Browse files
committed
add test for checking out licensed item
1 parent 8e4e18d commit e21c8aa

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

packages/models-library/src/models_library/api_schemas_webserver/licensed_items_checkouts.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from datetime import datetime
22
from typing import NamedTuple
33

4-
from pydantic import BaseModel, PositiveInt
4+
from pydantic import BaseModel, ConfigDict, PositiveInt
55

66
from ..licensed_items import LicensedItemID
77
from ..products import ProductName
@@ -22,6 +22,22 @@ class LicensedItemCheckoutRpcGet(BaseModel):
2222
started_at: datetime
2323
stopped_at: datetime | None
2424
num_of_seats: int
25+
model_config = ConfigDict(
26+
json_schema_extra={
27+
"examples": [
28+
{
29+
"licensed_item_checkout_id": "633ef980-6f3e-4b1a-989a-bd77bf9a5d6b",
30+
"licensed_item_id": "0362b88b-91f8-4b41-867c-35544ad1f7a1",
31+
"wallet_id": 6,
32+
"user_id": 27845,
33+
"product_name": "osparc",
34+
"started_at": "2024-12-12 09:59:26.422140",
35+
"stopped_at": "2024-12-12 09:59:26.423540",
36+
"num_of_seats": 78,
37+
}
38+
]
39+
}
40+
)
2541

2642

2743
class LicensedItemCheckoutRpcGetPage(NamedTuple):

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
from models_library.api_schemas_webserver.licensed_items import (
1616
LicensedItemGetPage as _LicensedItemGetPage,
1717
)
18+
from models_library.api_schemas_webserver.licensed_items_checkouts import (
19+
LicensedItemCheckoutRpcGet,
20+
)
21+
from models_library.licensed_items import LicensedItemID
22+
from models_library.services_types import ServiceRunID
1823
from models_library.users import UserID
1924
from models_library.wallets import WalletID
2025
from pydantic import TypeAdapter
@@ -26,6 +31,9 @@
2631
get_wb_api_rpc_client,
2732
)
2833
from simcore_service_api_server.models.pagination import Page
34+
from simcore_service_api_server.models.schemas.licensed_items import (
35+
LicensedItemCheckoutData,
36+
)
2937
from simcore_service_api_server.models.schemas.model_adapter import LicensedItemGet
3038
from simcore_service_api_server.services_rpc.wb_api_server import WbApiRpcClient
3139

@@ -145,3 +153,55 @@ async def side_effect(
145153
f"{API_VTAG}/wallets/{_wallet_id}/licensed-items", auth=auth
146154
)
147155
assert resp.status_code == expected_api_server_status_code
156+
157+
158+
@pytest.mark.parametrize(
159+
"exception_to_raise,expected_api_server_status_code",
160+
[
161+
(None, status.HTTP_200_OK),
162+
],
163+
)
164+
async def test_get_licensed_items_checkout(
165+
mock_wb_api_server_rcp: MockerFixture,
166+
client: AsyncClient,
167+
auth: BasicAuth,
168+
exception_to_raise: Exception | None,
169+
expected_api_server_status_code: int,
170+
faker: Faker,
171+
):
172+
_wallet_id = faker.pyint(min_value=1)
173+
_licensed_item_id = faker.uuid4()
174+
175+
async def side_effect(
176+
rabbitmq_rpc_client: RabbitMQRPCClient,
177+
product_name: str,
178+
user_id: UserID,
179+
wallet_id: WalletID,
180+
licensed_item_id: LicensedItemID,
181+
num_of_seats: int,
182+
service_run_id: ServiceRunID,
183+
) -> LicensedItemCheckoutRpcGet:
184+
if exception_to_raise is not None:
185+
raise exception_to_raise
186+
extra = LicensedItemCheckoutRpcGet.model_config.get("json_schema_extra")
187+
assert isinstance(extra, dict)
188+
examples = extra.get("examples")
189+
assert isinstance(examples, list)
190+
assert len(examples) > 0
191+
example = examples[0]
192+
assert isinstance(example, dict)
193+
return LicensedItemCheckoutRpcGet.model_validate(example)
194+
195+
mock_wb_api_server_rcp.patch(
196+
"simcore_service_api_server.services_rpc.wb_api_server._checkout_licensed_item_for_wallet",
197+
side_effect,
198+
)
199+
body = LicensedItemCheckoutData(
200+
number_of_seats=faker.pyint(min_value=1), service_run_id="myservice"
201+
)
202+
resp = await client.post(
203+
f"{API_VTAG}/wallets/{_wallet_id}/licensed-items/{_licensed_item_id}/checkout",
204+
auth=auth,
205+
content=body.model_dump_json(),
206+
)
207+
assert resp.status_code == expected_api_server_status_code

0 commit comments

Comments
 (0)