|
11 | 11 | import pytest |
12 | 12 | from faker import Faker |
13 | 13 | from fastapi import FastAPI |
| 14 | +from models_library.api_schemas_catalog.services import ( |
| 15 | + ServiceListFilters, |
| 16 | + ServiceUpdateV2, |
| 17 | +) |
14 | 18 | from models_library.products import ProductName |
15 | 19 | from models_library.rest_pagination import MAXIMUM_NUMBER_OF_ITEMS_PER_PAGE |
| 20 | +from models_library.services_enums import ServiceType |
16 | 21 | from models_library.services_history import ServiceRelease |
17 | 22 | from models_library.services_types import ServiceKey, ServiceVersion |
18 | 23 | from models_library.users import UserID |
@@ -145,11 +150,133 @@ async def test_rpc_list_services_paginated_with_filters( |
145 | 150 | rpc_client, |
146 | 151 | product_name=product_name, |
147 | 152 | user_id=user_id, |
148 | | - filters={"service_type": "dynamic"}, |
| 153 | + filters=ServiceListFilters(service_type=ServiceType.DYNAMIC), |
149 | 154 | ) |
150 | 155 | assert page.meta.total == 0 |
151 | 156 |
|
152 | 157 |
|
| 158 | +async def test_rpc_list_services_paginated_with_filter_combinations( |
| 159 | + background_sync_task_mocked: None, |
| 160 | + mocked_director_rest_api: MockRouter, |
| 161 | + rpc_client: RabbitMQRPCClient, |
| 162 | + product_name: ProductName, |
| 163 | + user_id: UserID, |
| 164 | + app: FastAPI, |
| 165 | + create_fake_service_data: Callable, |
| 166 | + services_db_tables_injector: Callable, |
| 167 | +): |
| 168 | + """Tests all combinations of filters for list_services_paginated""" |
| 169 | + # Setup: Create test services with different patterns and types |
| 170 | + test_services = [ |
| 171 | + # Computational services |
| 172 | + create_fake_service_data( |
| 173 | + "simcore/services/comp/test-service1", |
| 174 | + "1.0.0", |
| 175 | + team_access=None, |
| 176 | + everyone_access=None, |
| 177 | + product=product_name, |
| 178 | + version_display="2023 Release", |
| 179 | + ), |
| 180 | + create_fake_service_data( |
| 181 | + "simcore/services/comp/test-service2", |
| 182 | + "1.0.0", |
| 183 | + team_access=None, |
| 184 | + everyone_access=None, |
| 185 | + product=product_name, |
| 186 | + version_display=None, |
| 187 | + ), |
| 188 | + # Dynamic services |
| 189 | + create_fake_service_data( |
| 190 | + "simcore/services/dynamic/jupyter-lab", |
| 191 | + "1.0.0", |
| 192 | + team_access=None, |
| 193 | + everyone_access=None, |
| 194 | + product=product_name, |
| 195 | + version_display="2024 Beta", |
| 196 | + ), |
| 197 | + create_fake_service_data( |
| 198 | + "simcore/services/dynamic/jupyter-python", |
| 199 | + "1.0.0", |
| 200 | + team_access=None, |
| 201 | + everyone_access=None, |
| 202 | + product=product_name, |
| 203 | + version_display=None, |
| 204 | + ), |
| 205 | + ] |
| 206 | + await services_db_tables_injector(test_services) |
| 207 | + |
| 208 | + # Test 1: Filter by service type only |
| 209 | + page = await catalog_rpc.list_services_paginated( |
| 210 | + rpc_client, |
| 211 | + product_name=product_name, |
| 212 | + user_id=user_id, |
| 213 | + filters=ServiceListFilters(service_type=ServiceType.COMPUTATIONAL), |
| 214 | + ) |
| 215 | + assert page.meta.total == 2 |
| 216 | + assert all("services/comp/" in item.key for item in page.data) |
| 217 | + |
| 218 | + # Test 2: Filter by key pattern only |
| 219 | + page = await catalog_rpc.list_services_paginated( |
| 220 | + rpc_client, |
| 221 | + product_name=product_name, |
| 222 | + user_id=user_id, |
| 223 | + filters=ServiceListFilters(service_key_pattern="*/jupyter-*"), |
| 224 | + ) |
| 225 | + assert page.meta.total == 2 |
| 226 | + assert all("jupyter-" in item.key for item in page.data) |
| 227 | + |
| 228 | + # Test 3: Filter by version display pattern only |
| 229 | + page = await catalog_rpc.list_services_paginated( |
| 230 | + rpc_client, |
| 231 | + product_name=product_name, |
| 232 | + user_id=user_id, |
| 233 | + filters=ServiceListFilters(version_display_pattern="*2023*"), |
| 234 | + ) |
| 235 | + assert page.meta.total == 1 |
| 236 | + assert page.data[0].version_display == "2023 Release" |
| 237 | + |
| 238 | + # Test 4: Combined filters - type and key pattern |
| 239 | + page = await catalog_rpc.list_services_paginated( |
| 240 | + rpc_client, |
| 241 | + product_name=product_name, |
| 242 | + user_id=user_id, |
| 243 | + filters=ServiceListFilters( |
| 244 | + service_type=ServiceType.DYNAMIC, service_key_pattern="*/jupyter-*" |
| 245 | + ), |
| 246 | + ) |
| 247 | + assert page.meta.total == 2 |
| 248 | + assert all( |
| 249 | + "services/dynamic/" in item.key and "jupyter-" in item.key for item in page.data |
| 250 | + ) |
| 251 | + |
| 252 | + # Test 5: Combined filters with version display pattern |
| 253 | + page = await catalog_rpc.list_services_paginated( |
| 254 | + rpc_client, |
| 255 | + product_name=product_name, |
| 256 | + user_id=user_id, |
| 257 | + filters=ServiceListFilters( |
| 258 | + service_type=ServiceType.DYNAMIC, |
| 259 | + service_key_pattern="*/jupyter-*", |
| 260 | + version_display_pattern="*2024*", |
| 261 | + ), |
| 262 | + ) |
| 263 | + assert page.meta.total == 1 |
| 264 | + assert page.data[0].key == "simcore/services/dynamic/jupyter-lab" |
| 265 | + assert page.data[0].version_display == "2024 Beta" |
| 266 | + page = await catalog_rpc.list_services_paginated( |
| 267 | + rpc_client, |
| 268 | + product_name=product_name, |
| 269 | + user_id=user_id, |
| 270 | + filters=ServiceListFilters( |
| 271 | + service_type=ServiceType.DYNAMIC, |
| 272 | + service_key_pattern="*/jupyter-*", |
| 273 | + version_display_pattern="*2024*", |
| 274 | + ), |
| 275 | + ) |
| 276 | + assert page.meta.total == 1 |
| 277 | + assert page.data[0].version_display == "2024 Beta" |
| 278 | + |
| 279 | + |
153 | 280 | async def test_rpc_catalog_client_workflow( |
154 | 281 | background_sync_task_mocked: None, |
155 | 282 | mocked_director_rest_api: MockRouter, |
@@ -199,13 +326,13 @@ async def test_rpc_catalog_client_workflow( |
199 | 326 | user_id=user_id, |
200 | 327 | service_key=service_key, |
201 | 328 | service_version=service_version, |
202 | | - update={ |
203 | | - "name": "foo", |
204 | | - "description": "bar", |
205 | | - "icon": random_icon_url(faker), |
206 | | - "version_display": "this is a nice version", |
207 | | - "description_ui": True, # owner activates wiki view |
208 | | - }, # type: ignore |
| 329 | + update=ServiceUpdateV2( |
| 330 | + name="foo", |
| 331 | + description="bar", |
| 332 | + icon=random_icon_url(faker), |
| 333 | + version_display="this is a nice version", |
| 334 | + description_ui=True, # owner activates wiki view |
| 335 | + ), |
209 | 336 | ) |
210 | 337 |
|
211 | 338 | assert updated.key == got.key |
|
0 commit comments