Skip to content

Commit eb10dde

Browse files
author
Robert Segal
committed
Fixed agreement attachments endpoints, created e2e tests
1 parent ff6b291 commit eb10dde

File tree

6 files changed

+218
-7
lines changed

6 files changed

+218
-7
lines changed

e2e_config.test.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
"accounts.seller.id": "SEL-7310-3075",
1212
"accounts.user.id": "USR-9673-3314",
1313
"accounts.user_group.id": "UGR-6822-0561",
14+
"commerce.agreement.attachment.id": "ATT-9850-2169-6098-0001",
1415
"commerce.agreement.id": "AGR-9850-2169-6098",
16+
"commerce.order.id": "ORD-6969-3541-5426",
1517
"commerce.product.id": "PRD-1767-7355",
1618
"commerce.product.item.id": "ITM-1767-7355-0001",
1719
"commerce.product.listing.id": "LST-5489-0806",

mpt_api_client/resources/commerce/agreements_attachments.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
from mpt_api_client.http import AsyncService, Service
2-
from mpt_api_client.http.mixins import (
2+
from mpt_api_client.http.mixins import ( # noqa: WPS235
33
AsyncCollectionMixin,
4+
AsyncCreateFileMixin,
45
AsyncDeleteMixin,
5-
AsyncFilesOperationsMixin,
6+
AsyncDownloadFileMixin,
67
AsyncGetMixin,
8+
AsyncUpdateMixin,
79
CollectionMixin,
10+
CreateFileMixin,
811
DeleteMixin,
9-
FilesOperationsMixin,
12+
DownloadFileMixin,
1013
GetMixin,
14+
UpdateMixin,
1115
)
1216
from mpt_api_client.models import Model
1317

@@ -22,10 +26,14 @@ class AgreementsAttachmentServiceConfig:
2226
_endpoint = "/public/v1/commerce/agreements/{agreement_id}/attachments"
2327
_model_class = AgreementAttachment
2428
_collection_key = "data"
29+
_upload_file_key = "file"
30+
_upload_data_key = "attachment"
2531

2632

2733
class AgreementsAttachmentService(
28-
FilesOperationsMixin[AgreementAttachment],
34+
CreateFileMixin[AgreementAttachment],
35+
UpdateMixin[AgreementAttachment],
36+
DownloadFileMixin[AgreementAttachment],
2937
DeleteMixin,
3038
GetMixin[AgreementAttachment],
3139
CollectionMixin[AgreementAttachment],
@@ -36,7 +44,9 @@ class AgreementsAttachmentService(
3644

3745

3846
class AsyncAgreementsAttachmentService(
39-
AsyncFilesOperationsMixin[AgreementAttachment],
47+
AsyncCreateFileMixin[AgreementAttachment],
48+
AsyncUpdateMixin[AgreementAttachment],
49+
AsyncDownloadFileMixin[AgreementAttachment],
4050
AsyncDeleteMixin,
4151
AsyncGetMixin[AgreementAttachment],
4252
AsyncCollectionMixin[AgreementAttachment],
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def invalid_agreement_attachment_id():
6+
return "ATT-0000-0000-0000-0000"
7+
8+
9+
@pytest.fixture
10+
def agreement_attachment_id(e2e_config):
11+
return e2e_config["commerce.agreement.attachment.id"]
12+
13+
14+
@pytest.fixture
15+
def agreement_attachment_factory():
16+
def factory(
17+
name: str = "E2E Created Agreement Attachment",
18+
attachment_type: str = "File",
19+
license_key: str = "",
20+
):
21+
return {
22+
"name": name,
23+
"description": name,
24+
"type": attachment_type,
25+
"licenseKey": license_key,
26+
}
27+
28+
return factory
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
async def created_agreement_attachment(agreement_attachments, agreement_attachment_factory, pdf_fd):
11+
new_agreement_attachment_request_data = agreement_attachment_factory(
12+
name="E2E Created Agreement Attachment",
13+
)
14+
return await agreement_attachments.create(new_agreement_attachment_request_data, file=pdf_fd)
15+
16+
17+
@pytest.fixture
18+
def agreement_attachments(async_mpt_ops, agreement_id):
19+
return async_mpt_ops.commerce.agreements.attachments(agreement_id)
20+
21+
22+
async def test_get_agreement_attachment_by_id(agreement_attachments, agreement_attachment_id):
23+
result = await agreement_attachments.get(agreement_attachment_id)
24+
assert result is not None
25+
26+
27+
async def test_get_agreement_attachment_by_id_not_found(
28+
agreement_attachments, invalid_agreement_attachment_id
29+
):
30+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
31+
await agreement_attachments.get(invalid_agreement_attachment_id)
32+
33+
34+
async def test_list_agreement_attachments(agreement_attachments):
35+
limit = 10
36+
37+
result = await agreement_attachments.fetch_page(limit=limit)
38+
39+
assert len(result) > 0
40+
41+
42+
async def test_filter_agreement_attachments(agreement_attachments, agreement_attachment_id):
43+
select_fields = ["-description"]
44+
filtered_attachments = (
45+
agreement_attachments.filter(RQLQuery(id=agreement_attachment_id))
46+
.filter(RQLQuery(name="E2E Seeded Agreement Attachment"))
47+
.select(*select_fields)
48+
)
49+
50+
result = [att async for att in filtered_attachments.iterate()]
51+
52+
assert len(result) == 1
53+
54+
55+
def test_create_agreement_attachment(created_agreement_attachment):
56+
result = created_agreement_attachment
57+
58+
assert result is not None
59+
60+
61+
async def test_update_agreement_attachment(agreement_attachments, created_agreement_attachment):
62+
updated_name = "E2E Updated Agreement Attachment Name"
63+
updated_attachment_data = {
64+
"name": updated_name,
65+
"description": updated_name,
66+
}
67+
attachment = created_agreement_attachment
68+
69+
result = await agreement_attachments.update(attachment.id, updated_attachment_data)
70+
71+
assert result is not None
72+
73+
74+
async def test_delete_agreement_attachment(agreement_attachments, created_agreement_attachment):
75+
result = created_agreement_attachment
76+
await agreement_attachments.delete(result.id)
77+
78+
79+
async def test_download_agreement_attachment(agreement_attachments, created_agreement_attachment):
80+
attachment = created_agreement_attachment
81+
82+
result = await agreement_attachments.download(attachment.id)
83+
84+
assert result.file_contents is not None
85+
assert result.filename == "empty.pdf"
86+
assert result.filename == "empty.pdf"
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
def created_agreement_attachment(mpt_ops, agreement_attachment_factory, agreement_id, pdf_fd):
11+
new_agreement_attachment_request_data = agreement_attachment_factory(
12+
name="E2E Created Agreement Attachment",
13+
)
14+
agreement_attachments = mpt_ops.commerce.agreements.attachments(agreement_id)
15+
return agreement_attachments.create(new_agreement_attachment_request_data, file=pdf_fd)
16+
17+
18+
@pytest.fixture
19+
def agreement_attachments(mpt_ops, agreement_id):
20+
return mpt_ops.commerce.agreements.attachments(agreement_id)
21+
22+
23+
def test_get_agreement_attachment_by_id(agreement_attachments, agreement_attachment_id):
24+
result = agreement_attachments.get(agreement_attachment_id)
25+
26+
assert result is not None
27+
28+
29+
def test_get_agreement_attachment_by_id_not_found(
30+
agreement_attachments, invalid_agreement_attachment_id
31+
):
32+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
33+
agreement_attachments.get(invalid_agreement_attachment_id)
34+
35+
36+
def test_list_agreement_attachments(agreement_attachments):
37+
limit = 10
38+
39+
result = agreement_attachments.fetch_page(limit=limit)
40+
41+
assert len(result) > 0
42+
43+
44+
def test_filter_agreement_attachments(agreement_attachments, agreement_attachment_id):
45+
select_fields = ["-description"]
46+
filtered_attachments = (
47+
agreement_attachments.filter(RQLQuery(id=agreement_attachment_id))
48+
.filter(RQLQuery(name="E2E Seeded Agreement Attachment"))
49+
.select(*select_fields)
50+
)
51+
52+
result = list(filtered_attachments.iterate())
53+
54+
assert len(result) == 1
55+
56+
57+
def test_create_agreement_attachment(created_agreement_attachment):
58+
result = created_agreement_attachment
59+
60+
assert result is not None
61+
62+
63+
def test_update_agreement_attachment(agreement_attachments, created_agreement_attachment):
64+
updated_name = "E2E Updated Agreement Attachment Name"
65+
updated_attachment_data = {
66+
"name": updated_name,
67+
"description": updated_name,
68+
}
69+
70+
result = agreement_attachments.update(created_agreement_attachment.id, updated_attachment_data)
71+
72+
assert result is not None
73+
74+
75+
def test_delete_agreement_attachment(agreement_attachments, created_agreement_attachment):
76+
result = created_agreement_attachment
77+
78+
agreement_attachments.delete(result.id)
79+
80+
81+
def test_download_agreement_attachment(agreement_attachments, created_agreement_attachment):
82+
result = agreement_attachments.download(created_agreement_attachment.id)
83+
84+
assert result.file_contents is not None
85+
assert result.filename == "empty.pdf"

tests/unit/resources/commerce/test_agreements_attachments.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ def test_async_endpoint(async_attachment_service) -> None:
3232
assert result is True
3333

3434

35-
@pytest.mark.parametrize("method", ["get", "create", "delete", "download"])
35+
@pytest.mark.parametrize("method", ["get", "create", "update", "delete", "download"])
3636
def test_methods_present(attachment_service, method: str) -> None:
3737
result = hasattr(attachment_service, method)
3838

3939
assert result is True
4040

4141

42-
@pytest.mark.parametrize("method", ["get", "create", "delete", "download"])
42+
@pytest.mark.parametrize("method", ["get", "create", "update", "delete", "download"])
4343
def test_async_methods_present(async_attachment_service, method: str) -> None:
4444
result = hasattr(async_attachment_service, method)
4545

0 commit comments

Comments
 (0)