|
22 | 22 | from models_library.users import UserID |
23 | 23 | from packaging import version |
24 | 24 | from pydantic import EmailStr, HttpUrl, TypeAdapter |
| 25 | +from pytest_simcore.helpers.catalog_services import CreateFakeServiceDataCallable |
25 | 26 | from pytest_simcore.helpers.faker_factories import random_project |
26 | 27 | from pytest_simcore.helpers.postgres_tools import insert_and_get_row_lifespan |
27 | 28 | from simcore_postgres_database.models.projects import ProjectType, projects |
@@ -465,6 +466,95 @@ async def test_list_latest_services_with_filters( |
465 | 466 | ) |
466 | 467 |
|
467 | 468 |
|
| 469 | +async def test_list_latest_services_with_pattern_filters( |
| 470 | + target_product: ProductName, |
| 471 | + create_fake_service_data: CreateFakeServiceDataCallable, |
| 472 | + services_db_tables_injector: Callable, |
| 473 | + services_repo: ServicesRepository, |
| 474 | + user_id: UserID, |
| 475 | +): |
| 476 | + # Setup: Inject services with different patterns |
| 477 | + await services_db_tables_injector( |
| 478 | + [ |
| 479 | + create_fake_service_data( |
| 480 | + "simcore/services/dynamic/jupyter-lab", |
| 481 | + "1.0.0", |
| 482 | + team_access=None, |
| 483 | + everyone_access=None, |
| 484 | + product=target_product, |
| 485 | + version_display="2023 Release", |
| 486 | + ), |
| 487 | + create_fake_service_data( |
| 488 | + "simcore/services/dynamic/jupyter-r", |
| 489 | + "1.0.0", |
| 490 | + team_access=None, |
| 491 | + everyone_access=None, |
| 492 | + product=target_product, |
| 493 | + version_display="2024 Beta", |
| 494 | + ), |
| 495 | + create_fake_service_data( |
| 496 | + "simcore/services/dynamic/jupyter-python", |
| 497 | + "1.0.0", |
| 498 | + team_access=None, |
| 499 | + everyone_access=None, |
| 500 | + product=target_product, |
| 501 | + ), |
| 502 | + ] |
| 503 | + ) |
| 504 | + |
| 505 | + # Test: Filter by service key pattern |
| 506 | + filters = ServiceFiltersDB(service_key_pattern="*/jupyter-*") |
| 507 | + total_count, services_items = await services_repo.list_latest_services( |
| 508 | + product_name=target_product, user_id=user_id, filters=filters |
| 509 | + ) |
| 510 | + assert total_count == 3 |
| 511 | + assert len(services_items) == 3 |
| 512 | + assert all( |
| 513 | + service.key.endswith("jupyter-lab") |
| 514 | + or service.key.endswith("jupyter-r") |
| 515 | + or service.key.endswith("jupyter-python") |
| 516 | + for service in services_items |
| 517 | + ) |
| 518 | + |
| 519 | + # Test: More specific pattern |
| 520 | + filters = ServiceFiltersDB(service_key_pattern="*/jupyter-l*") |
| 521 | + total_count, services_items = await services_repo.list_latest_services( |
| 522 | + product_name=target_product, user_id=user_id, filters=filters |
| 523 | + ) |
| 524 | + assert total_count == 1 |
| 525 | + assert len(services_items) == 1 |
| 526 | + assert services_items[0].key.endswith("jupyter-lab") |
| 527 | + |
| 528 | + # Test: Filter by version display pattern |
| 529 | + filters = ServiceFiltersDB(version_display_pattern="*2023*") |
| 530 | + total_count, services_items = await services_repo.list_latest_services( |
| 531 | + product_name=target_product, user_id=user_id, filters=filters |
| 532 | + ) |
| 533 | + assert total_count == 1 |
| 534 | + assert len(services_items) == 1 |
| 535 | + assert services_items[0].version_display == "2023 Release" |
| 536 | + |
| 537 | + # Test: Filter by version display pattern with NULL handling |
| 538 | + filters = ServiceFiltersDB(version_display_pattern="*") |
| 539 | + total_count, services_items = await services_repo.list_latest_services( |
| 540 | + product_name=target_product, user_id=user_id, filters=filters |
| 541 | + ) |
| 542 | + assert total_count == 3 # Should match all, including NULL version_display |
| 543 | + assert len(services_items) == 3 |
| 544 | + |
| 545 | + # Test: Combined filters |
| 546 | + filters = ServiceFiltersDB( |
| 547 | + service_key_pattern="*/jupyter-*", version_display_pattern="*2024*" |
| 548 | + ) |
| 549 | + total_count, services_items = await services_repo.list_latest_services( |
| 550 | + product_name=target_product, user_id=user_id, filters=filters |
| 551 | + ) |
| 552 | + assert total_count == 1 |
| 553 | + assert len(services_items) == 1 |
| 554 | + assert services_items[0].version_display == "2024 Beta" |
| 555 | + assert services_items[0].key.endswith("jupyter-r") |
| 556 | + |
| 557 | + |
468 | 558 | async def test_get_and_update_service_meta_data( |
469 | 559 | target_product: ProductName, |
470 | 560 | create_fake_service_data: Callable, |
|
0 commit comments