Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LITE-28440: Add filtering and ordering to marketplaces endpoints #93

Merged
merged 1 commit into from
Aug 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion connect_ext_ppr/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
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 +18,7 @@ class Constants(Filter.Constants):


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

class Constants(Filter.Constants):
Expand All @@ -36,3 +39,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()