From d6e2d7105f781bbe3d4285beffe7c890553fec22 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Tue, 11 Aug 2026 16:03:51 +0530 Subject: [PATCH] perf(tests): run sales partner summary reports on shared fixtures Both sales partner summary suites created identical submitted, draft, cancelled, and returned transactions per doctype. Run both reports against one fixture set and receive stock only for Delivery Note and POS Invoice, the doctypes that consume it. --- .../test_sales_partner_commission_summary.py | 36 ++-- .../test_sales_partner_transaction_summary.py | 160 +----------------- .../test_utils.py | 105 ++++++++++++ 3 files changed, 134 insertions(+), 167 deletions(-) create mode 100644 erpnext/selling/report/sales_partner_transaction_summary/test_utils.py diff --git a/erpnext/selling/report/sales_partner_commission_summary/test_sales_partner_commission_summary.py b/erpnext/selling/report/sales_partner_commission_summary/test_sales_partner_commission_summary.py index 32f71f12aaf..99e89520080 100644 --- a/erpnext/selling/report/sales_partner_commission_summary/test_sales_partner_commission_summary.py +++ b/erpnext/selling/report/sales_partner_commission_summary/test_sales_partner_commission_summary.py @@ -9,6 +9,9 @@ from frappe.utils.data import comma_or from erpnext.selling.report.sales_partner_commission_summary.sales_partner_commission_summary import ( SALES_TRANSACTION_DOCTYPES, ) +from erpnext.selling.report.sales_partner_transaction_summary.test_utils import ( + SalesPartnerTransactionSummaryAssertions, +) from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry from erpnext.tests.utils import ERPNextTestSuite @@ -63,14 +66,15 @@ class SalesPartnerSummaryReportTestMixin(ERPNextTestSuite): self.make_transaction_func = make_transaction_funcs[doctype] - make_stock_entry( - item_code="_Test Item 2", - qty=10, - company="_Test Company", - to_warehouse="_Test Warehouse - _TC", - purpose="Material Receipt", - posting_date="2026-01-01", - ) + if doctype in {"Delivery Note", "POS Invoice"}: + make_stock_entry( + item_code="_Test Item 2", + qty=10, + company="_Test Company", + to_warehouse="_Test Warehouse - _TC", + purpose="Material Receipt", + posting_date="2026-01-01", + ) if doctype == "POS Invoice": POSInvoiceTestMixin.setUp(self) @@ -246,7 +250,9 @@ class SalesPartnerSummaryReportTestMixin(ERPNextTestSuite): self.returned_doc.submit() -class TestSalesPartnerCommissionSummary(SalesPartnerSummaryReportTestMixin): +class TestSalesPartnerSummaryReports( + SalesPartnerSummaryReportTestMixin, SalesPartnerTransactionSummaryAssertions +): def setUp(self): self.filters = { "company": "_Test Company", @@ -262,29 +268,33 @@ class TestSalesPartnerCommissionSummary(SalesPartnerSummaryReportTestMixin): def test_posting_date_column_label(self): self.assert_posting_date_label() - def test_sales_order_sp_commission_summary(self): + def test_sales_order_sp_summaries(self): self.filters["doctype"] = "Sales Order" self.create_transactions(self.filters["doctype"]) self.assert_sales_partner_commission_summary_report() + self.assert_sales_partner_transaction_summary_report() - def test_sales_invoice_sp_commission_summary(self): + def test_sales_invoice_sp_summaries(self): self.filters["doctype"] = "Sales Invoice" self.create_transactions(self.filters["doctype"]) self.assert_sales_partner_commission_summary_report() + self.assert_sales_partner_transaction_summary_report() - def test_delivery_note_sp_commission_summary(self): + def test_delivery_note_sp_summaries(self): self.filters["doctype"] = "Delivery Note" self.create_transactions(self.filters["doctype"]) self.assert_sales_partner_commission_summary_report() + self.assert_sales_partner_transaction_summary_report() - def test_pos_invoice_sp_commission_summary(self): + def test_pos_invoice_sp_summaries(self): self.filters["doctype"] = "POS Invoice" self.create_transactions(self.filters["doctype"]) self.assert_sales_partner_commission_summary_report() + self.assert_sales_partner_transaction_summary_report() def assert_sales_partner_commission_summary_report(self): report_data = run(self.report_name, self.filters) diff --git a/erpnext/selling/report/sales_partner_transaction_summary/test_sales_partner_transaction_summary.py b/erpnext/selling/report/sales_partner_transaction_summary/test_sales_partner_transaction_summary.py index 45b4efee867..b2c7604f863 100644 --- a/erpnext/selling/report/sales_partner_transaction_summary/test_sales_partner_transaction_summary.py +++ b/erpnext/selling/report/sales_partner_transaction_summary/test_sales_partner_transaction_summary.py @@ -1,14 +1,17 @@ # Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt -from frappe.desk.query_report import run - from erpnext.selling.report.sales_partner_commission_summary.test_sales_partner_commission_summary import ( SalesPartnerSummaryReportTestMixin, ) +from erpnext.selling.report.sales_partner_transaction_summary.test_utils import ( + SalesPartnerTransactionSummaryAssertions, +) -class TestSalesPartnerTransactionSummary(SalesPartnerSummaryReportTestMixin): +class TestSalesPartnerTransactionSummary( + SalesPartnerSummaryReportTestMixin, SalesPartnerTransactionSummaryAssertions +): def setUp(self): self.filters = { "company": "_Test Company", @@ -25,159 +28,8 @@ class TestSalesPartnerTransactionSummary(SalesPartnerSummaryReportTestMixin): def test_posting_date_column_label(self): self.assert_posting_date_label() - def test_sales_order_sp_transaction_summary(self): - self.filters["doctype"] = "Sales Order" - self.create_transactions(self.filters["doctype"]) - - self.assert_sales_partner_transaction_summary_report() - def test_sales_invoice_sp_transaction_summary(self): self.filters["doctype"] = "Sales Invoice" self.create_transactions(self.filters["doctype"]) self.assert_sales_partner_transaction_summary_report() - - def test_delivery_note_sp_transaction_summary(self): - self.filters["doctype"] = "Delivery Note" - self.create_transactions(self.filters["doctype"]) - - self.assert_sales_partner_transaction_summary_report() - - def test_pos_invoice_sp_transaction_summary(self): - self.filters["doctype"] = "POS Invoice" - self.create_transactions(self.filters["doctype"]) - - self.assert_sales_partner_transaction_summary_report() - - def assert_sales_partner_transaction_summary_report(self): - report_data = run(self.report_name, self.filters) - - self.report_result = report_data.get("result") - self.report_result_without_total_row = self.report_result[:-1] - - self.assertIsNotNone(self.report_result_without_total_row) - - self.assert_7pc_commission() - self.assert_5pc_commission_with_multiple_items() - self.assert_doc_with_no_sp() - self.assert_doc_with_posting_date_out_of_range() - self.assert_doc_with_revoked_commission() - self.assert_doc_not_submitted() - self.assert_doc_cancelled() - self.assert_commission() - - if self.filters["doctype"] != "Sales Order": - self.assert_returned_doc() - - def assert_7pc_commission(self): - doc_name = self.seven_pc_doc.name - - row = next((row for row in self.report_result_without_total_row if row.get("name") == doc_name), None) - - self.assertIsNotNone(row) - - self.assertEqual(row["customer"], "_Test Customer") - self.assertEqual(row["item_code"], "_Test Item") - self.assertEqual(row["item_group"], "_Test Item Group") - self.assertEqual(row["amount"], 1000) - self.assertEqual(row["commission_rate"], 7) - self.assertEqual(row["commission"], 70) - - def assert_5pc_commission_with_multiple_items(self): - doc_name = self.five_pc_doc.name - - row1 = next( - ( - row - for row in self.report_result_without_total_row - if row.get("name") == doc_name and row.get("item_code") == "_Test Item" - ), - None, - ) - self.assertIsNotNone(row1) - - row2 = next( - ( - row - for row in self.report_result_without_total_row - if row.get("name") == doc_name and row.get("item_code") == "_Test Item 2" - ), - None, - ) - self.assertIsNotNone(row2) - - self.assertEqual(row1["amount"], 120) - self.assertEqual(row1["commission_rate"], 5) - self.assertEqual(row1["commission"], 6) - - self.assertEqual(row2["amount"], 120) - self.assertEqual(row2["commission_rate"], 5) - self.assertEqual(row2["commission"], 6) - - def assert_doc_with_no_sp(self): - doc_name = self.no_sp_doc.name - - row = next((row for row in self.report_result_without_total_row if row.get("name") == doc_name), None) - - self.assertIsNone(row) - - def assert_doc_with_posting_date_out_of_range(self): - doc_name = self.date_out_of_range_doc.name - - row = next((row for row in self.report_result_without_total_row if row.get("name") == doc_name), None) - - self.assertIsNone(row) - - def assert_doc_with_revoked_commission(self): - doc_name = self.revoked_comm_doc.name - - row = next((row for row in self.report_result_without_total_row if row.get("name") == doc_name), None) - - self.assertIsNotNone(row) - self.assertEqual(row["amount"], 800) - self.assertEqual(row["commission_rate"], 7) - self.assertEqual(row["commission"], 0) - - def assert_doc_not_submitted(self): - doc_name = self.doc_not_submitted.name - - row = next((row for row in self.report_result_without_total_row if row.get("name") == doc_name), None) - - self.assertIsNone(row) - - def assert_doc_cancelled(self): - doc_name = self.cancelled_doc.name - - row = next((row for row in self.report_result_without_total_row if row.get("name") == doc_name), None) - - self.assertIsNone(row) - - def assert_commission(self): - total_row = self.report_result[-1] - - # Total Amount - self.assertEqual(total_row[-4], 2040) - - # Total Commission - self.assertEqual(total_row[-1], 82) - - def assert_returned_doc(self): - doc_name = self.to_be_returned_doc.name - returned_doc_name = self.returned_doc.name - - outward_row = next( - (row for row in self.report_result_without_total_row if row.get("name") == doc_name), None - ) - inward_row = next( - (row for row in self.report_result_without_total_row if row.get("name") == returned_doc_name), - None, - ) - - self.assertIsNotNone(outward_row) - self.assertIsNotNone(inward_row) - - self.assertEqual(outward_row["amount"], 900) - self.assertEqual(outward_row["commission"], 45) - - self.assertEqual(inward_row["amount"], -900) - self.assertEqual(inward_row["commission"], -45) diff --git a/erpnext/selling/report/sales_partner_transaction_summary/test_utils.py b/erpnext/selling/report/sales_partner_transaction_summary/test_utils.py new file mode 100644 index 00000000000..df8f5cc76d6 --- /dev/null +++ b/erpnext/selling/report/sales_partner_transaction_summary/test_utils.py @@ -0,0 +1,105 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from frappe.desk.query_report import run + + +class SalesPartnerTransactionSummaryAssertions: + def assert_sales_partner_transaction_summary_report(self): + filters = self.filters.copy() + filters["show_return_entries"] = 1 + report_data = run("Sales Partner Transaction Summary", filters) + + self.transaction_report_result = report_data.get("result") + self.transaction_report_result_without_total_row = self.transaction_report_result[:-1] + + self.assertIsNotNone(self.transaction_report_result_without_total_row) + + self.assert_transaction_7pc_commission() + self.assert_transaction_5pc_commission_with_multiple_items() + self.assert_transaction_doc_with_no_sp() + self.assert_transaction_doc_with_posting_date_out_of_range() + self.assert_transaction_doc_with_revoked_commission() + self.assert_transaction_doc_not_submitted() + self.assert_transaction_doc_cancelled() + self.assert_transaction_commission() + + if self.filters["doctype"] != "Sales Order": + self.assert_transaction_returned_doc() + + def assert_transaction_7pc_commission(self): + row = self._get_transaction_report_row(self.seven_pc_doc.name) + + self.assertIsNotNone(row) + self.assertEqual(row["customer"], "_Test Customer") + self.assertEqual(row["item_code"], "_Test Item") + self.assertEqual(row["item_group"], "_Test Item Group") + self.assertEqual(row["amount"], 1000) + self.assertEqual(row["commission_rate"], 7) + self.assertEqual(row["commission"], 70) + + def assert_transaction_5pc_commission_with_multiple_items(self): + row1 = self._get_transaction_report_row(self.five_pc_doc.name, "_Test Item") + self.assertIsNotNone(row1) + + row2 = self._get_transaction_report_row(self.five_pc_doc.name, "_Test Item 2") + self.assertIsNotNone(row2) + + self.assertEqual(row1["amount"], 120) + self.assertEqual(row1["commission_rate"], 5) + self.assertEqual(row1["commission"], 6) + + self.assertEqual(row2["amount"], 120) + self.assertEqual(row2["commission_rate"], 5) + self.assertEqual(row2["commission"], 6) + + def assert_transaction_doc_with_no_sp(self): + row = self._get_transaction_report_row(self.no_sp_doc.name) + self.assertIsNone(row) + + def assert_transaction_doc_with_posting_date_out_of_range(self): + row = self._get_transaction_report_row(self.date_out_of_range_doc.name) + self.assertIsNone(row) + + def assert_transaction_doc_with_revoked_commission(self): + row = self._get_transaction_report_row(self.revoked_comm_doc.name) + + self.assertIsNotNone(row) + self.assertEqual(row["amount"], 800) + self.assertEqual(row["commission_rate"], 7) + self.assertEqual(row["commission"], 0) + + def assert_transaction_doc_not_submitted(self): + row = self._get_transaction_report_row(self.doc_not_submitted.name) + self.assertIsNone(row) + + def assert_transaction_doc_cancelled(self): + row = self._get_transaction_report_row(self.cancelled_doc.name) + self.assertIsNone(row) + + def assert_transaction_commission(self): + total_row = self.transaction_report_result[-1] + + self.assertEqual(total_row[-4], 2040) + self.assertEqual(total_row[-1], 82) + + def assert_transaction_returned_doc(self): + outward_row = self._get_transaction_report_row(self.to_be_returned_doc.name) + inward_row = self._get_transaction_report_row(self.returned_doc.name) + + self.assertIsNotNone(outward_row) + self.assertIsNotNone(inward_row) + self.assertEqual(outward_row["amount"], 900) + self.assertEqual(outward_row["commission"], 45) + self.assertEqual(inward_row["amount"], -900) + self.assertEqual(inward_row["commission"], -45) + + def _get_transaction_report_row(self, doc_name, item_code=None): + return next( + ( + row + for row in self.transaction_report_result_without_total_row + if row.get("name") == doc_name and (not item_code or row.get("item_code") == item_code) + ), + None, + )