Skip to content

Commit cd204c4

Browse files
authored
[MPT-14915] Added e2e tests for billing ledger, charges, and ledger attachments (#186)
Added e2e tests for billing ledger, charges, and ledger attachments <!-- This is an auto-generated comment: release notes by coderabbit.ai --> Closes [MPT-14915](https://softwareone.atlassian.net/browse/MPT-14915) - Add three e2e config keys: billing.ledger.id, billing.ledger.charge.id, billing.ledger.attachment.id - Add ledger fixtures (valid + invalid) in tests/e2e/billing/ledger/conftest.py - Add charge fixtures (valid + invalid) in tests/e2e/billing/ledger/charge/conftest.py - Add attachment fixtures and a ledger_attachment_factory in tests/e2e/billing/ledger/attachment/conftest.py - Add comprehensive e2e tests for billing ledgers (sync + async): get by id, list, filter (RQL), 404 handling - Add comprehensive e2e tests for ledger charges (sync + async): get by id, list, filter (RQL), 404 handling - Add comprehensive e2e tests for ledger attachments (sync + async): CRUD, download, filtering, 404 handling - Move commerce_product_id fixture from tests/e2e/commerce/conftest.py to tests/e2e/conftest.py for broader accessibility - Mark new e2e test modules as flaky to accommodate timing-related instability <!-- end of auto-generated comment: release notes by coderabbit.ai --> [MPT-14915]: https://softwareone.atlassian.net/browse/MPT-14915?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
2 parents 541ea30 + c16658a commit cd204c4

File tree

12 files changed

+403
-5
lines changed

12 files changed

+403
-5
lines changed

e2e_config.test.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
"billing.custom_ledger.id": "CLE-2665-3524",
1818
"billing.journal.attachment.id": "JOA-6425-9776",
1919
"billing.journal.id": "BJO-6562-0928",
20+
"billing.ledger.attachment.id": "LEA-4971-4321",
21+
"billing.ledger.charge.id": "CHG-2589-1434-0000-0000-0200",
22+
"billing.ledger.id": "BLE-2589-1434-7310-3075",
2023
"catalog.authorization.id": "AUT-9288-6146",
2124
"catalog.listing.id": "LST-5489-0806",
2225
"catalog.price_list.id": "PRC-7255-3950-0245",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def invalid_ledger_attachment_id():
6+
return "LEA-0000-0000"
7+
8+
9+
@pytest.fixture
10+
def ledger_attachment_id(e2e_config):
11+
return e2e_config["billing.ledger.attachment.id"]
12+
13+
14+
@pytest.fixture
15+
def ledger_attachment_factory():
16+
def factory(
17+
name: str = "E2E Created Ledger Attachment",
18+
):
19+
return {
20+
"name": name,
21+
"description": name,
22+
}
23+
24+
return factory
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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_ledger_attachment(async_mpt_ops, ledger_attachment_factory, ledger_id, pdf_fd):
11+
new_ledger_attachment_request_data = ledger_attachment_factory(
12+
name="E2E Seeded Ledger Attachment",
13+
)
14+
ledger_attachments = async_mpt_ops.billing.ledgers.attachments(ledger_id)
15+
created_ledger_attachment = await ledger_attachments.create(
16+
new_ledger_attachment_request_data, file=pdf_fd
17+
)
18+
19+
yield created_ledger_attachment
20+
21+
try:
22+
await ledger_attachments.delete(created_ledger_attachment.id)
23+
except MPTAPIError as error:
24+
print(f"TEARDOWN - Unable to delete ledger attachment: {error.title}")
25+
26+
27+
@pytest.fixture
28+
def ledger_attachments(async_mpt_ops, ledger_id):
29+
return async_mpt_ops.billing.ledgers.attachments(ledger_id)
30+
31+
32+
async def test_get_ledger_attachment_by_id(ledger_attachments, ledger_attachment_id):
33+
result = await ledger_attachments.get(ledger_attachment_id)
34+
35+
assert result is not None
36+
37+
38+
async def test_get_ledger_attachment_by_id_not_found(
39+
ledger_attachments, invalid_ledger_attachment_id
40+
):
41+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
42+
await ledger_attachments.get(invalid_ledger_attachment_id)
43+
44+
45+
async def test_list_ledger_attachments(ledger_attachments):
46+
limit = 10
47+
48+
result = await ledger_attachments.fetch_page(limit=limit)
49+
50+
assert len(result) > 0
51+
52+
53+
async def test_filter_ledger_attachments(ledger_attachments, ledger_attachment_id):
54+
select_fields = ["-description"]
55+
filtered_attachments = (
56+
ledger_attachments.filter(RQLQuery(id=ledger_attachment_id))
57+
.filter(RQLQuery(name="E2E Seeded Ledger Attachment"))
58+
.select(*select_fields)
59+
)
60+
61+
result = [attachment async for attachment in filtered_attachments.iterate()]
62+
63+
assert len(result) > 0
64+
65+
66+
def test_create_billing_ledger_attachment(created_ledger_attachment):
67+
result = created_ledger_attachment
68+
69+
assert result is not None
70+
71+
72+
async def test_update_billing_ledger_attachment(
73+
ledger_attachments, created_ledger_attachment, ledger_attachment_factory
74+
):
75+
updated_data = ledger_attachment_factory(
76+
name="E2E Updated Ledger Attachment",
77+
)
78+
79+
result = await ledger_attachments.update(created_ledger_attachment.id, updated_data)
80+
81+
assert result is not None
82+
83+
84+
async def test_delete_billing_ledger_attachment(ledger_attachments, created_ledger_attachment):
85+
result = created_ledger_attachment
86+
87+
await ledger_attachments.delete(result.id)
88+
89+
90+
async def test_download_billing_ledger_attachment(ledger_attachments, ledger_attachment_id):
91+
result = await ledger_attachments.download(ledger_attachment_id)
92+
93+
assert result.file_contents is not None
94+
assert result.filename is not None
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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_ledger_attachment(mpt_ops, ledger_attachment_factory, ledger_id, pdf_fd):
11+
new_ledger_attachment_request_data = ledger_attachment_factory(
12+
name="E2E Created Ledger Attachment",
13+
)
14+
ledger_attachments = mpt_ops.billing.ledgers.attachments(ledger_id)
15+
16+
created_ledger_attachment = ledger_attachments.create(
17+
new_ledger_attachment_request_data, file=pdf_fd
18+
)
19+
20+
yield created_ledger_attachment
21+
22+
try:
23+
ledger_attachments.delete(created_ledger_attachment.id)
24+
except MPTAPIError as error:
25+
print(f"TEARDOWN - Unable to delete ledger attachment: {error.title}")
26+
27+
28+
@pytest.fixture
29+
def ledger_attachments(mpt_ops, ledger_id):
30+
return mpt_ops.billing.ledgers.attachments(ledger_id)
31+
32+
33+
def test_get_ledger_attachment_by_id(ledger_attachments, ledger_attachment_id):
34+
result = ledger_attachments.get(ledger_attachment_id)
35+
36+
assert result is not None
37+
38+
39+
def test_get_ledger_attachment_by_id_not_found(ledger_attachments, invalid_ledger_attachment_id):
40+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
41+
ledger_attachments.get(invalid_ledger_attachment_id)
42+
43+
44+
def test_list_ledger_attachments(ledger_attachments):
45+
limit = 10
46+
47+
result = ledger_attachments.fetch_page(limit=limit)
48+
49+
assert len(result) > 0
50+
51+
52+
def test_filter_ledger_attachments(ledger_attachments, ledger_attachment_id):
53+
select_fields = ["-description"]
54+
filtered_attachments = (
55+
ledger_attachments.filter(RQLQuery(id=ledger_attachment_id))
56+
.filter(RQLQuery(name="E2E Seeded Ledger Attachment"))
57+
.select(*select_fields)
58+
)
59+
60+
result = list(filtered_attachments.iterate())
61+
62+
assert len(result) > 0
63+
64+
65+
def test_create_billing_ledger_attachment(created_ledger_attachment):
66+
result = created_ledger_attachment
67+
68+
assert result is not None
69+
70+
71+
def test_update_billing_ledger_attachment(
72+
ledger_attachments, created_ledger_attachment, ledger_attachment_factory
73+
):
74+
updated_data = ledger_attachment_factory(
75+
name="E2E Updated Ledger Attachment",
76+
)
77+
78+
result = ledger_attachments.update(created_ledger_attachment.id, updated_data)
79+
80+
assert result is not None
81+
82+
83+
def test_delete_billing_ledger_attachment(ledger_attachments, created_ledger_attachment):
84+
result = created_ledger_attachment
85+
86+
ledger_attachments.delete(result.id)
87+
88+
89+
def test_download_billing_ledger_attachment(ledger_attachments, ledger_attachment_id):
90+
result = ledger_attachments.download(ledger_attachment_id)
91+
92+
assert result.file_contents is not None
93+
assert result.filename is not None
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 ledger_charge_id(e2e_config):
6+
return e2e_config["billing.ledger.charge.id"]
7+
8+
9+
@pytest.fixture
10+
def invalid_ledger_charge_id():
11+
return "CHG-0000-0000-0000-0000-0000"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 ledger_charges(async_mpt_ops, ledger_id):
11+
return async_mpt_ops.billing.ledgers.charges(ledger_id)
12+
13+
14+
async def test_get_ledger_charge_by_id(ledger_charges, ledger_charge_id):
15+
result = await ledger_charges.get(ledger_charge_id)
16+
17+
assert result is not None
18+
19+
20+
async def test_get_ledger_charge_by_id_not_found(ledger_charges, invalid_ledger_charge_id):
21+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
22+
await ledger_charges.get(invalid_ledger_charge_id)
23+
24+
25+
async def test_list_ledger_charges(ledger_charges):
26+
limit = 10
27+
28+
result = await ledger_charges.fetch_page(limit=limit)
29+
30+
assert len(result) > 0
31+
32+
33+
async def test_filter_ledger_charges(ledger_charges, ledger_charge_id):
34+
select_fields = ["-journal"]
35+
filtered_charges = (
36+
ledger_charges.filter(RQLQuery(id=ledger_charge_id))
37+
.filter(RQLQuery(externalIds__invoice="INV12345"))
38+
.select(*select_fields)
39+
)
40+
41+
result = [charges async for charges in filtered_charges.iterate()]
42+
43+
assert len(result) > 0
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 ledger_charges(mpt_ops, ledger_id):
11+
return mpt_ops.billing.ledgers.charges(ledger_id)
12+
13+
14+
def test_get_ledger_charge_by_id(ledger_charges, ledger_charge_id):
15+
result = ledger_charges.get(ledger_charge_id)
16+
17+
assert result is not None
18+
19+
20+
def test_get_ledger_charge_by_id_not_found(ledger_charges, invalid_ledger_charge_id):
21+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
22+
ledger_charges.get(invalid_ledger_charge_id)
23+
24+
25+
def test_list_ledger_charges(ledger_charges):
26+
limit = 10
27+
28+
result = ledger_charges.fetch_page(limit=limit)
29+
30+
assert len(result) > 0
31+
32+
33+
def test_filter_ledger_charges(ledger_charges, ledger_charge_id):
34+
select_fields = ["-journal"]
35+
filtered_charges = (
36+
ledger_charges.filter(RQLQuery(id=ledger_charge_id))
37+
.filter(RQLQuery(externalIds__invoice="INV12345"))
38+
.select(*select_fields)
39+
)
40+
41+
result = list(filtered_charges.iterate())
42+
43+
assert len(result) > 0
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 ledger_id(e2e_config):
6+
return e2e_config["billing.ledger.id"]
7+
8+
9+
@pytest.fixture
10+
def invalid_ledger_id():
11+
return "BLE-0000-0000-0000-0000"
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
async def test_get_billing_ledger_by_id(async_mpt_ops, ledger_id):
10+
result = await async_mpt_ops.billing.ledgers.get(ledger_id)
11+
12+
assert result is not None
13+
14+
15+
async def test_list_billing_ledgers(async_mpt_ops):
16+
limit = 10
17+
18+
result = await async_mpt_ops.billing.ledgers.fetch_page(limit=limit)
19+
20+
assert len(result) > 0
21+
22+
23+
async def test_get_billing_ledger_by_id_not_found(async_mpt_ops, invalid_ledger_id):
24+
with pytest.raises(MPTAPIError, match=r"404 Not Found"):
25+
await async_mpt_ops.billing.ledgers.get(invalid_ledger_id)
26+
27+
28+
async def test_filter_billing_ledgers(async_mpt_ops, ledger_id, commerce_product_id):
29+
select_fields = ["-authorization"]
30+
filtered_ledgers = (
31+
async_mpt_ops.billing.ledgers.filter(RQLQuery(id=ledger_id))
32+
.filter(RQLQuery(f"product.id={commerce_product_id}"))
33+
.select(*select_fields)
34+
)
35+
36+
result = [ledger async for ledger in filtered_ledgers.iterate()]
37+
38+
assert len(result) > 0

0 commit comments

Comments
 (0)