Skip to content

Commit 62e9762

Browse files
committed
MPT-14891 E2E for product terms and variants
1 parent d9af1e6 commit 62e9762

13 files changed

Lines changed: 392 additions & 17 deletions

File tree

e2e_config.test.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,7 @@
1616
"catalog.product.item_group.id": "IGR-7255-3950-0001",
1717
"catalog.product.parameter.id": "PAR-7255-3950-0016",
1818
"catalog.product.parameter_group.id": "PGR-7255-3950-0001",
19+
"catalog.product.terms.id": "TCS-7255-3950-0001",
20+
"catalog.product.terms.variant.id": "TCV-7255-3950-0001-0001",
1921
"catalog.unit.id": "UNT-1229"
2022
}
Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
from mpt_api_client.http import AsyncService, Service
22
from mpt_api_client.http.mixins import (
33
AsyncCollectionMixin,
4-
AsyncFilesOperationsMixin,
4+
AsyncDownloadFileMixin,
55
AsyncModifiableResourceMixin,
66
CollectionMixin,
7-
FilesOperationsMixin,
7+
DownloadFileMixin,
88
ModifiableResourceMixin,
99
)
1010
from mpt_api_client.models import Model
1111
from mpt_api_client.resources.catalog.mixins import (
12+
AsyncCreateFileMixin,
1213
AsyncPublishableMixin,
14+
CreateFileMixin,
1315
PublishableMixin,
1416
)
1517

@@ -21,13 +23,14 @@ class TermVariant(Model):
2123
class TermVariantServiceConfig:
2224
"""Term variant service configuration."""
2325

24-
_endpoint = "/public/v1/catalog/products/terms/{term_id}/variants"
26+
_endpoint = "/public/v1/catalog/products/{product_id}/terms/{term_id}/variants"
2527
_model_class = TermVariant
2628
_collection_key = "data"
2729

2830

2931
class TermVariantService(
30-
FilesOperationsMixin[TermVariant],
32+
CreateFileMixin[TermVariant],
33+
DownloadFileMixin[TermVariant],
3134
ModifiableResourceMixin[TermVariant],
3235
PublishableMixin[TermVariant],
3336
CollectionMixin[TermVariant],
@@ -36,13 +39,20 @@ class TermVariantService(
3639
):
3740
"""Term variant service."""
3841

42+
_upload_file_key = "file"
43+
_upload_data_key = "variant"
44+
3945

4046
class AsyncTermVariantService(
41-
AsyncFilesOperationsMixin[TermVariant],
47+
AsyncCreateFileMixin[TermVariant],
48+
AsyncDownloadFileMixin[TermVariant],
4249
AsyncModifiableResourceMixin[TermVariant],
4350
AsyncPublishableMixin[TermVariant],
4451
AsyncCollectionMixin[TermVariant],
4552
AsyncService[TermVariant],
4653
TermVariantServiceConfig,
4754
):
4855
"""Async Term variant service."""
56+
57+
_upload_file_key = "file"
58+
_upload_data_key = "variant"

mpt_api_client/resources/catalog/product_terms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def variants(self, term_id: str) -> TermVariantService:
3838
"""Access term variants service."""
3939
return TermVariantService(
4040
http_client=self.http_client,
41-
endpoint_params={"term_id": term_id},
41+
endpoint_params={"product_id": self.endpoint_params["product_id"], "term_id": term_id},
4242
)
4343

4444

@@ -55,5 +55,5 @@ def variants(self, term_id: str) -> AsyncTermVariantService:
5555
"""Access async term variants service."""
5656
return AsyncTermVariantService(
5757
http_client=self.http_client,
58-
endpoint_params={"term_id": term_id},
58+
endpoint_params={"product_id": self.endpoint_params["product_id"], "term_id": term_id},
5959
)

tests/e2e/catalog/product/documents/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def document_data():
1212
"name": "e2e test document - please delete",
1313
"description": "E2E test document for automated testing",
1414
"language": "en-gb",
15+
"url": "",
1516
}
1617

1718

tests/e2e/catalog/product/documents/test_sync_document.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def created_document_from_file(logger, vendor_document_service, document_data, p
1818

1919

2020
@pytest.fixture
21-
def created_document_from_link(logger, vendor_document_service, document_data, pdf_url):
21+
def created_document_from_url(logger, vendor_document_service, document_data, pdf_url):
2222
document_data["url"] = pdf_url
2323
document = vendor_document_service.create(document_data)
2424
yield document
@@ -33,9 +33,9 @@ def test_create_document(created_document_from_file, document_data):
3333
assert created_document_from_file.description == document_data["description"]
3434

3535

36-
def test_create_from_link(created_document_from_link, pdf_url, document_data):
37-
assert created_document_from_link.name == document_data["name"]
38-
assert created_document_from_link.description == document_data["description"]
36+
def test_create_document_from_url(created_document_from_url, document_data):
37+
assert created_document_from_url.name == document_data["name"]
38+
assert created_document_from_url.description == document_data["description"]
3939

4040

4141
def test_update_document(vendor_document_service, created_document_from_file):
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def term_data():
6+
return {"name": "e2e - please delete", "description": "Test term description"}
7+
8+
9+
@pytest.fixture
10+
def term_id(e2e_config):
11+
return e2e_config["catalog.product.terms.id"]
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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 async_vendor_terms_service(async_mpt_vendor, product_id):
11+
return async_mpt_vendor.catalog.products.terms(product_id)
12+
13+
14+
@pytest.fixture
15+
async def async_created_term(async_vendor_terms_service, term_data):
16+
service = async_vendor_terms_service
17+
term = await service.create(term_data)
18+
yield term
19+
try:
20+
await service.delete(term.id)
21+
except MPTAPIError as error:
22+
print(f"TEARDOWN - Unable to delete term {term.id}: {error.title}")
23+
24+
25+
def test_create_term(async_created_term):
26+
term = async_created_term
27+
assert term.name == "e2e - please delete"
28+
29+
30+
async def test_update_term(async_vendor_terms_service, async_created_term):
31+
service = async_vendor_terms_service
32+
update_data = {"name": "e2e - delete me (updated)"}
33+
term = await service.update(async_created_term.id, update_data)
34+
assert term.name == "e2e - delete me (updated)"
35+
36+
37+
async def test_get_term(async_vendor_terms_service, term_id):
38+
service = async_vendor_terms_service
39+
term = await service.get(term_id)
40+
assert term.id == term_id
41+
42+
43+
async def test_get_term_by_id(async_vendor_terms_service, term_id):
44+
service = async_vendor_terms_service
45+
term = await service.get(term_id)
46+
assert term.id == term_id
47+
48+
49+
async def test_iterate_terms(async_vendor_terms_service, async_created_term):
50+
service = async_vendor_terms_service
51+
terms = [term async for term in service.iterate()]
52+
assert any(term.id == async_created_term.id for term in terms)
53+
54+
55+
async def test_filter_terms(async_vendor_terms_service, term_id):
56+
select_fields = ["-description"]
57+
filtered_terms = async_vendor_terms_service.filter(RQLQuery(id=term_id)).select(*select_fields)
58+
terms = [term async for term in filtered_terms.iterate()]
59+
assert len(terms) == 1
60+
assert terms[0].id == term_id
61+
62+
63+
async def test_delete_term(async_vendor_terms_service, async_created_term):
64+
service = async_vendor_terms_service
65+
await service.delete(async_created_term.id)
66+
with pytest.raises(MPTAPIError):
67+
await service.get(async_created_term.id)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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 vendor_terms_service(mpt_vendor, product_id):
11+
return mpt_vendor.catalog.products.terms(product_id)
12+
13+
14+
@pytest.fixture
15+
def created_term(logger, vendor_terms_service, term_data):
16+
service = vendor_terms_service
17+
term = service.create(term_data)
18+
yield term
19+
try:
20+
service.delete(term.id)
21+
except MPTAPIError as error:
22+
print(f"TEARDOWN - Unable to delete term {term.id}: {error.title}")
23+
24+
25+
@pytest.fixture
26+
def created_term_from_url(logger, vendor_terms_service, term_data, pdf_url):
27+
term_data["url"] = pdf_url
28+
service = vendor_terms_service
29+
term = service.create(term_data)
30+
yield term
31+
try:
32+
service.delete(term.id)
33+
except MPTAPIError as error:
34+
print(f"TEARDOWN - Unable to delete term {term.id}: {error.title}")
35+
36+
37+
def test_create_term(created_term):
38+
term = created_term
39+
assert term.name == "e2e - please delete"
40+
41+
42+
def test_update_term(vendor_terms_service, created_term):
43+
service = vendor_terms_service
44+
update_data = {"name": "e2e - delete me (updated)"}
45+
term = service.update(created_term.id, update_data)
46+
assert term.name == "e2e - delete me (updated)"
47+
48+
49+
def test_get_term(vendor_terms_service, term_id):
50+
service = vendor_terms_service
51+
term = service.get(term_id)
52+
assert term.id == term_id
53+
54+
55+
def test_get_term_by_id(vendor_terms_service, term_id):
56+
service = vendor_terms_service
57+
term = service.get(term_id)
58+
assert term.id == term_id
59+
60+
61+
def test_iterate_terms(vendor_terms_service, created_term):
62+
service = vendor_terms_service
63+
terms = list(service.iterate())
64+
assert any(term.id == created_term.id for term in terms)
65+
66+
67+
def test_filter_terms(vendor_terms_service, term_id):
68+
select_fields = ["-description"]
69+
filtered_terms = vendor_terms_service.filter(RQLQuery(id=term_id)).select(*select_fields)
70+
terms = list(filtered_terms.iterate())
71+
assert len(terms) == 1
72+
assert terms[0].id == term_id
73+
74+
75+
def test_delete_term(vendor_terms_service, created_term):
76+
service = vendor_terms_service
77+
service.delete(created_term.id)
78+
with pytest.raises(MPTAPIError):
79+
service.get(created_term.id)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def variant_data():
6+
return {
7+
"name": "e2e - please delete",
8+
"description": "Test variant description",
9+
"languageCode": "en-gb",
10+
"type": "File",
11+
"assetUrl": "",
12+
}
13+
14+
15+
@pytest.fixture
16+
def variant_id(e2e_config):
17+
return e2e_config["catalog.product.terms.variant.id"]
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
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 async_vendor_variant_service(async_mpt_vendor, product_id, term_id):
11+
return async_mpt_vendor.catalog.products.terms(product_id).variants(term_id)
12+
13+
14+
@pytest.fixture
15+
async def async_created_variant(
16+
variant_data,
17+
pdf_fd,
18+
async_vendor_variant_service,
19+
):
20+
variant = await async_vendor_variant_service.create(variant_data, pdf_fd)
21+
yield variant
22+
try:
23+
await async_vendor_variant_service.delete(variant.id)
24+
except MPTAPIError as error:
25+
print(f"TEARDOWN - Unable to delete variant {variant.id}: {error.title}")
26+
27+
28+
@pytest.fixture
29+
async def created_variant_from_url(
30+
variant_data,
31+
pdf_url,
32+
async_vendor_variant_service,
33+
):
34+
variant_data["type"] = "Online"
35+
variant_data["assetUrl"] = pdf_url
36+
variant = await async_vendor_variant_service.create(variant_data)
37+
yield variant
38+
try:
39+
await async_vendor_variant_service.delete(variant.id)
40+
except MPTAPIError as error:
41+
print(f"TEARDOWN - Unable to delete variant {variant.id}: {error.title}")
42+
43+
44+
def test_create_variant(async_created_variant):
45+
variant = async_created_variant
46+
assert variant.name == "e2e - please delete"
47+
48+
49+
def test_create_variant_from_url(created_variant_from_url, variant_data):
50+
assert created_variant_from_url.name == variant_data["name"]
51+
52+
53+
async def test_update_variant(
54+
async_mpt_vendor, product_id, term_id, async_created_variant, async_vendor_variant_service
55+
):
56+
service = async_vendor_variant_service
57+
update_data = {"name": "e2e - delete me (updated)"}
58+
variant = await service.update(async_created_variant.id, update_data)
59+
assert variant.name == "e2e - delete me (updated)"
60+
61+
62+
async def test_get_variant(
63+
async_mpt_vendor, product_id, term_id, variant_id, async_vendor_variant_service
64+
):
65+
service = async_vendor_variant_service
66+
variant = await service.get(variant_id)
67+
assert variant.id == variant_id
68+
69+
70+
async def test_get_variant_by_id(
71+
async_mpt_vendor, product_id, term_id, variant_id, async_vendor_variant_service
72+
):
73+
service = async_vendor_variant_service
74+
variant = await service.get(variant_id)
75+
assert variant.id == variant_id
76+
77+
78+
async def test_iterate_variants(
79+
async_mpt_vendor, product_id, term_id, async_created_variant, async_vendor_variant_service
80+
):
81+
service = async_vendor_variant_service
82+
variants = [variant async for variant in service.iterate()]
83+
assert any(variant.id == async_created_variant.id for variant in variants)
84+
85+
86+
async def test_filter_variants(
87+
async_mpt_vendor, product_id, term_id, variant_id, async_vendor_variant_service
88+
):
89+
select_fields = ["-description"]
90+
filtered_variants = async_vendor_variant_service.filter(RQLQuery(id=variant_id)).select(
91+
*select_fields
92+
)
93+
variants = [variant async for variant in filtered_variants.iterate()]
94+
assert len(variants) == 1
95+
assert variants[0].id == variant_id
96+
97+
98+
async def test_delete_variant(
99+
async_mpt_vendor, product_id, term_id, async_created_variant, async_vendor_variant_service
100+
):
101+
service = async_vendor_variant_service
102+
await service.delete(async_created_variant.id)
103+
with pytest.raises(MPTAPIError):
104+
await service.get(async_created_variant.id)

0 commit comments

Comments
 (0)