From 4d70046c4b07c0191c310e000456105710c5bca4 Mon Sep 17 00:00:00 2001 From: Robert Segal Date: Tue, 30 Dec 2025 18:19:46 -0700 Subject: [PATCH] added e2e tests for journal charges --- e2e_config.test.json | 5 +- tests/data/test_billing_journal.jsonl | 2 +- tests/data/test_billing_journal.xlsx | Bin 9400 -> 9406 bytes tests/e2e/billing/journal/charge/conftest.py | 11 +++++ .../charge/test_async_journal_charge.py | 43 ++++++++++++++++++ .../charge/test_sync_journal_charge.py | 43 ++++++++++++++++++ 6 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 tests/e2e/billing/journal/charge/conftest.py create mode 100644 tests/e2e/billing/journal/charge/test_async_journal_charge.py create mode 100644 tests/e2e/billing/journal/charge/test_sync_journal_charge.py diff --git a/e2e_config.test.json b/e2e_config.test.json index 4cfb67b0..6c7cb797 100644 --- a/e2e_config.test.json +++ b/e2e_config.test.json @@ -15,8 +15,9 @@ "billing.custom_ledger.attachment.id": "CLA-1777-7485", "billing.custom_ledger.charge.id": "CHG-2665-3524-0000-0000-0020", "billing.custom_ledger.id": "CLE-2665-3524", - "billing.journal.attachment.id": "JOA-6425-9776", - "billing.journal.id": "BJO-6562-0928", + "billing.journal.attachment.id": "JOA-2849-3620", + "billing.journal.charge.id": "CHG-2589-1434-0000-0000-0200", + "billing.journal.id": "BJO-2589-1434", "billing.ledger.attachment.id": "LEA-4971-4321", "billing.ledger.charge.id": "CHG-2589-1434-0000-0000-0200", "billing.ledger.id": "BLE-2589-1434-7310-3075", diff --git a/tests/data/test_billing_journal.jsonl b/tests/data/test_billing_journal.jsonl index a4906804..02103936 100644 --- a/tests/data/test_billing_journal.jsonl +++ b/tests/data/test_billing_journal.jsonl @@ -1 +1 @@ -{"externalIds": {"vendor": "ext-seeded-billing-sub-vendor-id", "invoice": "INV12345", "reference": "ORD-7924-7691-0805"}, "search": {"source": {"type": "Subscription", "criteria": "id", "value": "SUB-5839-4140-9574"},"order":{"criteria":"order.id","value":"ORD-7924-7691-0805"}, "item": {"criteria": "item.id", "value": "ITM-1767-7355-0001"}}, "period": {"start": "2025-12-22", "end": "2026-12-21"}, "price": {"unitPP": 10, "PPx1": 8.33}, "quantity": 10, "segment": "COM", "description": {"value1": "desc-1", "value2": "desc-2"}} +{"externalIds": {"vendor": "ext-seeded-billing-sub-vendor-id", "invoice": "INV12345", "reference": "ORD-2413-8980-9419"}, "search": {"source": {"type": "Subscription", "criteria": "id", "value": "SUB-0356-5642-8669"},"order":{"criteria":"order.id","value":"ORD-2413-8980-9419"}, "item": {"criteria": "item.id", "value": "ITM-1767-7355-0001"}}, "period": {"start": "2025-12-22", "end": "2026-12-21"}, "price": {"unitPP": 10, "PPx1": 8.33}, "quantity": 10, "segment": "COM", "description": {"value1": "desc-1", "value2": "desc-2"}} diff --git a/tests/data/test_billing_journal.xlsx b/tests/data/test_billing_journal.xlsx index 81203ebdbd1d3d587b7c440302c27d28fbce76a1..81e4affd1a44ae1fcad151b12ad0cbbb0af50113 100644 GIT binary patch delta 2669 zcmV-z3X=7>Nxn(2$_5Gk+AY_Q0{{TxlhXzye`=ez0BX7-0d$qxRh4GjyHAw^PO%D@ zGp0#Z?SJ1f32D1IopRl)QX6}Q$Ir|>W6r;9>&kd$vg4wen&b?d25WLr@aA!9ep_Z% zU>cpGO+hQsu&MdNI`hlL@4uaIgnU{F@nir%(@o7%sWw8W%S%?%?o70-0n1v*nkrbz ze@E1{lF_0o8B=wIY>a(WQ{I?6gh-x(A=Yc2vqa>5%^I}>k*uN$=yxS=yAiF^wVS?G{3Bvxw2iIpU-X9c0>e_Np)+i{v^bH|ClLom{hazT4l?&YANr=|Ur@-;}!4!EIt1;jJEGOV14o3aklB+grk?n_MSI|*bEW9jL*Ie@ofgfJug%_ zHJ!i(E$#RIVEnNJwl)p}-6GP~tfuDc%!$(gPbO9t1ipn+*RjHhZCk!eev>49X~;;QAukIu6mWbkr&SIupr^qxfc6Nr2ivNv zP7O1tj{`m8;&_5X7nnJod7^^A5Prd>e5fA>AvnHS8k0~FniWR^=pY|UoAYk5iLcoUM$Q!jfXtHWP^ z@`?)3@HV5WhxXN-JFFu;X8Ya4=6biWuhWOVix!E_`~K~JbG(JOeh)(uE#;9Xq3st0S}WQ7!{N0A`Y{Y z3MB#w8alREU;_XE(38OoA%9(O+AtJ`?v%!4T<&hw_^ z$~2JCBRG0L|N3RNH+JJ{08fz6xQy1`w`mwUQG@1gU|MK!rZQG@kAGde4qa=3m;EBG z!Z?bOP;=SP6Ct&?FicfR0V^Z68XA9sSWw)fe^<-aooQO!g45h?wrwDcZV^#PCH=97 zQldrrxNeN)g~GZIY{UgQSiEAqhi937{7OknVU07DA0RnAdA=_HF1!o5xR9>vzX`)e zp@p674)7fnf6fvcUw>HfJ8bw#SaN}N+hxtQ%uA8tk2JjguVOFCY~41pg?#)4MxcyWAwA& z-O;fzhWgU~-UU*J z_LTRr|6xhN9W0G{m8Gvy6rGe%@vZVtX8#T3y7oAl;P!O+O3UL4oWNkCl|e5fj6x

k$w3)O%+FV+SwvaYNTS86>x&rLtlYeVK8e;=US+{@`b_a(;r}_j) zY4?B>=m1Eg907Yc=LvAoU>q9L)W-a$Hn#%RPMdDh>krZ)Hz&NSX_cYRHI+zHWYTDe znY4C>uNu$cos?!FQ4=ozin@X)smg0W3cCTMv|B(rp56Uuxi-Hq?|+tQ`vJzH_FP`G>SA=f77H7{wq9)&k>qm^#2-0C-RVi)AM4(!g)Mr z^Jx?@&Ux4!eDCBD$PT4NQmCdkyx<~YpFzDCr-<~!6UXtGI*V>?X+bYpL@EYie8)?4-`Wrkpps^cSC~Y@g zY5TlpVir!>V!7aKISZG)ZQOrid>X|pif4i?;`k3o;D7k+CzBx<6$M;iVqi|Q?;Ion ze|(Z(PlGTN#otZ*4y4aQY4Oi&fF)}7tpNZ4F9ZMp6aWAK00000000000091z4kRZVTwr2gP5}S_YXSfO5dZ)H00000 b00000007;SP$WJ9Vv~;~BL*lU00000DLDxe delta 2655 zcmV-l3ZV7ANw`U{$_5FEQf48J0{{T#lhXzyf9e+qA*ksp1khD#S5=yA?>g z0^4det8-S$nosQ)-r8R-e*f)!Bh}MN$|nl|>UL@uS~np=ZC3D#wP&*7HCWbCRZPQD ze?6kMQJm#%!MUzVL^1YJ#YAoI5JGhdhFq^j#$%av6|eOUMDdbopx+jvX$Q0_I|Z&{ z>Zxm-OjZp*tVAjFOAl&WRTf@8)>5%m31M%^$l5CS`tTzd20EMsrlX@Oktx~AwLSxA zv?F~KKf#EQ4=LCl=ioFX4=MgEObrjLf0X}8R{jCYe*+`O?e(f1H?-)bkRT(%AbB!6-k>B%w%-oUV1rzE7o=cs%7t>@kPU0jQnfjPlMEHMPlzk(F!@I|@ESSE@$7W}*%!^cw+?6z(G9sKJse*a8Q!$z*wQXoW`Sw z66m9*Yu2Id4X}Dxq-2;xQ5q^HI(i~x<`#x-8o^D zNDfb)ugkv=??c8fr0e=`!o-u%z)tuBd_yH4vlLG+tmF+g{va&9!2EWZY%A)V{!OCz zF`gAskd&(=D9XuWP{dIgET_eCHoi;CyUE=@x|r7jPuN#Q3^X|{;_Nx0;bK1I=cjbP}b>lz);6tSf~lQo^^^X?4~e z91pDj00030{{R30|NoTKTW-QI6a>(%L|#CHod5wDOO%xNdk0Y(i7#5=C~bFNqf&Bb zR3Y^be4KcE8DagYs_ML`3uiBHAJJu`w2J(DarWWUP-iOo)M-%;U%&Fom({r*sm_y8 z&X(7`N*kcfAPa?=15%m=AjMe% zrg-KGFhg8RG&H#lpus1%fRuIzNP+f%bd>`jjrIuG&NdE}x%bBWr#IIIHBOr(?e_ZF zfU6VUb*~lOe zynwM%tCadPP6?<=*HRr*x-UPnB_$Sxszs|6r1T7y-e>RMCDtNwT4ht(AfE0#&sGg| z!p`&wl&d^z(+PC1=IGgz0e?~31^~O(3pihRosf!>O7{v=Iu9u6mHghr`U?0oORUTi z%pMe)Gs!oJhgsrXuq*zGV3cUd6Fh@)O~a6}d)lyg6@)BatbE3oJQ^|%plWSMu3ogP zVA?7Fbnt_DIMNroH{;x*|7t5EPv~|!O#G=JYa?CvQVh$oo)8>F+kcM+EcPE*w4AS4 z=!cxGqBtC_z|>$!0m4+xWT?K7X5;AH-{PAM<+Tn9A6iPe~ogdw4 zG{ORTH14*B)l#E7-6?-_Ht_q5MzddPH^J-O1;fCLU<7W3`3C5|;IRXRL&!-K9H(6#{MIg&C=Gzr>S+c1oc*g?fj;2g?{+gg8D+`6OAal^$s z&jHggoZ|{Cm)vsP0sUqqq9am@5!rm`vIj_kp@a&QHJAhhe|s(H%KSOdD-&l`*hAww z9pg^fQVing-kV}Hwrv}pXOf!007Sj000;O000000000000000s*_S9MFBsPm?J;|D3jSE zARBQRr{Jyu001up000yK000000000000000{F4+UCk2HkTkJ`bKqM6b+>=%$J^@^l Nl_VnuA|e0)0020W0HFW? diff --git a/tests/e2e/billing/journal/charge/conftest.py b/tests/e2e/billing/journal/charge/conftest.py new file mode 100644 index 00000000..accc1c8b --- /dev/null +++ b/tests/e2e/billing/journal/charge/conftest.py @@ -0,0 +1,11 @@ +import pytest + + +@pytest.fixture +def journal_charge_id(e2e_config): + return e2e_config["billing.journal.charge.id"] + + +@pytest.fixture +def invalid_journal_charge_id(): + return "CHG-0000-0000-0000-0000-0000" diff --git a/tests/e2e/billing/journal/charge/test_async_journal_charge.py b/tests/e2e/billing/journal/charge/test_async_journal_charge.py new file mode 100644 index 00000000..f52ac0e3 --- /dev/null +++ b/tests/e2e/billing/journal/charge/test_async_journal_charge.py @@ -0,0 +1,43 @@ +import pytest + +from mpt_api_client.exceptions import MPTAPIError +from mpt_api_client.rql.query_builder import RQLQuery + +pytestmark = [pytest.mark.flaky] + + +@pytest.fixture +def journal_charges(async_mpt_vendor, billing_journal_id): + return async_mpt_vendor.billing.journals.charges(billing_journal_id) + + +async def test_get_journal_charge_by_id(journal_charges, journal_charge_id): + result = await journal_charges.get(journal_charge_id) + + assert result is not None + + +async def test_get_journal_charge_by_id_not_found(journal_charges, invalid_journal_charge_id): + with pytest.raises(MPTAPIError, match=r"404 Not Found"): + await journal_charges.get(invalid_journal_charge_id) + + +async def test_list_journal_charges(journal_charges): + limit = 10 + + result = await journal_charges.fetch_page(limit=limit) + + assert len(result) > 0 + + +async def test_filter_journal_charges(journal_charges, journal_charge_id): + select_fields = ["-period"] + filtered_charges = ( + journal_charges.filter(RQLQuery(id=journal_charge_id)) + .filter(RQLQuery(externalIds__invoice="INV12345")) + .select(*select_fields) + ) + + result = [charges async for charges in filtered_charges.iterate()] + + assert len(result) == 1 diff --git a/tests/e2e/billing/journal/charge/test_sync_journal_charge.py b/tests/e2e/billing/journal/charge/test_sync_journal_charge.py new file mode 100644 index 00000000..f24b4223 --- /dev/null +++ b/tests/e2e/billing/journal/charge/test_sync_journal_charge.py @@ -0,0 +1,43 @@ +import pytest + +from mpt_api_client.exceptions import MPTAPIError +from mpt_api_client.rql.query_builder import RQLQuery + +pytestmark = [pytest.mark.flaky] + + +@pytest.fixture +def journal_charges(mpt_vendor, billing_journal_id): + return mpt_vendor.billing.journals.charges(billing_journal_id) + + +def test_get_journal_charge_by_id(journal_charges, journal_charge_id): + result = journal_charges.get(journal_charge_id) + + assert result is not None + + +def test_get_journal_charge_by_id_not_found(journal_charges, invalid_journal_charge_id): + with pytest.raises(MPTAPIError, match=r"404 Not Found"): + journal_charges.get(invalid_journal_charge_id) + + +def test_list_journal_charges(journal_charges): + limit = 10 + + result = journal_charges.fetch_page(limit=limit) + + assert len(result) > 0 + + +def test_filter_journal_charges(journal_charges, journal_charge_id): + select_fields = ["-period"] + filtered_charges = ( + journal_charges.filter(RQLQuery(id=journal_charge_id)) + .filter(RQLQuery(externalIds__invoice="INV12345")) + .select(*select_fields) + ) + + result = list(filtered_charges.iterate()) + + assert len(result) == 1