Use this file to discover all available pages before exploring further.
Testing is essential for maintaining code quality and preventing regressions in ERPNext. The framework provides a comprehensive testing infrastructure based on Python’s unittest.
# erpnext/selling/doctype/sales_order/test_sales_order.pyimport frappefrom frappe.tests import IntegrationTestCase, change_settingsfrom erpnext.selling.doctype.sales_order.sales_order import make_sales_invoiceclass TestSalesOrder(IntegrationTestCase): """Tests for Sales Order DocType""" @classmethod def setUpClass(cls): """Run once before all tests""" super().setUpClass() # Create test data cls.customer = frappe.get_doc({ "doctype": "Customer", "customer_name": "Test Customer", "customer_group": "Commercial", "territory": "All Territories" }).insert() @classmethod def tearDownClass(cls): """Run once after all tests""" # Clean up test data super().tearDownClass() def setUp(self): """Run before each test""" frappe.set_user("Administrator") def tearDown(self): """Run after each test""" frappe.db.rollback() def test_sales_order_creation(self): """Test creating a basic sales order""" so = make_sales_order() self.assertEqual(so.doctype, "Sales Order") self.assertEqual(so.customer, "_Test Customer") self.assertGreater(so.grand_total, 0) def test_sales_order_validation(self): """Test sales order validation""" so = make_sales_order(do_not_save=True) so.delivery_date = "2020-01-01" # Past date with self.assertRaises(frappe.ValidationError): so.save() def test_sales_invoice_from_sales_order(self): """Test creating sales invoice from sales order""" so = make_sales_order(do_not_submit=True) so.submit() si = make_sales_invoice(so.name) si.insert() self.assertEqual(si.customer, so.customer) self.assertEqual(len(si.items), len(so.items)) self.assertEqual(si.items[0].sales_order, so.name)
class TestSalesOrder(IntegrationTestCase): def test_delivery_date_validation(self): """Delivery date must be after transaction date""" from frappe.utils import add_days, today so = make_sales_order(do_not_save=True) so.transaction_date = today() so.delivery_date = add_days(today(), -1) # Yesterday # Should raise validation error with self.assertRaises(frappe.ValidationError) as context: so.save() self.assertIn("Delivery Date", str(context.exception)) def test_negative_quantity_validation(self): """Item quantity must be positive""" so = make_sales_order(do_not_save=True) so.items[0].qty = -5 with self.assertRaises(frappe.ValidationError): so.save()
def test_user_permissions(self): """Test user can only access their territory's orders""" from frappe.core.doctype.user_permission.test_user_permission import create_user # Create test user user = create_user("test_sales@example.com", "Sales User") # Create user permission frappe.get_doc({ "doctype": "User Permission", "user": user.name, "allow": "Territory", "for_value": "_Test Territory" }).insert(ignore_permissions=True) # Switch to test user frappe.set_user(user.name) # Should only see orders from permitted territory orders = frappe.get_all("Sales Order", filters={"docstatus": 1}) for order in orders: territory = frappe.db.get_value("Sales Order", order.name, "territory") self.assertEqual(territory, "_Test Territory")
def test_background_job_execution(self): """Test that background job is enqueued correctly""" from frappe.utils.background_jobs import get_jobs so = make_sales_order() # Trigger background job so.send_email_notification() # Check job is queued jobs = get_jobs() self.assertTrue(any('send_email' in str(job) for job in jobs))
# erpnext/setup/utils.pyimport frappedef before_tests(): """Setup test environment""" frappe.clear_cache() # Create test company if missing if not frappe.db.exists("Company", "_Test Company"): create_test_company() # Create test items create_test_items() # Create test customers create_test_customers() frappe.db.commit()def create_test_company(): """Create test company with chart of accounts""" from frappe.desk.page.setup_wizard.setup_wizard import setup_complete setup_complete({ "currency": "USD", "company_name": "_Test Company", "company_abbr": "_TC", "country": "United States" })