From 83d821d8c470d54e3f52a6c05beacaafdd8779f9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 3 Jul 2026 11:28:56 +0530 Subject: [PATCH] test: add coverage for Journal Entry Template --- .../test_journal_entry_template.py | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py index 616327e8493..ea1306140bd 100644 --- a/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py +++ b/erpnext/accounts/doctype/journal_entry_template/test_journal_entry_template.py @@ -1,9 +1,52 @@ -# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -# import frappe + +import unittest + +import frappe from erpnext.tests.utils import ERPNextTestSuite +COMPANY = "_Test Company" + class TestJournalEntryTemplate(ERPNextTestSuite): - pass + """Journal Entry Template's only real rule is validate_party: party_type is + allowed only on Receivable/Payable accounts, and a party needs a party_type.""" + + def setUp(self): + frappe.set_user("Administrator") + + def make_template(self, rows, company=COMPANY): + doc = frappe.new_doc("Journal Entry Template") + doc.template_title = f"_Test JET {frappe.generate_hash(length=6)}" + doc.company = company + doc.voucher_type = "Journal Entry" + doc.naming_series = frappe.get_meta("Journal Entry").get_field("naming_series").options.split("\n")[0] + for row in rows: + doc.append("accounts", row) + return doc + + def test_party_type_only_on_receivable_or_payable_account(self): + # Cash is neither Receivable nor Payable, so a party_type here is invalid + doc = self.make_template([{"account": "Cash - _TC", "party_type": "Customer"}]) + self.assertRaises(frappe.ValidationError, doc.validate) + + def test_party_requires_party_type(self): + doc = self.make_template([{"account": "Debtors - _TC", "party": "_Test Customer"}]) + self.assertRaises(frappe.ValidationError, doc.validate) + + @unittest.expectedFailure + def test_account_from_other_company_is_rejected(self): + # SUSPECTED BUG: unlike Item Tax Template / Mode of Payment, this template never + # checks that each row's account belongs to self.company, so a row pointing at + # another company's account saves. Asserts the behaviour we'd want. + other_receivable = frappe.get_all( + "Account", + {"company": "_Test Company 1", "account_type": "Receivable", "is_group": 0}, + pluck="name", + )[0] + doc = self.make_template( + [{"account": other_receivable, "party_type": "Customer", "party": "_Test Customer"}] + ) + self.assertRaises(frappe.ValidationError, doc.insert)