Skip to content

Commit dac4e85

Browse files
committed
feat(tests): add e2e test suite for notification subscribers handling
1 parent 9976f92 commit dac4e85

8 files changed

Lines changed: 221 additions & 65 deletions

File tree

e2e_config.test.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@
2020
"catalog.product.template.id": "TPL-7255-3950-0001",
2121
"catalog.product.terms.id": "TCS-7255-3950-0001",
2222
"catalog.product.terms.variant.id": "TCV-7255-3950-0001-0001",
23-
"catalog.unit.id": "UNT-1229"
23+
"catalog.unit.id": "UNT-1229",
24+
"notifications.subscriber.id": "NTS-0829-7123-7123"
2425
}

tests/e2e/accounts/accounts_users/conftest.py

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,3 @@
44
@pytest.fixture
55
def invalid_user_id():
66
return "USR-0000-0000"
7-
8-
9-
@pytest.fixture
10-
def account_user_factory(account_id, user_group_id, uuid_str):
11-
def _account_user( # noqa: WPS430
12-
email: str | None = None, # Must be unique in Marketplace
13-
first_name: str = "E2E Created",
14-
last_name: str = "Account User",
15-
):
16-
if not email:
17-
email = f"e2e_{uuid_str}@dummy.com"
18-
19-
return {
20-
"user": {
21-
"firstName": first_name,
22-
"lastName": last_name,
23-
"email": email,
24-
},
25-
"account": {
26-
"id": account_id,
27-
},
28-
"groups": [
29-
{"id": user_group_id},
30-
],
31-
"invitation": {
32-
"status": "Invited",
33-
},
34-
}
35-
36-
return _account_user

tests/e2e/accounts/conftest.py

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,6 @@ def currencies():
1818
return ["USD", "EUR"]
1919

2020

21-
@pytest.fixture
22-
def account_id(e2e_config):
23-
return e2e_config["accounts.account.id"]
24-
25-
2621
@pytest.fixture
2722
def seller_id(e2e_config):
2823
return e2e_config["accounts.seller.id"]
@@ -31,32 +26,3 @@ def seller_id(e2e_config):
3126
@pytest.fixture
3227
def buyer_id(e2e_config):
3328
return e2e_config["accounts.buyer.id"]
34-
35-
36-
@pytest.fixture
37-
def user_group_id(e2e_config):
38-
return e2e_config["accounts.user_group.id"]
39-
40-
41-
@pytest.fixture
42-
def module_id(e2e_config):
43-
return e2e_config["accounts.module.id"]
44-
45-
46-
@pytest.fixture
47-
def user_group_factory(account_id, module_id):
48-
# Used in user group and licensee fixtures
49-
def _user_group(
50-
name: str = "E2E Test Api Client User Group",
51-
user_group_account_id: str = account_id,
52-
):
53-
return {
54-
"name": name,
55-
"account": {"id": user_group_account_id},
56-
"buyers": None,
57-
"logo": "",
58-
"description": "User group for E2E tests",
59-
"modules": [{"id": module_id}],
60-
}
61-
62-
return _user_group

tests/e2e/conftest.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,67 @@ def logo_fd():
116116
@pytest.fixture
117117
def user_id(e2e_config):
118118
return e2e_config["accounts.user.id"]
119+
120+
121+
@pytest.fixture
122+
def user_group_id(e2e_config):
123+
return e2e_config["accounts.user_group.id"]
124+
125+
126+
@pytest.fixture
127+
def account_id(e2e_config):
128+
return e2e_config["accounts.account.id"]
129+
130+
131+
@pytest.fixture
132+
def user_group_factory(account_id, module_id):
133+
# Used in user group and licensee fixtures
134+
def _user_group(
135+
name: str = "E2E Test Api Client User Group",
136+
user_group_account_id: str = account_id,
137+
):
138+
return {
139+
"name": name,
140+
"account": {"id": user_group_account_id},
141+
"buyers": None,
142+
"logo": "",
143+
"description": "User group for E2E tests",
144+
"modules": [{"id": module_id}],
145+
}
146+
147+
return _user_group
148+
149+
150+
@pytest.fixture
151+
def module_id(e2e_config):
152+
return e2e_config["accounts.module.id"]
153+
154+
155+
@pytest.fixture
156+
def account_user_factory(account_id, user_group_id, uuid_str):
157+
def _account_user( # noqa: WPS430
158+
email: str | None = None, # Must be unique in Marketplace
159+
first_name: str = "E2E Created",
160+
last_name: str = "Account User",
161+
):
162+
if not email:
163+
email = f"e2e_{uuid_str}@dummy.com"
164+
165+
return {
166+
"user": {
167+
"firstName": first_name,
168+
"lastName": last_name,
169+
"email": email,
170+
},
171+
"account": {
172+
"id": account_id,
173+
},
174+
"groups": [
175+
{"id": user_group_id},
176+
],
177+
"invitation": {
178+
"status": "Invited",
179+
},
180+
}
181+
182+
return _account_user

tests/e2e/notifications/__init__.py

Whitespace-only changes.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def subscriber_id(e2e_config):
6+
return e2e_config.get("notifications.subscriber.id", "SUB-0000-0000-0001")
7+
8+
9+
@pytest.fixture
10+
def invalid_subscriber_id():
11+
return "SUB-0000-0000-0000"
12+
13+
14+
@pytest.fixture
15+
def recipients_factory(account_user_factory, user_group_factory):
16+
def _recipients(
17+
users: list[str] | None = None,
18+
user_groups: list[str] | None = None,
19+
) -> dict[str, list[str]]:
20+
return {
21+
"users": users or account_user_factory(),
22+
"userGroups": user_groups or user_group_factory(),
23+
}
24+
25+
return _recipients
26+
27+
28+
@pytest.fixture
29+
def subscriber_factory(recipients_factory):
30+
def _subscriber(
31+
recipients: dict[str, list[str]] | None = None,
32+
note: str = "Test note",
33+
) -> dict:
34+
return {
35+
"recipients": recipients or recipients_factory(),
36+
"note": note,
37+
}
38+
39+
return _subscriber
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+
async def async_created_subscriber(async_mpt_client, subscriber_factory):
11+
new_subscriber_request_data = subscriber_factory(name="E2E Created subscriber")
12+
13+
new_subscriber = await async_mpt_client.notifications.subscribers.create(
14+
new_subscriber_request_data
15+
)
16+
17+
yield new_subscriber
18+
19+
try:
20+
await async_mpt_client.notifications.subscribers.delete(new_subscriber.id)
21+
except MPTAPIError as error:
22+
print(f"TEARDOWN - Unable to delete subscriber: {error.title}") # noqa: WPS421
23+
24+
25+
async def test_get_subscriber_by_id(async_mpt_client, subscriber_id):
26+
result = await async_mpt_client.notifications.subscribers.get(subscriber_id)
27+
28+
assert result is not None
29+
30+
31+
async def test_list_subscribers(async_mpt_client):
32+
limit = 10
33+
34+
result = await async_mpt_client.notifications.subscribers.fetch_page(limit=limit)
35+
36+
assert len(result) > 0
37+
38+
39+
async def test_get_subscriber_by_id_not_found(async_mpt_client, invalid_subscriber_id):
40+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
41+
await async_mpt_client.notifications.subscribers.get(invalid_subscriber_id)
42+
43+
44+
async def test_filter_subscribers(async_mpt_client, subscriber_id):
45+
select_fields = ["-config"]
46+
async_filtered_subscribers = (
47+
async_mpt_client.notifications.subscribers.filter(RQLQuery(id=subscriber_id))
48+
.filter(RQLQuery(status="enabled"))
49+
.select(*select_fields)
50+
)
51+
52+
result = [
53+
filtered_subscriber async for filtered_subscriber in async_filtered_subscribers.iterate()
54+
]
55+
56+
assert len(result) >= 0
57+
58+
59+
async def test_update_subscriber_not_found(
60+
async_mpt_client, subscriber_factory, invalid_subscriber_id
61+
):
62+
updated_subscriber_data = subscriber_factory(name="Nonexistent Subscriber")
63+
64+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
65+
await async_mpt_client.notifications.subscribers.update(
66+
invalid_subscriber_id, updated_subscriber_data
67+
)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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+
def test_get_subscriber_by_id(mpt_client, subscriber_id):
10+
result = mpt_client.notifications.subscribers.get(subscriber_id)
11+
12+
assert result is not None
13+
14+
15+
def test_list_subscribers(mpt_client):
16+
limit = 10
17+
18+
result = mpt_client.notifications.subscribers.fetch_page(limit=limit)
19+
20+
assert len(result) > 0
21+
22+
23+
def test_get_subscriber_by_id_not_found(mpt_client, invalid_subscriber_id):
24+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
25+
mpt_client.notifications.subscribers.get(invalid_subscriber_id)
26+
27+
28+
def test_filter_subscribers(mpt_client, subscriber_id):
29+
select_fields = ["-config"]
30+
filtered_subscribers = (
31+
mpt_client.notifications.subscribers.filter(RQLQuery(id=subscriber_id))
32+
.filter(RQLQuery(status="enabled"))
33+
.select(*select_fields)
34+
)
35+
36+
result = list(filtered_subscribers.iterate())
37+
38+
assert len(result) >= 0
39+
40+
41+
def test_update_subscriber_not_found(
42+
mpt_client, subscriber_factory, invalid_subscriber_id, user_group_id, recipients_factory
43+
):
44+
updated_subscriber_data = subscriber_factory(
45+
recipients=recipients_factory(user_groups=[{"id": user_group_id}])
46+
)
47+
48+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
49+
mpt_client.notifications.subscribers.update(invalid_subscriber_id, updated_subscriber_data)

0 commit comments

Comments
 (0)