Skip to content

Commit

Permalink
LITE-28440: Add filtering and ordering to marketplaces endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
akodelia committed Aug 28, 2023
1 parent 8c906a0 commit 55df357
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 5 deletions.
16 changes: 15 additions & 1 deletion connect_ext_ppr/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
from fastapi_filter import FilterDepends, with_prefix
from fastapi_filter.contrib.sqlalchemy import Filter

from connect_ext_ppr.models.deployment import Deployment, DeploymentRequest
from connect_ext_ppr.models.deployment import (
Deployment, DeploymentRequest, MarketplaceConfiguration,
)

from connect_ext_ppr.models.ppr import PPRVersion


Expand All @@ -16,6 +19,7 @@ class Constants(Filter.Constants):


class PPRVersionFilter(Filter):
id: Optional[str]
version: Optional[int]

class Constants(Filter.Constants):
Expand All @@ -36,3 +40,13 @@ class DeploymentRequestFilter(Filter):

class Constants(Filter.Constants):
model = DeploymentRequest


class MarketplaceConfigurationFilter(Filter):
marketplace: Optional[str]
ppr: Optional[PPRVersionFilter] = FilterDepends(with_prefix('ppr', PPRVersionFilter))

order_by: Optional[List[str]]

class Constants(Filter.Constants):
model = MarketplaceConfiguration
10 changes: 9 additions & 1 deletion connect_ext_ppr/webapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@
VerboseBaseSession,
)
from connect_ext_ppr.errors import ExtensionHttpError, ExtensionValidationError
from connect_ext_ppr.filters import DeploymentFilter, DeploymentRequestFilter
from connect_ext_ppr.filters import (
DeploymentFilter, DeploymentRequestFilter, MarketplaceConfigurationFilter,
)
from connect_ext_ppr.models.configuration import Configuration
from connect_ext_ppr.models.deployment import (
Deployment,
Expand Down Expand Up @@ -278,6 +280,7 @@ def list_deployment_request_tasks(
def list_deployment_request_marketplaces(
self,
depl_req_id: str,
m_filter: MarketplaceConfigurationFilter = FilterDepends(MarketplaceConfigurationFilter),
pagination_params: PaginationParams = Depends(),
response: Response = None,
db: VerboseBaseSession = Depends(get_db),
Expand All @@ -290,6 +293,8 @@ def list_deployment_request_marketplaces(
marketplaces = db.query(MarketplaceConfiguration).options(
selectinload(MarketplaceConfiguration.ppr),
).filter_by(deployment_request=dr.id)
marketplaces = m_filter.filter(marketplaces)
marketplaces = m_filter.sort(marketplaces)
marketplaces = apply_pagination(marketplaces, db, pagination_params, response)

marketplaces_pprs = {m.marketplace: m.ppr for m in marketplaces}
Expand Down Expand Up @@ -660,6 +665,7 @@ def add_ppr(
def get_marketplaces_by_deployment(
self,
deployment_id: str,
m_filter: MarketplaceConfigurationFilter = FilterDepends(MarketplaceConfigurationFilter),
pagination_params: PaginationParams = Depends(),
response: Response = None,
client: ConnectClient = Depends(get_installation_client),
Expand All @@ -671,6 +677,8 @@ def get_marketplaces_by_deployment(
mkplc_configs = db.query(MarketplaceConfiguration).options(
selectinload(MarketplaceConfiguration.ppr),
).filter_by(deployment_id=deployment_id, active=True)
mkplc_configs = m_filter.filter(mkplc_configs)
mkplc_configs = m_filter.sort(mkplc_configs)
mkplc_configs = apply_pagination(mkplc_configs, db, pagination_params, response)

mkplc_ids = [m.marketplace for m in mkplc_configs]
Expand Down
46 changes: 43 additions & 3 deletions tests/api/test_deployment_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,6 @@ def test_get_deployment_request_not_found(
(('pending', None), ('error', 'An Error message!')),
)
def test_list_deployment_request_tasks(
dbsession,
mocker,
deployment_factory,
deployment_request_factory,
installation,
Expand Down Expand Up @@ -366,7 +364,6 @@ def test_list_deployment_request_tasks(


def test_list_deployment_request_tasks_not_found(
dbsession,
deployment_factory,
deployment_request_factory,
installation,
Expand Down Expand Up @@ -966,6 +963,49 @@ def test_list_deployment_request_marketplaces(
assert response.json() == expected_response


def test_list_deployment_request_marketplaces_filters(
mocker,
deployment_factory,
deployment_request_factory,
installation,
api_client,
marketplace,
marketplace_config_factory,
ppr_version_factory,
):
m1 = marketplace
marketplaces = [m1]

mocker.patch(
'connect_ext_ppr.webapp.get_marketplaces',
return_value=marketplaces,
)
dep1 = deployment_factory(account_id=installation['owner']['id'])
ppr = ppr_version_factory(deployment=dep1)

dr1 = deployment_request_factory(deployment=dep1)

marketplace_config_factory(deployment_request=dr1, marketplace_id=m1['id'])
marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12344', ppr_id=ppr.id)
marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12345')

marketplace_config_factory(deployment=dep1, marketplace_id=m1['id'])
marketplace_config_factory(deployment=dep1, marketplace_id='MP-12344')
marketplace_config_factory(deployment=dep1, marketplace_id='MP-124-114')

response = api_client.get(
f"/api/deployments/requests/{dr1.id}/marketplaces?marketplace={m1['id']}",
installation=installation,
)

assert response.status_code == 200
assert response.json() == [{
'id': m1['id'],
'name': m1['name'],
'icon': m1['icon'],
}], response.json()


def test_list_deployment_request_marketplaces_not_found(
deployment_factory,
deployment_request_factory,
Expand Down
43 changes: 43 additions & 0 deletions tests/models/test_deployment.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,46 @@ def test_generate_all_next_verbose_id(
dbsession.refresh(task)
assert f'TSK-{suffix}-00{index}' == task.id
index += 1


def test_list_deployment_request_marketplaces_filters(
mocker,
deployment_factory,
deployment_request_factory,
installation,
api_client,
marketplace,
marketplace_config_factory,
ppr_version_factory,
):
m1 = marketplace
marketplaces = [m1]

mocker.patch(
'connect_ext_ppr.webapp.get_marketplaces',
return_value=marketplaces,
)
dep1 = deployment_factory(account_id=installation['owner']['id'])
ppr = ppr_version_factory(deployment=dep1)

dr1 = deployment_request_factory(deployment=dep1)

marketplace_config_factory(deployment_request=dr1, marketplace_id=m1['id'])
marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12344', ppr_id=ppr.id)
marketplace_config_factory(deployment_request=dr1, marketplace_id='MP-12345')

marketplace_config_factory(deployment=dep1, marketplace_id=m1['id'])
marketplace_config_factory(deployment=dep1, marketplace_id='MP-12344')
marketplace_config_factory(deployment=dep1, marketplace_id='MP-124-114')

response = api_client.get(
f"/api/deployments/requests/{dr1.id}/marketplaces?marketplace={m1['id']}",
installation=installation,
)

assert response.status_code == 200
assert response.json() == [{
'id': m1['id'],
'name': m1['name'],
'icon': m1['icon'],
}], response.json()

0 comments on commit 55df357

Please sign in to comment.