Skip to content

Commit

Permalink
LITE-28439: Addding filtering and ordering to deployments/requests
Browse files Browse the repository at this point in the history
  • Loading branch information
akodelia committed Aug 25, 2023
1 parent 5c7846f commit 1adc633
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 8 deletions.
29 changes: 27 additions & 2 deletions connect_ext_ppr/filters.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from typing import Optional
from typing import List, Optional

from fastapi_filter import FilterDepends, with_prefix
from fastapi_filter.contrib.sqlalchemy import Filter

from connect_ext_ppr.models.deployment import Deployment
from connect_ext_ppr.models.deployment import Deployment, DeploymentRequest
from connect_ext_ppr.models.ppr import PPRVersion


class DeploymentFilter(Filter):
Expand All @@ -11,3 +13,26 @@ class DeploymentFilter(Filter):

class Constants(Filter.Constants):
model = Deployment


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

class Constants(Filter.Constants):
model = PPRVersion


class DeploymentRequestFilter(Filter):
id: Optional[str]
deployment: Optional[DeploymentFilter] = FilterDepends(
with_prefix('deployment', DeploymentFilter),
)
status: Optional[str]
delegate_l2: Optional[bool]

ppr: Optional[PPRVersionFilter] = FilterDepends(with_prefix('ppr', PPRVersionFilter))

order_by: Optional[List[str]]

class Constants(Filter.Constants):
model = DeploymentRequest
10 changes: 6 additions & 4 deletions connect_ext_ppr/webapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
VerboseBaseSession,
)
from connect_ext_ppr.errors import ExtensionHttpError, ExtensionValidationError
from connect_ext_ppr.filters import DeploymentFilter
from connect_ext_ppr.filters import DeploymentFilter, DeploymentRequestFilter
from connect_ext_ppr.models.configuration import Configuration
from connect_ext_ppr.models.deployment import (
Deployment,
Expand Down Expand Up @@ -183,6 +183,7 @@ def add_dep_request(
)
def list_deployment_requests(
self,
dr_filter: DeploymentRequestFilter = FilterDepends(DeploymentRequestFilter),
pagination_params: PaginationParams = Depends(),
response: Response = None,
client: ConnectClient = Depends(get_installation_client),
Expand All @@ -200,12 +201,13 @@ def list_deployment_requests(
account_id=installation['owner']['id'],
)

deployment_requests = db.query(DeploymentRequest).options(
joinedload(DeploymentRequest.ppr),
joinedload(DeploymentRequest.deployment),
deployment_requests = db.query(DeploymentRequest).join(
DeploymentRequest.deployment, DeploymentRequest.ppr,
).filter(
DeploymentRequest.deployment_id.in_(deployments),
)
deployment_requests = dr_filter.filter(deployment_requests)
deployment_requests = dr_filter.sort(deployment_requests)
deployment_requests = apply_pagination(deployment_requests, db, pagination_params, response)

response_list = []
Expand Down
127 changes: 127 additions & 0 deletions tests/api/test_deployment_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,133 @@ def test_list_deployments_requests_pagination(
assert response.headers['Content-Range'] == expected_header


@pytest.mark.parametrize(
('filters', 'expected_amount', 'expected_header'),
(
('', 60, 'items 0-59/60'),
('deployment__product_id=PRD-1', 12, 'items 0-11/12'),
('deployment__hub_id=HB-0000-0002', 15, 'items 0-14/15'),
('status=pending', 20, 'items 0-19/20'),
('delegate_l2=false', 40, 'items 0-39/40'),
('delegate_l2=true', 20, 'items 0-19/20'),
('ppr__version=1', 20, 'items 0-19/20'),
),
)
def test_list_deployments_requests_filters(
filters,
expected_amount,
expected_header,
mocker,
deployment_factory,
deployment_request_factory,
ppr_version_factory,
installation,
api_client,
):
hubs_data = [{
'id': f'HB-0000-000{i}',
'name': 'Another Hub for the best',
} for i in range(4)]

mocker.patch(
'connect_ext_ppr.webapp.get_hubs',
side_effect=[hubs_data],
)

for i in range(5):
for hub in hubs_data:
dep1 = deployment_factory(
product_id=f'PRD-{i}',
account_id=installation['owner']['id'],
hub_id=hub['id'],
)

deployment_request_factory(
deployment=dep1,
status='error',
ppr=ppr_version_factory(deployment=dep1, version=1))

deployment_request_factory(
deployment=dep1,
status='done',
delegate_l2=True,
ppr=ppr_version_factory(deployment=dep1, version=2))

deployment_request_factory(
deployment=dep1,
status='pending',
ppr=ppr_version_factory(deployment=dep1, version=3))

response = api_client.get(
f'/api/deployments/requests?{filters}',
installation=installation,
)
assert response.status_code == 200
assert len(response.json()) == expected_amount
assert response.headers['Content-Range'] == expected_header


@pytest.mark.parametrize(
('query_str', 'expected_amount', 'expected_header'),
(
('delegate_l2=false&limit=10&offset=10', 10, 'items 10-19/40'),
('delegate_l2=false&limit=10&offset=50', 0, 'items 50-50/40'),
),
)
def test_list_deployments_requests_filters_and_paginations(
query_str,
expected_amount,
expected_header,
mocker,
deployment_factory,
deployment_request_factory,
ppr_version_factory,
installation,
api_client,
):
hubs_data = [{
'id': f'HB-0000-000{i}',
'name': 'Another Hub for the best',
} for i in range(4)]

mocker.patch(
'connect_ext_ppr.webapp.get_hubs',
side_effect=[hubs_data],
)

for i in range(5):
for hub in hubs_data:
dep1 = deployment_factory(
product_id=f'PRD-{i}',
account_id=installation['owner']['id'],
hub_id=hub['id'],
)

deployment_request_factory(
deployment=dep1,
status='error',
ppr=ppr_version_factory(deployment=dep1, version=1))

deployment_request_factory(
deployment=dep1,
status='done',
delegate_l2=True,
ppr=ppr_version_factory(deployment=dep1, version=2))

deployment_request_factory(
deployment=dep1,
status='pending',
ppr=ppr_version_factory(deployment=dep1, version=3))

response = api_client.get(
f'/api/deployments/requests?{query_str}',
installation=installation,
)
assert response.status_code == 200
assert len(response.json()) == expected_amount
assert response.headers['Content-Range'] == expected_header


def test_get_deployment_request(
mocker,
deployment_factory,
Expand Down
1 change: 0 additions & 1 deletion tests/api/test_deployments.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,6 @@ def test_list_deployments_requests_for_deployment_with_pagination(


def test_list_deployment_request_deployment_not_found(
dbsession,
deployment_factory,
deployment_request_factory,
installation,
Expand Down
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def _build_ppr(
status='pending',
):
ppr = PPRVersion(
file=file or file_factory().id,
file=file or file_factory(id='MFL-{0}'.format(random.randint(10000, 99999))).id,
deployment=deployment.id,
configuration=configuration,
summary=summary or {},
Expand Down

0 comments on commit 1adc633

Please sign in to comment.