From e50467a59389fd706574dbb9fd4a2b59f25f8164 Mon Sep 17 00:00:00 2001 From: ljain112 Date: Thu, 12 Jun 2025 17:15:38 +0530 Subject: [PATCH 1/3] chore: Refactor test to use clear_cache instead of reload_doc --- .../doctype/inventory_dimension/test_inventory_dimension.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py index 6bb821fb0b8..b8e4ab04135 100644 --- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py +++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py @@ -167,8 +167,8 @@ class TestInventoryDimension(IntegrationTestCase): "Delivery Note", dict(fieldname="rack", label="Rack", fieldtype="Link", options="Rack") ) - frappe.reload_doc("stock", "doctype", "purchase_receipt_item") - frappe.reload_doc("stock", "doctype", "delivery_note_item") + frappe.clear_cache(doctype="Purchase Receipt") + frappe.clear_cache(doctype="Delivery Note") pr_doc = make_purchase_receipt(qty=2, do_not_submit=True) pr_doc.rack = "Rack 1" From 1e4fc043a8af3569305c716486aadbb9e75bfb53 Mon Sep 17 00:00:00 2001 From: ljain112 Date: Mon, 16 Jun 2025 17:56:30 +0530 Subject: [PATCH 2/3] chore: Refactor test cases to use context manager for user setting --- .../purchase_order/test_purchase_order.py | 27 ++++--- .../buying/doctype/supplier/test_supplier.py | 6 +- .../doctype/sales_order/test_sales_order.py | 76 +++++++++---------- .../doctype/stock_entry/test_stock_entry.py | 42 +++++----- .../test_stock_ledger_entry.py | 42 +++++----- erpnext/tests/test_webform.py | 19 ++--- 6 files changed, 102 insertions(+), 110 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 83622ed22a6..b1138d64161 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -295,22 +295,21 @@ class TestPurchaseOrder(IntegrationTestCase): user = "test@example.com" test_user = frappe.get_doc("User", user) test_user.add_roles("Accounts User") - frappe.set_user(user) - # update qty - trans_item = json.dumps( - [{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": po.items[0].name}] - ) - self.assertRaises( - frappe.ValidationError, update_child_qty_rate, "Purchase Order", trans_item, po.name - ) + with self.set_user(user): + # update qty + trans_item = json.dumps( + [{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": po.items[0].name}] + ) + self.assertRaises( + frappe.ValidationError, update_child_qty_rate, "Purchase Order", trans_item, po.name + ) - # add new item - trans_item = json.dumps([{"item_code": "_Test Item", "rate": 100, "qty": 2}]) - self.assertRaises( - frappe.ValidationError, update_child_qty_rate, "Purchase Order", trans_item, po.name - ) - frappe.set_user("Administrator") + # add new item + trans_item = json.dumps([{"item_code": "_Test Item", "rate": 100, "qty": 2}]) + self.assertRaises( + frappe.ValidationError, update_child_qty_rate, "Purchase Order", trans_item, po.name + ) def test_update_child_with_tax_template(self): """ diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index ec504059396..b6a8c7b288c 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -192,7 +192,7 @@ class TestSupplierPortal(IntegrationTestCase): supplier.append("portal_users", {"user": user}) supplier.save() - frappe.set_user(user) - _, suppliers = get_customers_suppliers("Purchase Order", user) + with self.set_user(user): + _, suppliers = get_customers_suppliers("Purchase Order", user) - self.assertIn(supplier.name, suppliers) + self.assertIn(supplier.name, suppliers) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 3d755f1724c..cf438b04e5b 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -547,17 +547,20 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase): so = make_sales_order(item_code="_Test Item", qty=4) test_user = create_user("test_so_child_perms@example.com", "Accounts User") - frappe.set_user(test_user.name) + with self.set_user(test_user.name): + # update qty + trans_item = json.dumps( + [{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": so.items[0].name}] + ) + self.assertRaises( + frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name + ) - # update qty - trans_item = json.dumps( - [{"item_code": "_Test Item", "rate": 200, "qty": 7, "docname": so.items[0].name}] - ) - self.assertRaises(frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name) - - # add new item - trans_item = json.dumps([{"item_code": "_Test Item", "rate": 100, "qty": 2}]) - self.assertRaises(frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name) + # add new item + trans_item = json.dumps([{"item_code": "_Test Item", "rate": 100, "qty": 2}]) + self.assertRaises( + frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name + ) def test_update_child_qty_rate_with_workflow(self): from frappe.model.workflow import apply_workflow @@ -569,26 +572,25 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase): user = "test@example.com" test_user = frappe.get_doc("User", user) test_user.add_roles("Sales User", "Test Junior Approver") - frappe.set_user(user) + with self.set_user(user): + # user shouldn't be able to edit since grand_total will become > 200 if qty is doubled + trans_item = json.dumps( + [{"item_code": "_Test Item", "rate": 150, "qty": 2, "docname": so.items[0].name}] + ) + self.assertRaises( + frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name + ) - # user shouldn't be able to edit since grand_total will become > 200 if qty is doubled - trans_item = json.dumps( - [{"item_code": "_Test Item", "rate": 150, "qty": 2, "docname": so.items[0].name}] - ) - self.assertRaises(frappe.ValidationError, update_child_qty_rate, "Sales Order", trans_item, so.name) - - frappe.set_user("Administrator") user2 = "test2@example.com" test_user2 = frappe.get_doc("User", user2) test_user2.add_roles("Sales User", "Test Approver") - frappe.set_user(user2) - # Test Approver is allowed to edit with grand_total > 200 - update_child_qty_rate("Sales Order", trans_item, so.name) - so.reload() - self.assertEqual(so.items[0].qty, 2) + with self.set_user(user2): + # Test Approver is allowed to edit with grand_total > 200 + update_child_qty_rate("Sales Order", trans_item, so.name) + so.reload() + self.assertEqual(so.items[0].qty, 2) - frappe.set_user("Administrator") test_user.remove_roles("Sales User", "Test Junior Approver", "Test Approver") test_user2.remove_roles("Sales User", "Test Junior Approver", "Test Approver") workflow.is_active = 0 @@ -816,22 +818,20 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase): frappe.permissions.add_user_permission("Warehouse", "_Test Warehouse 2 - _TC1", test_user_2.name) frappe.permissions.add_user_permission("Company", "_Test Company 1", test_user_2.name) - frappe.set_user(test_user.name) + with self.set_user(test_user.name): + so = make_sales_order( + company="_Test Company 1", + customer="_Test Customer 1", + warehouse="_Test Warehouse 2 - _TC1", + do_not_save=True, + ) + so.conversion_rate = 0.02 + so.plc_conversion_rate = 0.02 + self.assertRaises(frappe.PermissionError, so.insert) - so = make_sales_order( - company="_Test Company 1", - customer="_Test Customer 1", - warehouse="_Test Warehouse 2 - _TC1", - do_not_save=True, - ) - so.conversion_rate = 0.02 - so.plc_conversion_rate = 0.02 - self.assertRaises(frappe.PermissionError, so.insert) + with self.set_user(test_user_2.name): + so.insert() - frappe.set_user(test_user_2.name) - so.insert() - - frappe.set_user("Administrator") frappe.permissions.remove_user_permission("Warehouse", "_Test Warehouse 1 - _TC", test_user.name) frappe.permissions.remove_user_permission("Warehouse", "_Test Warehouse 2 - _TC1", test_user_2.name) frappe.permissions.remove_user_permission("Company", "_Test Company 1", test_user_2.name) diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index 0ae619b3049..2983cb422e4 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -752,15 +752,14 @@ class TestStockEntry(IntegrationTestCase): frappe.get_doc("User", "test2@example.com").add_roles( "Sales User", "Sales Manager", "Stock User", "Stock Manager" ) - frappe.set_user("test2@example.com") + with self.set_user("test2@example.com"): + from erpnext.stock.utils import InvalidWarehouseCompany - from erpnext.stock.utils import InvalidWarehouseCompany - - st1 = frappe.copy_doc(self.globalTestRecords["Stock Entry"][0]) - st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1" - st1.set_stock_entry_type() - st1.insert() - self.assertRaises(InvalidWarehouseCompany, st1.submit) + st1 = frappe.copy_doc(self.globalTestRecords["Stock Entry"][0]) + st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1" + st1.set_stock_entry_type() + st1.insert() + self.assertRaises(InvalidWarehouseCompany, st1.submit) # permission tests def test_warehouse_user(self): @@ -778,24 +777,23 @@ class TestStockEntry(IntegrationTestCase): st1 = frappe.copy_doc(self.globalTestRecords["Stock Entry"][0]) st1.company = "_Test Company 1" - frappe.set_user("test@example.com") - st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1" - self.assertRaises(frappe.PermissionError, st1.insert) + with self.set_user("test@example.com"): + st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1" + self.assertRaises(frappe.PermissionError, st1.insert) test_user.add_roles("System Manager") - frappe.set_user("test2@example.com") - st1 = frappe.copy_doc(self.globalTestRecords["Stock Entry"][0]) - st1.company = "_Test Company 1" - st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1" - st1.get("items")[0].expense_account = "Stock Adjustment - _TC1" - st1.get("items")[0].cost_center = "Main - _TC1" - st1.set_stock_entry_type() - st1.insert() - st1.submit() - st1.cancel() + with self.set_user("test2@example.com"): + st1 = frappe.copy_doc(self.globalTestRecords["Stock Entry"][0]) + st1.company = "_Test Company 1" + st1.get("items")[0].t_warehouse = "_Test Warehouse 2 - _TC1" + st1.get("items")[0].expense_account = "Stock Adjustment - _TC1" + st1.get("items")[0].cost_center = "Main - _TC1" + st1.set_stock_entry_type() + st1.insert() + st1.submit() + st1.cancel() - frappe.set_user("Administrator") remove_user_permission("Warehouse", "_Test Warehouse 1 - _TC", "test@example.com") remove_user_permission("Warehouse", "_Test Warehouse 2 - _TC1", "test2@example.com") remove_user_permission("Company", "_Test Company 1", "test2@example.com") diff --git a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py index 4855327b08e..d940f61f3ff 100644 --- a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py +++ b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py @@ -423,37 +423,35 @@ class TestStockLedgerEntry(IntegrationTestCase, StockTestMixin): user.add_roles("Stock User") user.remove_roles("Stock Manager") - frappe.set_user(user.name) + with self.set_user(user.name): + stock_entry_on_today = make_stock_entry( + target="_Test Warehouse - _TC", qty=10, basic_rate=100 + ) + back_dated_se_1 = make_stock_entry( + target="_Test Warehouse - _TC", + qty=10, + basic_rate=100, + posting_date=add_days(today(), -1), + do_not_submit=True, + ) - stock_entry_on_today = make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100) - back_dated_se_1 = make_stock_entry( - target="_Test Warehouse - _TC", - qty=10, - basic_rate=100, - posting_date=add_days(today(), -1), - do_not_submit=True, - ) + # Block back-dated entry + self.assertRaises(BackDatedStockTransaction, back_dated_se_1.submit) - # Block back-dated entry - self.assertRaises(BackDatedStockTransaction, back_dated_se_1.submit) - - frappe.set_user("Administrator") user.add_roles("Stock Manager") - frappe.set_user(user.name) + with self.set_user(user.name): + # Back dated entry allowed to Stock Manager + back_dated_se_2 = make_stock_entry( + target="_Test Warehouse - _TC", qty=10, basic_rate=100, posting_date=add_days(today(), -1) + ) - # Back dated entry allowed to Stock Manager - back_dated_se_2 = make_stock_entry( - target="_Test Warehouse - _TC", qty=10, basic_rate=100, posting_date=add_days(today(), -1) - ) - - back_dated_se_2.cancel() - stock_entry_on_today.cancel() + back_dated_se_2.cancel() + stock_entry_on_today.cancel() finally: frappe.db.set_single_value( "Stock Settings", "role_allowed_to_create_edit_back_dated_transactions", None ) - frappe.set_user("Administrator") user.remove_roles("Stock Manager") def test_batchwise_item_valuation_fifo(self): diff --git a/erpnext/tests/test_webform.py b/erpnext/tests/test_webform.py index aa6083c0ff8..5f600941e8f 100644 --- a/erpnext/tests/test_webform.py +++ b/erpnext/tests/test_webform.py @@ -27,21 +27,18 @@ class TestWebsite(IntegrationTestCase): create_order_assignment(supplier="Supplier1", po=po1.name) create_order_assignment(supplier="Supplier2", po=po2.name) - frappe.set_user("Administrator") # checking if data consist of all order assignment of Supplier1 and Supplier2 self.assertTrue("Supplier1" and "Supplier2" in [data.supplier for data in get_data()]) - frappe.set_user("supplier1@gmail.com") - # checking if data only consist of order assignment of Supplier1 - self.assertTrue("Supplier1" in [data.supplier for data in get_data()]) - self.assertFalse([data.supplier for data in get_data() if data.supplier != "Supplier1"]) + with self.set_user("supplier1@gmail.com"): + # checking if data only consist of order assignment of Supplier1 + self.assertTrue("Supplier1" in [data.supplier for data in get_data()]) + self.assertFalse([data.supplier for data in get_data() if data.supplier != "Supplier1"]) - frappe.set_user("supplier2@gmail.com") - # checking if data only consist of order assignment of Supplier2 - self.assertTrue("Supplier2" in [data.supplier for data in get_data()]) - self.assertFalse([data.supplier for data in get_data() if data.supplier != "Supplier2"]) - - frappe.set_user("Administrator") + with self.set_user("supplier2@gmail.com"): + # checking if data only consist of order assignment of Supplier2 + self.assertTrue("Supplier2" in [data.supplier for data in get_data()]) + self.assertFalse([data.supplier for data in get_data() if data.supplier != "Supplier2"]) def get_data(): From 7bc88ffe0ed7536060681ccb79767211d6d4024e Mon Sep 17 00:00:00 2001 From: ljain112 Date: Tue, 24 Jun 2025 15:19:40 +0530 Subject: [PATCH 3/3] chore: cache clears on custom field and property setter creation/delete --- erpnext/controllers/tests/test_queries.py | 2 -- .../inventory_dimension/test_inventory_dimension.py | 8 -------- 2 files changed, 10 deletions(-) diff --git a/erpnext/controllers/tests/test_queries.py b/erpnext/controllers/tests/test_queries.py index 1e0c670c1c0..51e37d0cf4d 100644 --- a/erpnext/controllers/tests/test_queries.py +++ b/erpnext/controllers/tests/test_queries.py @@ -106,7 +106,6 @@ class TestQueries(ERPNextTestSuite): value=1, property_type="Check", ) - frappe.clear_cache(doctype="Payment Entry") user = create_user("test_employee_query@example.com", "Accounts User", "HR User") add_user_permissions( @@ -137,7 +136,6 @@ class TestQueries(ERPNextTestSuite): self.assertGreater(len(result), 1) ps.delete(ignore_permissions=1, force=1, delete_permanently=1) - frappe.clear_cache(doctype="Payment Entry") # only one employee should be returned even though ignore_user_permissions is passed as 1 result = queries.employee_query(**params) diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py index b8e4ab04135..0eca78649a9 100644 --- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py +++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py @@ -78,8 +78,6 @@ class TestInventoryDimension(IntegrationTestCase): self.assertFalse(custom_field) def test_inventory_dimension(self): - frappe.clear_cache(doctype="Inventory Dimension") - warehouse = "Shelf Warehouse - _TC" item_code = "_Test Item" @@ -150,8 +148,6 @@ class TestInventoryDimension(IntegrationTestCase): self.assertRaises(DoNotChangeError, inv_dim1.save) def test_inventory_dimension_for_purchase_receipt_and_delivery_note(self): - frappe.clear_cache(doctype="Inventory Dimension") - inv_dimension = create_inventory_dimension( reference_document="Rack", dimension_name="Rack", apply_to_all_doctypes=1 ) @@ -167,9 +163,6 @@ class TestInventoryDimension(IntegrationTestCase): "Delivery Note", dict(fieldname="rack", label="Rack", fieldtype="Link", options="Rack") ) - frappe.clear_cache(doctype="Purchase Receipt") - frappe.clear_cache(doctype="Delivery Note") - pr_doc = make_purchase_receipt(qty=2, do_not_submit=True) pr_doc.rack = "Rack 1" pr_doc.save() @@ -439,7 +432,6 @@ class TestInventoryDimension(IntegrationTestCase): self.assertEqual(d.store, "Inter Transfer Store 2") def test_validate_negative_stock_for_inventory_dimension(self): - frappe.clear_cache(doctype="Inventory Dimension") item_code = "Test Negative Inventory Dimension Item" frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 1) create_item(item_code)