From c55628a55d03b04fc21f3be9f5ebceaccc787bef Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 29 Jan 2026 11:48:51 +0530 Subject: [PATCH] refactor(test): make dunning deterministic --- .../accounts/doctype/dunning/test_dunning.py | 15 ------ erpnext/tests/utils.py | 48 +++++++++++++++++++ 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/erpnext/accounts/doctype/dunning/test_dunning.py b/erpnext/accounts/doctype/dunning/test_dunning.py index f6bfa1453da..6eaf1d8798e 100644 --- a/erpnext/accounts/doctype/dunning/test_dunning.py +++ b/erpnext/accounts/doctype/dunning/test_dunning.py @@ -8,9 +8,6 @@ from frappe.utils import add_days, nowdate, today from erpnext import get_default_cost_center from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry -from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import ( - unlink_payment_on_cancel_of_invoice, -) from erpnext.accounts.doctype.sales_invoice.sales_invoice import ( create_dunning as create_dunning_from_sales_invoice, ) @@ -21,18 +18,6 @@ from erpnext.tests.utils import ERPNextTestSuite class TestDunning(ERPNextTestSuite): - @classmethod - def setUpClass(cls): - super().setUpClass() - create_dunning_type("First Notice", fee=0.0, interest=0.0, is_default=1) - create_dunning_type("Second Notice", fee=10.0, interest=10.0, is_default=0) - unlink_payment_on_cancel_of_invoice() - - @classmethod - def tearDownClass(cls): - unlink_payment_on_cancel_of_invoice(0) - super().tearDownClass() - def test_dunning_without_fees(self): dunning = create_dunning(overdue_days=20) diff --git a/erpnext/tests/utils.py b/erpnext/tests/utils.py index 0d15226842a..053e3c868af 100644 --- a/erpnext/tests/utils.py +++ b/erpnext/tests/utils.py @@ -252,6 +252,7 @@ class ERPNextTestSuite(unittest.TestCase): cls.make_brand() cls.make_monthly_distribution() cls.make_projects() + cls.make_dunning_type() cls.update_selling_settings() cls.update_stock_settings() cls.update_system_settings() @@ -3042,6 +3043,53 @@ class ERPNextTestSuite(unittest.TestCase): else: cls.brand.append(frappe.get_doc("Brand", {"Brand": x.get("brand")})) + @classmethod + def make_dunning_type(cls): + records = [ + { + "doctype": "Dunning Type", + "dunning_type": "First Notice", + "company": cls.companies[0].name, + "is_default": 1, + "dunning_fee": 0, + "rate_of_interest": 0, + "income_account": "Sales - _TC", + "cost_center": "Main - _TC", + "dunning_letter_text": [ + { + "language": "en", + "body_text": "We have still not received payment for our invoice", + "closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees.", + }, + ], + }, + { + "doctype": "Dunning Type", + "dunning_type": "Second Notice", + "company": cls.companies[0].name, + "is_default": 0, + "dunning_fee": 10, + "rate_of_interest": 10, + "income_account": "Sales - _TC", + "cost_center": "Main - _TC", + "dunning_letter_text": [ + { + "language": "en", + "body_text": "We have still not received payment for our invoice", + "closing_text": "We kindly request that you pay the outstanding amount immediately, including interest and late fees.", + }, + ], + }, + ] + cls.dunning_type = [] + for x in records: + if not frappe.db.exists("Dunning Type", {"dunning_type": x.get("dunning_type")}): + cls.dunning_type.append(frappe.get_doc(x).insert()) + else: + cls.dunning_type.append( + frappe.get_doc("Dunning Type", {"dunning_type": x.get("dunning_type")}) + ) + @contextmanager def set_user(self, user: str): try: