Skip to content

Commit d976a9d

Browse files
committed
fetch&create
1 parent 6bdc056 commit d976a9d

File tree

4 files changed

+54
-8
lines changed

4 files changed

+54
-8
lines changed

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66

77
import logging
8-
from typing import Literal, cast
8+
from typing import Any, Literal, cast
99

1010
from aiohttp import web
1111
from models_library.licensed_items import (
@@ -43,15 +43,19 @@ async def create(
4343
*,
4444
licensed_resource_name: str,
4545
licensed_resource_type: LicensedResourceType,
46-
product_name: ProductName | None,
47-
pricing_plan_id: PricingPlanId | None,
46+
licensed_resource_data: dict[str, Any] | None = None,
47+
licensed_key: str | None = None,
48+
product_name: ProductName | None = None,
49+
pricing_plan_id: PricingPlanId | None = None,
4850
) -> LicensedItemDB:
4951
async with transaction_context(get_asyncpg_engine(app), connection) as conn:
5052
result = await conn.execute(
5153
licensed_items.insert()
5254
.values(
5355
licensed_resource_name=licensed_resource_name,
5456
licensed_resource_type=licensed_resource_type,
57+
licensed_resource_data=licensed_resource_data,
58+
licensed_key=licensed_key,
5559
pricing_plan_id=pricing_plan_id,
5660
product_name=product_name,
5761
created=func.now(),

services/web/server/tests/unit/with_dbs/04/licenses/test_itis_vip_service.py

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,20 @@
88

99
import pytest
1010
import respx
11+
from aiohttp.test_utils import TestClient
1112
from faker import Faker
1213
from httpx import AsyncClient
14+
from models_library.licensed_items import LicensedResourceType
1315
from pydantic import ValidationError
1416
from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict
1517
from pytest_simcore.helpers.typing_env import EnvVarsDict
1618
from servicelib.aiohttp import status
17-
from simcore_service_webserver.licenses import _itis_vip_service
19+
from simcore_service_webserver.licenses import (
20+
_itis_vip_service,
21+
_licensed_items_repository,
22+
)
1823
from simcore_service_webserver.licenses._itis_vip_models import (
24+
AvailableDownload,
1925
_feature_descriptor_to_dict,
2026
)
2127
from simcore_service_webserver.licenses._itis_vip_service import ResponseData
@@ -44,7 +50,7 @@ def app_environment(
4450
monkeypatch,
4551
{
4652
"ITIS_VIP_API_URL": f"{fake_api_base_url}/PD_DirectDownload/getDownloadableItems/{{category}}",
47-
"ITIS_VIP_CATEGORIES": '["ComputationalPantom","Foo","Bar"]', # NOTE: ItisVipSettings will decode with json.dumps()
53+
"ITIS_VIP_CATEGORIES": '["ComputationalPantom","FooCategory","BarCategory"]', # NOTE: ItisVipSettings will decode with json.dumps()
4854
},
4955
)
5056

@@ -118,3 +124,39 @@ async def test_get_category_items(
118124
items = await _itis_vip_service.get_category_items(client, url)
119125

120126
assert items[0].features["functionality"] == "Posable"
127+
128+
129+
async def test_sync_itis_vip_as_licensed_items(
130+
mock_itis_vip_downloadables_api: respx.MockRouter,
131+
app_environment: EnvVarsDict,
132+
client: TestClient,
133+
):
134+
assert client.app
135+
136+
settings = ItisVipSettings.create_from_envs()
137+
assert settings.ITIS_VIP_CATEGORIES
138+
139+
async with AsyncClient() as http_client:
140+
for url, category in zip(
141+
settings.get_urls(), settings.ITIS_VIP_CATEGORIES, strict=True
142+
):
143+
assert f"{url}".endswith(category)
144+
145+
items: list[AvailableDownload] = await _itis_vip_service.get_category_items(
146+
http_client, url
147+
)
148+
assert items[0].features["functionality"] == "Posable"
149+
150+
for item in items:
151+
# TODO: how to update to minimize collisions? one by one?
152+
await _licensed_items_repository.create(
153+
client.app,
154+
licensed_resource_name=f"{category}/{item.id}",
155+
licensed_resource_type=LicensedResourceType.VIP_MODEL,
156+
licensed_resource_data=item.model_dump(
157+
mode="json", exclude_unset=True
158+
),
159+
licensed_key=item.license_key,
160+
product_name=None,
161+
pricing_plan_id=None,
162+
)

services/web/server/tests/unit/with_dbs/04/licenses/test_licensed_items_repository.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ async def test_licensed_items_db_crud(
4141

4242
got = await _licensed_items_repository.create(
4343
client.app,
44-
product_name=osparc_product_name,
4544
licensed_resource_name="Model A",
4645
licensed_resource_type=LicensedResourceType.VIP_MODEL,
46+
product_name=osparc_product_name,
4747
pricing_plan_id=pricing_plan_id,
4848
)
4949
licensed_item_id = got.licensed_item_id

services/web/server/tests/unit/with_dbs/04/licenses/test_licensed_items_rest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ async def test_licensed_items_listing(
4141

4242
licensed_item_db = await _licensed_items_repository.create(
4343
client.app,
44-
product_name=osparc_product_name,
4544
licensed_resource_name="Model A",
4645
licensed_resource_type=LicensedResourceType.VIP_MODEL,
4746
pricing_plan_id=pricing_plan_id,
47+
product_name=osparc_product_name,
4848
)
4949
_licensed_item_id = licensed_item_db.licensed_item_id
5050

@@ -108,10 +108,10 @@ async def test_licensed_items_purchase(
108108

109109
licensed_item_db = await _licensed_items_repository.create(
110110
client.app,
111-
product_name=osparc_product_name,
112111
licensed_resource_name="Model A",
113112
licensed_resource_type=LicensedResourceType.VIP_MODEL,
114113
pricing_plan_id=pricing_plan_id,
114+
product_name=osparc_product_name,
115115
)
116116
_licensed_item_id = licensed_item_db.licensed_item_id
117117

0 commit comments

Comments
 (0)