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
7 changes: 7 additions & 0 deletions e2e_config.test.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
"accounts.seller.id": "SEL-7310-3075",
"accounts.user.id": "USR-9673-3314",
"accounts.user_group.id": "UGR-6822-0561",
"commerce.agreement.id": "AGR-9850-2169-6098",
"commerce.product.id": "PRD-1767-7355",
"commerce.product.item.id": "ITM-1767-7355-0001",
"commerce.product.listing.id": "LST-5489-0806",
"commerce.product.template.id": "TPL-1767-7355-0003",
"commerce.authorization.id": "AUT-0031-2873",
"commerce.client.id": "ACC-1086-6867",
"catalog.product.item.id": "ITM-7255-3950-0751",
"catalog.product.document.id": "PDC-7255-3950-0001",
"catalog.product.id": "PRD-7255-3950",
Expand Down
24 changes: 24 additions & 0 deletions mpt_api_client/resources/commerce/agreements.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,18 @@ def template(self, agreement_id: str) -> str:
response = self._resource_do_request(agreement_id, action="template")
return response.text

def render(self, agreement_id: str) -> str:
"""Renders the template for the given Agreement id.

Args:
agreement_id: Agreement ID.

Returns:
Rendered Agreement.
"""
response = self._resource_do_request(agreement_id, action="render")
return response.text

def attachments(self, agreement_id: str) -> AgreementsAttachmentService:
"""Get the attachments service for the given Agreement id.

Expand Down Expand Up @@ -79,6 +91,18 @@ async def template(self, agreement_id: str) -> str:
response = await self._resource_do_request(agreement_id, action="template")
return response.text

async def render(self, agreement_id: str) -> str:
"""Renders the template for the given Agreement id.

Args:
agreement_id: Agreement ID.

Returns:
Rendered Agreement.
"""
response = await self._resource_do_request(agreement_id, action="render")
return response.text

def attachments(self, agreement_id: str) -> AsyncAgreementsAttachmentService:
"""Get the attachments service for the given Agreement id.

Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ dev = [
"ruff==0.12.11", # force ruff version to have same formatting everywhere
"typing-extensions==4.13.*",
"wemake-python-styleguide==1.3.*",
"types-python-dateutil",
]

[tool.hatch.build.targets.sdist]
Expand Down
15 changes: 0 additions & 15 deletions tests/e2e/accounts/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,6 @@ def currencies():
return ["USD", "EUR"]


@pytest.fixture
def account_id(e2e_config):
return e2e_config["accounts.account.id"]


@pytest.fixture
def seller_id(e2e_config):
return e2e_config["accounts.seller.id"]


@pytest.fixture
def buyer_id(e2e_config):
return e2e_config["accounts.buyer.id"]


@pytest.fixture
def user_group_id(e2e_config):
return e2e_config["accounts.user_group.id"]
Expand Down
5 changes: 0 additions & 5 deletions tests/e2e/accounts/licensees/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,6 @@ def licensee_group_id(e2e_config):
return e2e_config["accounts.licensee.group.id"]


@pytest.fixture
def licensee_id(e2e_config):
return e2e_config["accounts.licensee.id"]


@pytest.fixture
def invalid_licensee_id():
return "LCE-0000-0000-0000"
Expand Down
51 changes: 51 additions & 0 deletions tests/e2e/commerce/agreement/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import pytest
from freezegun import freeze_time


@pytest.fixture
def invalid_agreement_id():
return "AGR-0000-0000"


@pytest.fixture
def agreement_factory( # noqa: WPS211
account_id,
seller_id,
buyer_id,
licensee_id,
commerce_product_id,
authorization_id,
):
@freeze_time("2025-11-14T09:00:00.000Z")
def factory(
name: str = "E2E Created Agreement",
client_external_id: str = "test-client-external-id",
vendor_external_id: str = "test-vendor-external-id",
Comment on lines +20 to +23
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Remove type annotations from test code.

Per past review comments, this repository doesn't use type annotations in test files. Remove the type hints from the factory function parameters.

Apply this diff:

-    def factory(
-        name: str = "E2E Created Agreement",
-        client_external_id: str = "test-client-external-id",
-        vendor_external_id: str = "test-vendor-external-id",
-    ):
+    def factory(
+        name="E2E Created Agreement",
+        client_external_id="test-client-external-id",
+        vendor_external_id="test-vendor-external-id",
+    ):

Based on learnings, past review comments indicated that type annotations should not be used in test files in this repository.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def factory(
name: str = "E2E Created Agreement",
client_external_id: str = "test-client-external-id",
vendor_external_id: str = "test-vendor-external-id",
def factory(
name="E2E Created Agreement",
client_external_id="test-client-external-id",
vendor_external_id="test-vendor-external-id",
🤖 Prompt for AI Agents
In tests/e2e/commerce/agreement/conftest.py around lines 20 to 23, the factory
function parameters currently include Python type annotations (e.g., name: str,
client_external_id: str, vendor_external_id: str); remove all type annotations
from the test function signature so parameters are untyped (e.g., name = "E2E
Created Agreement", client_external_id = "test-client-external-id",
vendor_external_id = "test-vendor-external-id") while leaving default values
intact and adjusting any related docstrings or calls if necessary.

):
return {
"name": name,
"status": "Active",
"vendor": {"id": account_id},
"authorization": {"id": authorization_id},
"seller": {"id": seller_id},
"buyer": {"id": buyer_id},
"licensee": {"id": licensee_id},
"product": {"id": commerce_product_id},
"value": {
"PPxY": 150,
"PPxM": 12.5,
"SPxY": 165,
"SPxM": 13.75,
"markup": 0.1,
"margin": 0.11,
"currency": "USD",
},
"startDate": "2025-11-14T09:00:00.000Z",
"endDate": "2026-11-13T09:00:00.000Z",
"externalIds": {
"client": client_external_id,
"vendor": vendor_external_id,
},
}

return factory
76 changes: 76 additions & 0 deletions tests/e2e/commerce/agreement/test_async_agreement.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError
from mpt_api_client.rql.query_builder import RQLQuery

pytestmark = [pytest.mark.flaky]


@pytest.fixture
async def created_agreement(async_mpt_ops, agreement_factory):
new_agreement_request_data = agreement_factory(
name="E2E Created Agreement",
)

return await async_mpt_ops.commerce.agreements.create(new_agreement_request_data)


async def test_get_agreement_by_id(async_mpt_ops, agreement_id):
result = await async_mpt_ops.commerce.agreements.get(agreement_id)

assert result is not None


async def test_list_agreements(async_mpt_ops):
limit = 10

result = await async_mpt_ops.commerce.agreements.fetch_page(limit=limit)

assert len(result) > 0


async def test_get_agreement_by_id_not_found(async_mpt_ops, invalid_agreement_id):
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
await async_mpt_ops.commerce.agreements.get(invalid_agreement_id)


async def test_filter_agreements(async_mpt_ops, agreement_id):
select_fields = ["-value"]
filtered_agreements = (
async_mpt_ops.commerce.agreements.filter(RQLQuery(id=agreement_id))
.filter(RQLQuery(name="E2E Seeded For Commerce for Test Api Client Client"))
.select(*select_fields)
)

result = [filtered_agreement async for filtered_agreement in filtered_agreements.iterate()]

assert len(result) == 1


def test_create_agreement(created_agreement):
result = created_agreement

assert result is not None


async def test_update_agreement(async_mpt_ops, created_agreement, agreement_factory):
updated_name = "E2E Updated Agreement Name"
updated_agreement_data = agreement_factory(name=updated_name)

result = await async_mpt_ops.commerce.agreements.update(
created_agreement.id, updated_agreement_data
)

assert result is not None


async def test_get_agreement_render(async_mpt_ops, agreement_id):
result = await async_mpt_ops.commerce.agreements.render(agreement_id)

assert result is not None


async def test_get_agreement_template(async_mpt_ops, agreement_id):
result = await async_mpt_ops.commerce.agreements.template(agreement_id)

assert result is not None
74 changes: 74 additions & 0 deletions tests/e2e/commerce/agreement/test_sync_agreement.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError
from mpt_api_client.rql.query_builder import RQLQuery

pytestmark = [pytest.mark.flaky]


@pytest.fixture
def created_agreement(mpt_ops, agreement_factory):
new_agreement_request_data = agreement_factory(
name="E2E Created Agreement",
)

return mpt_ops.commerce.agreements.create(new_agreement_request_data)


def test_get_agreement_by_id(mpt_ops, agreement_id):
result = mpt_ops.commerce.agreements.get(agreement_id)

assert result is not None


def test_list_agreements(mpt_ops):
limit = 10

result = mpt_ops.commerce.agreements.fetch_page(limit=limit)

assert len(result) > 0


def test_get_agreement_by_id_not_found(mpt_ops, invalid_agreement_id):
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
mpt_ops.commerce.agreements.get(invalid_agreement_id)


def test_filter_agreements(mpt_ops, agreement_id):
select_fields = ["-value"]
filtered_agreements = (
mpt_ops.commerce.agreements.filter(RQLQuery(id=agreement_id))
.filter(RQLQuery(name="E2E Seeded For Commerce for Test Api Client Client"))
.select(*select_fields)
)

result = list(filtered_agreements.iterate())

assert len(result) == 1


def test_create_agreement(created_agreement):
result = created_agreement

assert result is not None


def test_update_agreement(mpt_ops, created_agreement, agreement_factory):
updated_name = "E2E Updated Agreement Name"
updated_agreement_data = agreement_factory(name=updated_name)

result = mpt_ops.commerce.agreements.update(created_agreement.id, updated_agreement_data)

assert result is not None


def test_get_agreement_render(mpt_ops, agreement_id):
result = mpt_ops.commerce.agreements.render(agreement_id)

assert result is not None


def test_get_agreement_template(mpt_ops, agreement_id):
result = mpt_ops.commerce.agreements.template(agreement_id)

assert result is not None
11 changes: 11 additions & 0 deletions tests/e2e/commerce/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import pytest


@pytest.fixture
def agreement_id(e2e_config):
return e2e_config["commerce.agreement.id"]


@pytest.fixture
def commerce_product_id(e2e_config):
return e2e_config["commerce.product.id"]
25 changes: 25 additions & 0 deletions tests/e2e/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,28 @@ def logo_fd():
@pytest.fixture
def user_id(e2e_config):
return e2e_config["accounts.user.id"]


@pytest.fixture
def account_id(e2e_config):
return e2e_config["accounts.account.id"]


@pytest.fixture
def seller_id(e2e_config):
return e2e_config["accounts.seller.id"]


@pytest.fixture
def buyer_id(e2e_config):
return e2e_config["accounts.buyer.id"]


@pytest.fixture
def licensee_id(e2e_config):
return e2e_config["accounts.licensee.id"]


@pytest.fixture
def authorization_id(e2e_config):
return e2e_config["commerce.authorization.id"]
2 changes: 2 additions & 0 deletions tests/seed/test_seed_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ def context_file_path(tmp_path):
async def test_seed_api_success(mock_context):
with (
patch("seed.seed_api.seed_catalog", new_callable=AsyncMock) as mock_seed_catalog,
patch("seed.seed_api.seed_commerce", new_callable=AsyncMock) as mock_seed_commerce,
patch("seed.seed_api.context_file") as mock_context_file,
patch("seed.seed_api.load_context") as load,
patch("seed.seed_api.save_context") as save,
Expand All @@ -34,4 +35,5 @@ async def test_seed_api_success(mock_context):

load.assert_called_once()
mock_seed_catalog.assert_called_once()
mock_seed_commerce.assert_called_once()
save.assert_called_once()
Loading