Skip to content
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
26 changes: 26 additions & 0 deletions backend/tests/routers/conftest.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import pytest
from mpt_api_client.models.meta import Pagination
from mpt_extension_sdk.api.context import APIContext, AuthenticatedRequestContext
from mpt_extension_sdk.services.mpt_api_service import MPTAPIService
from mpt_extension_sdk.services.mpt_api_service.agreement import AgreementService

Expand All @@ -21,3 +23,27 @@ def mpt_api_service(mpt_api_service_factory):
@pytest.fixture
def vendor_mpt_api_service(mpt_api_service_factory):
return mpt_api_service_factory()


@pytest.fixture
def api_context_factory(mocker, mpt_api_service, vendor_mpt_api_service):
def factory(*, task=None, offset=0, limit=10):
ctx = mocker.create_autospec(APIContext, instance=True)
ctx.mpt_api_service = mpt_api_service
ctx.vendor_mpt_api_service = vendor_mpt_api_service
ctx.task = task
ctx.request = mocker.create_autospec(AuthenticatedRequestContext, instance=True)
ctx.request.pagination = Pagination(offset=offset, limit=limit)
return ctx

return factory


@pytest.fixture
def agreement_id(agreement_payload):
return agreement_payload["id"]


@pytest.fixture
def vendor_external_id():
return "ABC-2023-C07-dbeee0b302c0"
81 changes: 41 additions & 40 deletions backend/tests/routers/test_agreements.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import pytest
from mpt_api_client.exceptions import MPTAPIError
from mpt_api_client.models.meta import Pagination
from mpt_extension_sdk.api.context import APIContext, AuthenticatedRequestContext
from mpt_extension_sdk.api.errors import NotFoundError
from mpt_extension_sdk.models import Agreement
from mpt_extension_sdk.models.external_id import ExternalIds
Expand All @@ -16,22 +14,28 @@
)


async def test_get_reads_marketplace(mocker, agreement_payload, mpt_api_service):
agreement = mocker.Mock(spec=Agreement)
@pytest.fixture
def agreement_in_mpt(mocker, agreement_payload, vendor_external_id, mpt_api_service):
agreement = mocker.create_autospec(Agreement, instance=True)
agreement.to_dict.return_value = agreement_payload
ctx = mocker.create_autospec(APIContext, instance=True)
ctx.mpt_api_service = mpt_api_service
agreement.external_ids = ExternalIds(vendor=vendor_external_id)
mpt_api_service.agreements.get_by_id.return_value = agreement
return agreement

result = await get_agreement("AGR-1234-5678", ctx)

mpt_api_service.agreements.get_by_id.assert_awaited_once_with("AGR-1234-5678")
async def test_get_reads_marketplace(
api_context_factory, agreement_id, agreement_in_mpt, agreement_payload
):
ctx = api_context_factory()

result = await get_agreement(agreement_id, ctx)

ctx.mpt_api_service.agreements.get_by_id.assert_awaited_once_with(agreement_id)
assert result.payload == agreement_payload


async def test_get_maps_marketplace_not_found(mocker, mpt_api_service):
ctx = mocker.create_autospec(APIContext, instance=True)
ctx.mpt_api_service = mpt_api_service
async def test_get_maps_marketplace_not_found(api_context_factory, mpt_api_service):
ctx = api_context_factory()
mpt_api_service.agreements.get_by_id.side_effect = MPTAPIError(
HTTPStatus.NOT_FOUND, "Not Found", {"detail": "Entity for given id not-found not found"}
)
Expand All @@ -40,39 +44,36 @@ async def test_get_maps_marketplace_not_found(mocker, mpt_api_service):
await get_agreement("not-found", ctx)


async def test_sync_writes_back_as_the_vendor(
mocker, agreement_payload, mpt_api_service, vendor_mpt_api_service
):
agreement = mocker.Mock(spec=Agreement)
agreement.to_dict.return_value = agreement_payload
agreement.external_ids = ExternalIds(vendor="ABC-2023-C07-dbeee0b302c0")
ctx = mocker.create_autospec(APIContext, instance=True)
ctx.mpt_api_service = mpt_api_service
ctx.vendor_mpt_api_service = vendor_mpt_api_service
mpt_api_service.agreements.get_by_id.return_value = agreement
async def test_get_agreements_paginated(api_context_factory, agreement_payload):
page = PaginatedCollection(limit=10, offset=0, resources=[agreement_payload], total=2)
ctx = api_context_factory(offset=0, limit=10)
ctx.mpt_api_service.agreements.get_all.return_value = page

result = await sync_agreement("AGR-1234-5678", ctx)
result = await get_agreements(ctx)

ctx.mpt_api_service.agreements.get_all.assert_awaited_once_with(offset=0, limit=10)
assert result.payload == [agreement_payload]
assert result.paginated_result.total == 2
assert result.paginated_result.offset == 0
assert result.paginated_result.limit == 10


async def test_sync_answers_with_the_agreement(
api_context_factory, agreement_id, agreement_in_mpt, agreement_payload
):
result = await sync_agreement(agreement_id, api_context_factory())

mpt_api_service.agreements.get_by_id.assert_awaited_once_with("AGR-1234-5678")
vendor_mpt_api_service.agreements.update.assert_awaited_once_with(
"AGR-1234-5678", {"externalIds": {"vendor": "ABC-2023-C07-dbeee0b302c0"}}
)
mpt_api_service.agreements.update.assert_not_awaited()
assert result.payload == agreement_payload


async def test_get_agreements_paginated(mocker, agreement_payload, mpt_api_service):
page = mocker.Mock(spec=PaginatedCollection, resources=[agreement_payload], total=1)
ctx = mocker.create_autospec(APIContext, instance=True)
ctx.request = mocker.create_autospec(AuthenticatedRequestContext, instance=True)
ctx.request.pagination = mocker.Mock(spec=Pagination, offset=0, limit=10)
ctx.mpt_api_service = mpt_api_service
mpt_api_service.agreements.get_all.return_value = page
async def test_sync_writes_back_as_the_vendor(
api_context_factory, agreement_id, agreement_in_mpt, vendor_external_id
):
ctx = api_context_factory()

result = await get_agreements(ctx)
await sync_agreement(agreement_id, ctx) # act

mpt_api_service.agreements.get_all.assert_awaited_once_with(offset=0, limit=10)
assert result.payload == [agreement_payload]
assert result.paginated_result.total == 1
assert result.paginated_result.offset == 0
assert result.paginated_result.limit == 10
ctx.vendor_mpt_api_service.agreements.update.assert_awaited_once_with(
agreement_id, {"externalIds": {"vendor": vendor_external_id}}
)
ctx.mpt_api_service.agreements.update.assert_not_awaited()
Loading