diff --git a/connect_ext_ppr/webapp.py b/connect_ext_ppr/webapp.py index 78a44b5..236e2d1 100644 --- a/connect_ext_ppr/webapp.py +++ b/connect_ext_ppr/webapp.py @@ -28,12 +28,14 @@ from connect_ext_ppr.models.deployment import Deployment, DeploymentRequest from connect_ext_ppr.models.enums import ConfigurationStateChoices, DeploymentStatusChoices from connect_ext_ppr.models.file import File +from connect_ext_ppr.models.replicas import Product from connect_ext_ppr.service import add_deployments from connect_ext_ppr.schemas import ( ConfigurationCreateSchema, ConfigurationSchema, DeploymentRequestSchema, DeploymentSchema, + ProductSchema, ) from connect_ext_ppr.utils import ( _get_extension_client, @@ -309,6 +311,25 @@ def remove_configuration( return Response(status_code=204) + @router.get( + '/products', + summary='List all products availables for account', + response_model=List[ProductSchema], + ) + def list_products( + self, + db: VerboseBaseSession = Depends(get_db), + installation: dict = Depends(get_installation), + ): + products_ids = db.query(Deployment.product_id).filter_by( + account_id=installation['owner']['id'], + ).distinct() + + response_list = [] + for product in db.query(Product).filter(Product.id.in_(products_ids)): + response_list.append(ProductSchema(id=product.id, name=product.name, icon=product.logo)) + return response_list + @classmethod def on_startup(cls, logger, config): # When database schema is completely defined diff --git a/tests/api/test_products.py b/tests/api/test_products.py new file mode 100644 index 0000000..5371c67 --- /dev/null +++ b/tests/api/test_products.py @@ -0,0 +1,44 @@ +def test_products( + deployment_factory, + installation, + api_client, + product_factory, +): + product1 = product_factory(id='PRD-000-001', name='Product 1') + product2 = product_factory(id='PRD-000-002', name='Product 2') + + deployment_factory(account_id='PA-159-159') + deployment_factory( + account_id=installation['owner']['id'], + product_id=product1.id, + ) + deployment_factory( + account_id=installation['owner']['id'], + product_id=product2.id, + ) + deployment_factory( + account_id=installation['owner']['id'], + product_id=product2.id, + hub_id='HB-123-12', + ) + + response = api_client.get( + '/api/products', + installation=installation, + ) + + assert response.status_code == 200 + assert len(response.json()) == 2 + + assert response.json() == [ + { + 'id': product1.id, + 'name': product1.name, + 'icon': product1.logo, + }, + { + 'id': product2.id, + 'name': product2.name, + 'icon': product2.logo, + }, + ] diff --git a/tests/conftest.py b/tests/conftest.py index c514941..98253a1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -94,9 +94,11 @@ def _build_product( ): if not id: id = 'PR-{0}'.format(random.randint(10000, 99999)) - product = Product(id=id, name=name, logo=logo, owner_id=owner_id, version=version) - dbsession.add(product) - dbsession.commit() + product = dbsession.query(Product).filter_by(id=id).first() + if not product: + product = Product(id=id, name=name, logo=logo, owner_id=owner_id, version=version) + dbsession.add(product) + dbsession.commit() return product return _build_product @@ -125,7 +127,7 @@ def _build_deployment( vendor_id='VA-000-000', hub_id='HB-0000-0000', ): - product = product_factory(product_id) + product = product_factory(id=product_id) product_id = product.id dep = Deployment( diff --git a/tests/test_webapp.py b/tests/test_webapp.py deleted file mode 100644 index 8f52460..0000000 --- a/tests/test_webapp.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023, Ingram Micro -# All rights reserved. -# -# Test Suite is a todo -def test_null(): - assert True is True