Skip to content

Commit 7406371

Browse files
adding tests to rut
1 parent 200b1db commit 7406371

File tree

9 files changed

+176
-15
lines changed

9 files changed

+176
-15
lines changed

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/resource_usage_tracker/licensed_items_purchases.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
)
1818
from models_library.rest_ordering import OrderBy
1919
from models_library.wallets import WalletID
20-
from pydantic import AnyUrl, NonNegativeInt, TypeAdapter
20+
from pydantic import NonNegativeInt, TypeAdapter
2121

2222
from ....logging_utils import log_decorator
2323
from ....rabbitmq import RabbitMQRPCClient
@@ -76,7 +76,7 @@ async def get_licensed_item_purchase(
7676
async def create_licensed_item_purchase(
7777
rabbitmq_rpc_client: RabbitMQRPCClient, *, data: LicensedItemsPurchasesCreate
7878
) -> LicensedItemPurchaseGet:
79-
result: AnyUrl = await rabbitmq_rpc_client.request(
79+
result = await rabbitmq_rpc_client.request(
8080
RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
8181
_RPC_METHOD_NAME_ADAPTER.validate_python("create_licensed_item_purchase"),
8282
data=data,
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import logging
2+
from typing import Final
3+
4+
from models_library.api_schemas_resource_usage_tracker import (
5+
RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
6+
)
7+
from models_library.api_schemas_resource_usage_tracker.licensed_items_usages import (
8+
LicenseCheckoutID,
9+
LicensedItemUsageGet,
10+
LicenseItemCheckoutGet,
11+
)
12+
from models_library.licensed_items import LicensedItemID
13+
from models_library.products import ProductName
14+
from models_library.rabbitmq_basic_types import RPCMethodName
15+
from models_library.resource_tracker import ServiceRunId
16+
from models_library.users import UserID
17+
from models_library.wallets import WalletID
18+
from pydantic import NonNegativeInt, TypeAdapter
19+
20+
from ....logging_utils import log_decorator
21+
from ....rabbitmq import RabbitMQRPCClient
22+
23+
_logger = logging.getLogger(__name__)
24+
25+
26+
_DEFAULT_TIMEOUT_S: Final[NonNegativeInt] = 30
27+
28+
_RPC_METHOD_NAME_ADAPTER: TypeAdapter[RPCMethodName] = TypeAdapter(RPCMethodName)
29+
30+
31+
# @log_decorator(_logger, level=logging.DEBUG)
32+
# async def get_licensed_items_usages_page(
33+
# rabbitmq_rpc_client: RabbitMQRPCClient,
34+
# *,
35+
# product_name: ProductName,
36+
# wallet_id: WalletID,
37+
# offset: int = 0,
38+
# limit: int = 20,
39+
# order_by: OrderBy = OrderBy(field=IDStr("purchased_at")),
40+
# ) -> LicensedItemsPurchasesPage:
41+
# result = await rabbitmq_rpc_client.request(
42+
# RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
43+
# _RPC_METHOD_NAME_ADAPTER.validate_python("get_licensed_items_purchases_page"),
44+
# product_name=product_name,
45+
# wallet_id=wallet_id,
46+
# limit=limit,
47+
# offset=offset,
48+
# order_by=order_by,
49+
# timeout_s=_DEFAULT_TIMEOUT_S,
50+
# )
51+
# assert isinstance(result, LicensedItemsPurchasesPage) # nosec
52+
# return result
53+
54+
55+
# @log_decorator(_logger, level=logging.DEBUG)
56+
# async def get_licensed_item_usage(
57+
# rabbitmq_rpc_client: RabbitMQRPCClient,
58+
# *,
59+
# product_name: ProductName,
60+
# licensed_item_purchase_id: LicensedItemPurchaseID,
61+
# ) -> LicensedItemPurchaseGet:
62+
# result = await rabbitmq_rpc_client.request(
63+
# RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
64+
# _RPC_METHOD_NAME_ADAPTER.validate_python("get_licensed_item_purchase"),
65+
# product_name=product_name,
66+
# licensed_item_purchase_id=licensed_item_purchase_id,
67+
# timeout_s=_DEFAULT_TIMEOUT_S,
68+
# )
69+
# assert isinstance(result, LicensedItemPurchaseGet) # nosec
70+
# return result
71+
72+
73+
@log_decorator(_logger, level=logging.DEBUG)
74+
async def checkout_licensed_item(
75+
rabbitmq_rpc_client: RabbitMQRPCClient,
76+
*,
77+
licensed_item_id: LicensedItemID,
78+
wallet_id: WalletID,
79+
product_name: ProductName,
80+
num_of_seats: int,
81+
service_run_id: ServiceRunId,
82+
user_id: UserID,
83+
user_email: str,
84+
) -> LicenseItemCheckoutGet:
85+
result: LicenseItemCheckoutGet = await rabbitmq_rpc_client.request(
86+
RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
87+
_RPC_METHOD_NAME_ADAPTER.validate_python("checkout_licensed_item"),
88+
licensed_item_id=licensed_item_id,
89+
wallet_id=wallet_id,
90+
product_name=product_name,
91+
num_of_seats=num_of_seats,
92+
service_run_id=service_run_id,
93+
user_id=user_id,
94+
user_email=user_email,
95+
timeout_s=_DEFAULT_TIMEOUT_S,
96+
)
97+
assert isinstance(result, LicenseItemCheckoutGet) # nosec
98+
return result
99+
100+
101+
@log_decorator(_logger, level=logging.DEBUG)
102+
async def release_licensed_item(
103+
rabbitmq_rpc_client: RabbitMQRPCClient,
104+
*,
105+
checkout_id: LicenseCheckoutID,
106+
product_name: ProductName,
107+
) -> LicensedItemUsageGet:
108+
result: LicensedItemUsageGet = await rabbitmq_rpc_client.request(
109+
RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
110+
_RPC_METHOD_NAME_ADAPTER.validate_python("release_licensed_item"),
111+
checkout_id=checkout_id,
112+
product_name=product_name,
113+
timeout_s=_DEFAULT_TIMEOUT_S,
114+
)
115+
assert isinstance(result, LicensedItemUsageGet) # nosec
116+
return result

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/api/rpc/_licensed_items_usages.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from fastapi import FastAPI
22
from models_library.api_schemas_resource_usage_tracker.licensed_items_usages import (
3+
LicenseCheckoutID,
34
LicensedItemUsageGet,
45
LicenseItemCheckoutGet,
56
)
67
from models_library.licensed_items import LicensedItemID
78
from models_library.products import ProductName
89
from models_library.resource_tracker import ServiceRunId
9-
from models_library.resource_tracker_licensed_items_usages import LicenseCheckoutID
1010
from models_library.users import UserID
1111
from models_library.wallets import WalletID
1212
from servicelib.rabbitmq import RPCRouter

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/api/rpc/routes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
from servicelib.rabbitmq import RPCRouter
99

1010
from ...services.modules.rabbitmq import get_rabbitmq_rpc_server
11-
from . import _licensed_items_purchases, _resource_tracker
11+
from . import _licensed_items_purchases, _licensed_items_usages, _resource_tracker
1212

1313
_logger = logging.getLogger(__name__)
1414

1515

1616
ROUTERS: list[RPCRouter] = [
1717
_resource_tracker.router,
1818
_licensed_items_purchases.router,
19+
_licensed_items_usages.router,
1920
]
2021

2122

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/models/licensed_items_usages.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ class LicensedItemUsageDB(BaseModel):
1717
user_email: str
1818
product_name: ProductName
1919
service_run_id: ServiceRunId
20-
start_at: datetime
20+
started_at: datetime
2121
stopped_at: datetime | None
2222
num_of_seats: int
23+
modified: datetime
2324

2425
model_config = ConfigDict(from_attributes=True)
2526

@@ -31,7 +32,7 @@ class CreateLicensedItemUsageDB(BaseModel):
3132
user_email: str
3233
product_name: ProductName
3334
service_run_id: ServiceRunId
34-
start_at: datetime
35+
started_at: datetime
3536
num_of_seats: int
3637

3738
model_config = ConfigDict(from_attributes=True)

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/licensed_items_usages.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ async def checkout_licensed_item(
142142
user_email=user_email,
143143
product_name=product_name,
144144
service_run_id=service_run_id,
145-
start_at=datetime.now(tz=UTC),
145+
started_at=datetime.now(tz=UTC),
146146
num_of_seats=num_of_seats,
147147
)
148148
license_item_usage_db = await licensed_items_usages_db.create(
@@ -176,7 +176,7 @@ async def release_licensed_item(
176176
user_id=licensed_item_usage_db.user_id,
177177
product_name=licensed_item_usage_db.product_name,
178178
service_run_id=licensed_item_usage_db.service_run_id,
179-
start_at=licensed_item_usage_db.start_at,
179+
start_at=licensed_item_usage_db.started_at,
180180
stopped_at=licensed_item_usage_db.stopped_at,
181181
num_of_seats=licensed_item_usage_db.num_of_seats,
182182
)

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/modules/db/licensed_items_usages_db.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
resource_tracker_licensed_items_usage.c.user_email,
3434
resource_tracker_licensed_items_usage.c.product_name,
3535
resource_tracker_licensed_items_usage.c.service_run_id,
36-
resource_tracker_licensed_items_usage.c.start_at,
36+
resource_tracker_licensed_items_usage.c.started_at,
3737
resource_tracker_licensed_items_usage.c.stopped_at,
3838
resource_tracker_licensed_items_usage.c.num_of_seats,
3939
resource_tracker_licensed_items_usage.c.modified,
@@ -60,7 +60,7 @@ async def create(
6060
user_email=data.user_email,
6161
product_name=data.product_name,
6262
service_run_id=data.service_run_id,
63-
start_at=data.start_at,
63+
started_at=data.started_at,
6464
stopped_at=None,
6565
num_of_seats=data.num_of_seats,
6666
modified=sa.func.now(),

services/resource-usage-tracker/tests/unit/with_dbs/test_api_licensed_items_usages.py

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,18 @@
44
# pylint:disable=too-many-arguments
55

66

7+
from datetime import UTC, datetime, timedelta
8+
from decimal import Decimal
9+
710
import sqlalchemy as sa
11+
from models_library.resource_tracker_licensed_items_purchases import (
12+
LicensedItemsPurchasesCreate,
13+
)
814
from servicelib.rabbitmq import RabbitMQRPCClient
15+
from servicelib.rabbitmq.rpc_interfaces.resource_usage_tracker import (
16+
licensed_items_purchases,
17+
licensed_items_usages,
18+
)
919

1020
pytest_simcore_core_services_selection = [
1121
"postgres",
@@ -33,15 +43,46 @@ async def test_rpc_licensed_items_usages_workflow(
3343
postgres_db: sa.engine.Engine,
3444
rpc_client: RabbitMQRPCClient,
3545
):
36-
...
46+
# Purchase license item
47+
_create_data = LicensedItemsPurchasesCreate(
48+
product_name="osparc",
49+
licensed_item_id="beb16d18-d57d-44aa-a638-9727fa4a72ef",
50+
wallet_id=1,
51+
wallet_name="My Wallet",
52+
pricing_plan_id=1,
53+
pricing_unit_id=1,
54+
pricing_unit_cost_id=1,
55+
pricing_unit_cost=Decimal(10),
56+
start_at=datetime.now(tz=UTC),
57+
expire_at=datetime.now(tz=UTC) + timedelta(days=1),
58+
num_of_seats=5,
59+
purchased_by_user=1,
60+
user_email="[email protected]",
61+
purchased_at=datetime.now(tz=UTC),
62+
)
3763

38-
# Can I use the license?
64+
created_item = await licensed_items_purchases.create_licensed_item_purchase(
65+
rpc_client, data=_create_data
66+
)
3967

4068
# Checkout with num of seats
41-
42-
# Can I use the license?
69+
checkout = await licensed_items_usages.checkout_licensed_item(
70+
rpc_client,
71+
licensed_item_id=created_item.licensed_item_id,
72+
wallet_id=1,
73+
product_name="osparc",
74+
num_of_seats=3,
75+
service_run_id="run_1",
76+
user_id=1,
77+
user_email="[email protected]",
78+
)
4379

4480
# Release num of seats
81+
license_item_usage = await licensed_items_usages.release_licensed_item(
82+
rpc_client, checkout_id=checkout.checkout_id, product_name="osparc"
83+
)
84+
assert license_item_usage
4585

4686

87+
# TODO: MD
4788
# Add test for heartbeat check!

services/web/server/src/simcore_service_webserver/licenses/_rpc.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ async def get_licensed_items_for_wallet(
4343
user_id: UserID,
4444
product_name: ProductName,
4545
wallet_id: WalletID,
46-
) -> None:
46+
offset: int,
47+
limit: int,
48+
) -> LicensedItemGetPage:
4749
raise NotImplementedError
4850

4951

0 commit comments

Comments
 (0)