Skip to content

Commit bd188ad

Browse files
author
Robert Segal
committed
Added sellers E2E tests
1 parent 262d20c commit bd188ad

File tree

7 files changed

+318
-1
lines changed

7 files changed

+318
-1
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,6 @@ cython_debug/
170170

171171
# VS Code dev container
172172
.devcontainer/
173+
174+
# E2E report
175+
e2e-report.xml

e2e_config.test.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
{
2-
"catalog.product.id": "PRD-7255-3950"
2+
"catalog.product.id": "PRD-7255-3950",
3+
"accounts.seller.id": "SEL-7310-3075"
34
}

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ per-file-ignores =
4747
tests/unit/resources/*/test_mixins.py: WPS118 WPS202 WPS204 WPS235
4848
tests/unit/resources/accounts/test_users.py: WPS204 WPS202 WPS210
4949
tests/unit/test_mpt_client.py: WPS235
50+
tests/e2e/accounts/conftest.py: WPS430
5051

5152
tests/*:
5253
# Allow magic strings.

tests/e2e/accounts/conftest.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import datetime as dt
2+
import pathlib
3+
4+
import pytest
5+
6+
7+
@pytest.fixture(scope="session")
8+
def timestamp():
9+
return int(dt.datetime.now(tz=dt.UTC).strftime("%Y%m%d%H%M%S"))
10+
11+
12+
@pytest.fixture
13+
def account_data():
14+
return {
15+
"name": "Test Api Client Vendor",
16+
"address": {
17+
"addressLine1": "123 Test St",
18+
"city": "San Francisco",
19+
"state": "CA",
20+
"postCode": "12345",
21+
"country": "US",
22+
},
23+
"type": "Vendor",
24+
"status": "Active",
25+
}
26+
27+
28+
@pytest.fixture
29+
def account_icon():
30+
return pathlib.Path(__file__).parent / "logo.png"
31+
32+
33+
@pytest.fixture
34+
def currencies():
35+
return ["USD", "EUR"]
36+
37+
38+
@pytest.fixture
39+
def seller(currencies):
40+
def _seller(
41+
external_id: str, # Must be unique in Marketplace
42+
name="E2E Test Seller",
43+
currencies=currencies,
44+
):
45+
return {
46+
"name": name,
47+
"address": {
48+
"addressLine1": "123 Main St",
49+
"city": "Anytown",
50+
"state": "CA",
51+
"postCode": "12345",
52+
"country": "US",
53+
},
54+
"currencies": currencies,
55+
"externalId": external_id,
56+
}
57+
58+
return _seller
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
7+
# TODO: Handle create and teardown more gracefully with fixture that doesn't cause teardown issues
8+
@pytest.mark.flaky
9+
async def test_get_seller_by_id(async_mpt_ops, seller_id):
10+
seller = await async_mpt_ops.accounts.sellers.get(seller_id)
11+
assert seller is not None
12+
13+
14+
@pytest.mark.flaky
15+
async def test_list_sellers(async_mpt_ops):
16+
sellers = await async_mpt_ops.accounts.sellers.fetch_page(limit=10)
17+
assert len(sellers) > 0
18+
19+
20+
@pytest.mark.flaky
21+
async def test_get_seller_by_id_not_found(async_mpt_ops, invalid_seller_id):
22+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
23+
await async_mpt_ops.accounts.sellers.get(invalid_seller_id)
24+
25+
26+
@pytest.mark.flaky
27+
async def test_filter_sellers(async_mpt_ops, seller_id):
28+
async_filtered_sellers = (
29+
async_mpt_ops.accounts.sellers.filter(RQLQuery(id=seller_id))
30+
.filter(RQLQuery(name="E2E Seeded Seller"))
31+
.select()
32+
)
33+
sellers = [filtered_seller async for filtered_seller in async_filtered_sellers.iterate()]
34+
assert len(sellers) == 1
35+
36+
37+
@pytest.mark.flaky
38+
async def test_create_seller(async_mpt_ops, seller, timestamp):
39+
seller_data = seller(external_id=f"Async Create E2E Seller - {timestamp}")
40+
created_seller = await async_mpt_ops.accounts.sellers.create(seller_data)
41+
assert created_seller is not None
42+
43+
44+
@pytest.mark.flaky
45+
async def test_delete_seller(async_mpt_ops, seller, timestamp):
46+
seller_data = seller(external_id=f"Async Delete E2E Seller - {timestamp}")
47+
created_seller = await async_mpt_ops.accounts.sellers.create(seller_data)
48+
await async_mpt_ops.accounts.sellers.delete(created_seller.id)
49+
50+
51+
@pytest.mark.flaky
52+
async def test_delete_seller_not_found(async_mpt_ops, invalid_seller_id):
53+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
54+
await async_mpt_ops.accounts.sellers.delete(invalid_seller_id)
55+
56+
57+
@pytest.mark.flaky
58+
async def test_update_seller(async_mpt_ops, seller, timestamp):
59+
seller_data = seller(external_id=f"Async Update E2E Seller - {timestamp}")
60+
update_data = seller(
61+
external_id=f"Async Update E2E Seller - {timestamp}",
62+
name=f"Updated Update E2E Seller - {timestamp}",
63+
)
64+
created_seller = await async_mpt_ops.accounts.sellers.create(seller_data)
65+
updated_seller = await async_mpt_ops.accounts.sellers.update(created_seller.id, update_data)
66+
assert updated_seller is not None
67+
68+
69+
@pytest.mark.flaky
70+
async def test_update_seller_mpt_error(async_mpt_ops, seller, timestamp, invalid_seller_id):
71+
update_data = seller(
72+
external_id=f"Async Update E2E Seller Not Found - {timestamp}",
73+
name=f"Updated Update E2E Seller Not Found - {timestamp}",
74+
)
75+
with pytest.raises(MPTAPIError):
76+
await async_mpt_ops.accounts.sellers.update(invalid_seller_id, update_data)
77+
78+
79+
@pytest.mark.flaky
80+
async def test_activate_seller(async_mpt_ops, seller, timestamp):
81+
seller_data = seller(external_id=f"Async Activate E2E Seller - {timestamp}")
82+
created_seller = await async_mpt_ops.accounts.sellers.create(seller_data)
83+
await async_mpt_ops.accounts.sellers.deactivate(created_seller.id)
84+
activated_seller = await async_mpt_ops.accounts.sellers.activate(created_seller.id)
85+
86+
assert activated_seller is not None
87+
88+
89+
@pytest.mark.flaky
90+
async def test_activate_seller_mpt_error(async_mpt_ops, invalid_seller_id):
91+
with pytest.raises(MPTAPIError):
92+
await async_mpt_ops.accounts.sellers.activate(invalid_seller_id)
93+
94+
95+
@pytest.mark.flaky
96+
async def test_deactivate_seller(async_mpt_ops, seller, timestamp):
97+
seller_data = seller(external_id=f"Async Deactivate E2E Seller - {timestamp}")
98+
created_seller = await async_mpt_ops.accounts.sellers.create(seller_data)
99+
deactivated_seller = await async_mpt_ops.accounts.sellers.deactivate(created_seller.id)
100+
101+
assert deactivated_seller is not None
102+
103+
104+
@pytest.mark.flaky
105+
async def test_deactivate_seller_mpt_error(async_mpt_ops, invalid_seller_id):
106+
with pytest.raises(MPTAPIError):
107+
await async_mpt_ops.accounts.sellers.deactivate(invalid_seller_id)
108+
109+
110+
@pytest.mark.flaky
111+
async def test_disable_seller(async_mpt_ops, seller, timestamp):
112+
seller_data = seller(external_id=f"Async Disable E2E Seller - {timestamp}")
113+
created_seller = await async_mpt_ops.accounts.sellers.create(seller_data)
114+
disabled_seller = await async_mpt_ops.accounts.sellers.disable(created_seller.id)
115+
116+
assert disabled_seller is not None
117+
118+
119+
@pytest.mark.flaky
120+
async def test_disable_seller_mpt_error(async_mpt_ops, invalid_seller_id):
121+
with pytest.raises(MPTAPIError):
122+
await async_mpt_ops.accounts.sellers.disable(invalid_seller_id)
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
7+
# TODO: Handle create and teardown more gracefully with fixture that doesn't cause teardown issues
8+
@pytest.mark.flaky
9+
def test_get_seller_by_id(mpt_ops, seller_id):
10+
seller = mpt_ops.accounts.sellers.get(seller_id)
11+
assert seller is not None
12+
13+
14+
@pytest.mark.flaky
15+
def test_list_sellers(mpt_ops):
16+
sellers = mpt_ops.accounts.sellers.fetch_page(limit=10)
17+
assert len(sellers) > 0
18+
19+
20+
@pytest.mark.flaky
21+
def test_get_seller_by_id_not_found(mpt_ops, invalid_seller_id):
22+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
23+
mpt_ops.accounts.sellers.get(invalid_seller_id)
24+
25+
26+
@pytest.mark.flaky
27+
def test_filter_sellers(mpt_ops, seller_id):
28+
filtered_sellers = (
29+
mpt_ops.accounts.sellers.filter(RQLQuery(id=seller_id))
30+
.filter(RQLQuery(name="E2E Seeded Seller"))
31+
.select()
32+
)
33+
sellers = list(filtered_sellers.iterate())
34+
assert len(sellers) == 1
35+
36+
37+
@pytest.mark.flaky
38+
def test_create_seller(mpt_ops, seller, timestamp):
39+
seller_data = seller(external_id=f"Create E2E Seller - {timestamp}")
40+
created_seller = mpt_ops.accounts.sellers.create(seller_data)
41+
assert created_seller is not None
42+
43+
44+
@pytest.mark.flaky
45+
def test_delete_seller(mpt_ops, seller, timestamp):
46+
seller_data = seller(external_id=f"Delete E2E Seller - {timestamp}")
47+
created_seller = mpt_ops.accounts.sellers.create(seller_data)
48+
mpt_ops.accounts.sellers.delete(created_seller.id)
49+
50+
51+
@pytest.mark.flaky
52+
def test_delete_seller_not_found(mpt_ops, invalid_seller_id):
53+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
54+
mpt_ops.accounts.sellers.delete(invalid_seller_id)
55+
56+
57+
@pytest.mark.flaky
58+
def test_update_seller(mpt_ops, seller, timestamp):
59+
seller_data = seller(external_id=f"Update E2E Seller - {timestamp}")
60+
update_data = seller(
61+
external_id=f"Update E2E Seller - {timestamp}",
62+
name=f"Updated Update E2E Seller - {timestamp}",
63+
)
64+
created_seller = mpt_ops.accounts.sellers.create(seller_data)
65+
updated_seller = mpt_ops.accounts.sellers.update(created_seller.id, update_data)
66+
assert updated_seller is not None
67+
68+
69+
@pytest.mark.flaky
70+
def test_update_seller_mpt_error(mpt_ops, seller, timestamp, invalid_seller_id):
71+
update_data = seller(
72+
external_id=f"Async Update E2E Seller Not Found - {timestamp}",
73+
name=f"Updated Update E2E Seller Not Found - {timestamp}",
74+
)
75+
with pytest.raises(MPTAPIError):
76+
mpt_ops.accounts.sellers.update(invalid_seller_id, update_data)
77+
78+
79+
@pytest.mark.flaky
80+
def test_activate_seller(mpt_ops, seller, timestamp):
81+
seller_data = seller(external_id=f"Activate E2E Seller - {timestamp}")
82+
created_seller = mpt_ops.accounts.sellers.create(seller_data)
83+
mpt_ops.accounts.sellers.deactivate(created_seller.id)
84+
activated_seller = mpt_ops.accounts.sellers.activate(created_seller.id)
85+
86+
assert activated_seller is not None
87+
88+
89+
@pytest.mark.flaky
90+
def test_activate_seller_mpt_error(mpt_ops, invalid_seller_id):
91+
with pytest.raises(MPTAPIError):
92+
mpt_ops.accounts.sellers.activate(invalid_seller_id)
93+
94+
95+
@pytest.mark.flaky
96+
def test_deactivate_seller(mpt_ops, seller, timestamp):
97+
seller_data = seller(external_id=f"Deactivate E2E Seller - {timestamp}")
98+
created_seller = mpt_ops.accounts.sellers.create(seller_data)
99+
deactivated_seller = mpt_ops.accounts.sellers.deactivate(created_seller.id)
100+
101+
assert deactivated_seller is not None
102+
103+
104+
@pytest.mark.flaky
105+
def test_deactivate_seller_mpt_error(mpt_ops, invalid_seller_id):
106+
with pytest.raises(MPTAPIError):
107+
mpt_ops.accounts.sellers.deactivate(invalid_seller_id)
108+
109+
110+
@pytest.mark.flaky
111+
def test_disable_seller(mpt_ops, seller, timestamp):
112+
seller_data = seller(external_id=f"Disable E2E Seller - {timestamp}")
113+
created_seller = mpt_ops.accounts.sellers.create(seller_data)
114+
disabled_seller = mpt_ops.accounts.sellers.disable(created_seller.id)
115+
116+
assert disabled_seller is not None
117+
118+
119+
@pytest.mark.flaky
120+
def test_disable_seller_mpt_error(mpt_ops, invalid_seller_id):
121+
with pytest.raises(MPTAPIError):
122+
mpt_ops.accounts.sellers.disable(invalid_seller_id)

tests/e2e/conftest.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,13 @@ def e2e_config(project_root_path):
7878
@pytest.fixture
7979
def product_id(e2e_config):
8080
return e2e_config["catalog.product.id"]
81+
82+
83+
@pytest.fixture
84+
def invalid_seller_id():
85+
return "SEL-0000-0000"
86+
87+
88+
@pytest.fixture
89+
def seller_id(e2e_config):
90+
return e2e_config["accounts.seller.id"]

0 commit comments

Comments
 (0)