From 652acd92edc87b62d4371f424dadf1c40c63fa11 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Thu, 18 Dec 2025 13:24:38 +0530 Subject: [PATCH 01/22] use run-test command --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 072b5a9..1258348 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,6 +117,6 @@ jobs: - name: Run Tests working-directory: /home/runner/frappe-bench - run: bench --site test_site run-parallel-tests --app "${{ env.APP_NAME }}" + run: bench --site test_site run-tests --app "${{ env.APP_NAME }}" env: TYPE: server From 41bd8507bd086c16d0d04fe6273543d52dd0fc8d Mon Sep 17 00:00:00 2001 From: Guru107 Date: Thu, 18 Dec 2025 13:27:12 +0530 Subject: [PATCH 02/22] add allow test flag --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1258348..7b8588e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,6 +117,8 @@ jobs: - name: Run Tests working-directory: /home/runner/frappe-bench - run: bench --site test_site run-tests --app "${{ env.APP_NAME }}" + run: | + bench --site test_site set-config allow_tests true + bench --site test_site run-tests --app "${{ env.APP_NAME }}" env: TYPE: server From 782d13608b8ca02d6fa98a66157ccec1a4a44934 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Thu, 18 Dec 2025 16:54:54 +0530 Subject: [PATCH 03/22] remove breaking change --- gate_entry/tests/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index efce7e7..c9d8930 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -180,7 +180,6 @@ def set_default_company_for_tests(): "default_inventory_account": "Stock In Hand - WP", "stock_adjustment_account": "Stock Adjustment - WP", "stock_received_but_not_billed": "Stock Received But Not Billed - WP", - "expenses_included_in_valuation": "Expenses Included In Valuation - WP", }, ) From b13f9681e28914d7539d6ba68f34a2edbca0a11d Mon Sep 17 00:00:00 2001 From: Guru107 Date: Thu, 18 Dec 2025 17:10:18 +0530 Subject: [PATCH 04/22] set company to fiscal year --- gate_entry/tests/__init__.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index c9d8930..ce26d73 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -4,6 +4,7 @@ from functools import partial import frappe +from erpnext.accounts.utils import get_fiscal_year from frappe.desk.page.setup_wizard.setup_wizard import setup_complete from frappe.test_runner import make_test_objects from frappe.utils import getdate @@ -21,6 +22,7 @@ def before_tests(): ensure_uoms() # Set up company if it doesn't exist + company_name = "Wind Power LLP" if not frappe.db.a_row_exists("Company"): today = getdate() year = today.year if today.month > 3 else today.year - 1 @@ -29,7 +31,7 @@ def before_tests(): { "currency": "INR", "full_name": "Test User", - "company_name": "Wind Power LLP", + "company_name": company_name, "timezone": "Asia/Kolkata", "company_abbr": "WP", "industry": "Manufacturing", @@ -46,6 +48,8 @@ def before_tests(): # Ensure UOMs still exist after setup_complete (it might reset things) ensure_uoms() + add_company_to_fiscal_year(company_name) + # Enable all roles for admin (like ERPNext does) _enable_all_roles_for_admin() @@ -110,6 +114,30 @@ def ensure_uoms(): raise +def add_company_to_fiscal_year(company_name): + try: + # Get the current Fiscal Year (created by setup_complete) + fy = get_fiscal_year(getdate(), as_dict=True) + if not fy: + return + + doc = frappe.get_doc("Fiscal Year", fy.name) + fy_companies = [row.company for row in doc.companies] + + # Add company if not already present + if company_name not in fy_companies: + doc.append("companies", {"company": company_name}) + doc.save(ignore_permissions=True) + frappe.db.commit() + frappe.clear_cache() + except Exception as exc: + frappe.log_error( + message=f"Failed to add company to Fiscal Year: {exc}", + title="Gate Entry Test Setup - Fiscal Year", + ) + # Don't re-raise - this is best-effort, but log for debugging + + def _enable_all_roles_for_admin(): """Enable all roles for Administrator user (like ERPNext does).""" try: From 3591d457622bc7952a61a84bbe77ecf5a529c4a6 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Thu, 18 Dec 2025 17:19:12 +0530 Subject: [PATCH 05/22] remove commit commands --- gate_entry/tests/__init__.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index ce26d73..94cc044 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -58,6 +58,7 @@ def before_tests(): set_default_company_for_tests() ensure_warehouses_exist() frappe.db.commit() + frappe.clear_cache() frappe.flags.skip_test_records = True frappe.enqueue = partial(frappe.enqueue, now=True) @@ -71,7 +72,6 @@ def ensure_transit_warehouse_type(): doc = frappe.new_doc("Warehouse Type") doc.name = "Transit" doc.insert(ignore_permissions=True) - frappe.db.commit() except Exception as exc: frappe.log_error( message=f"Failed to create Transit Warehouse Type: {exc}", @@ -91,9 +91,6 @@ def ensure_uoms(): doc = frappe.get_doc({"doctype": "UOM", "uom_name": uom_name}) doc.insert(ignore_permissions=True) - frappe.db.commit() - frappe.clear_cache() - # Verify UOMs were created for uom_name in required_uoms: if not frappe.db.exists("UOM", uom_name): @@ -103,8 +100,6 @@ def ensure_uoms(): if frappe.db.exists("UOM", default_uom): frappe.reload_doc("stock", "doctype", "stock_settings") frappe.db.set_single_value("Stock Settings", "stock_uom", default_uom) - frappe.db.commit() - frappe.clear_cache() except Exception as exc: frappe.log_error( message=f"Failed to create UOMs: {exc}", @@ -128,8 +123,6 @@ def add_company_to_fiscal_year(company_name): if company_name not in fy_companies: doc.append("companies", {"company": company_name}) doc.save(ignore_permissions=True) - frappe.db.commit() - frappe.clear_cache() except Exception as exc: frappe.log_error( message=f"Failed to add company to Fiscal Year: {exc}", @@ -234,9 +227,7 @@ def ensure_warehouses_exist(): # If no warehouses exist, trigger company.on_update() to create default warehouses if not existing_warehouses: company.flags.ignore_validate = True - company.save() - frappe.db.commit() - frappe.clear_cache() + company.save(ignore_permissions=True) # Verify warehouses exist, create if missing required_warehouses = [ @@ -266,7 +257,6 @@ def ensure_warehouses_exist(): parent_wh.flags.ignore_mandatory = True parent_wh.insert() parent_warehouse = parent_wh.name - frappe.db.commit() # Create missing warehouses warehouses_created = False @@ -290,12 +280,9 @@ def ensure_warehouses_exist(): ) warehouse.flags.ignore_permissions = True warehouse.flags.ignore_mandatory = True - warehouse.insert() + warehouse.insert(ignore_permissions=True) warehouses_created = True - if warehouses_created: - frappe.db.commit() - frappe.clear_cache() except Exception as exc: frappe.log_error( message=f"Failed to ensure warehouses exist: {exc}", From bda1ad206e7296e0a242dea9e9ebf9d284cf292d Mon Sep 17 00:00:00 2001 From: Guru107 Date: Thu, 18 Dec 2025 17:20:14 +0530 Subject: [PATCH 06/22] fix lint issue --- gate_entry/tests/__init__.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 94cc044..48e893f 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -257,9 +257,6 @@ def ensure_warehouses_exist(): parent_wh.flags.ignore_mandatory = True parent_wh.insert() parent_warehouse = parent_wh.name - - # Create missing warehouses - warehouses_created = False for wh_info in required_warehouses: warehouse_full_name = f"{wh_info['name']} - {company_abbr}" # Check by full name (with abbreviation) first @@ -281,7 +278,6 @@ def ensure_warehouses_exist(): warehouse.flags.ignore_permissions = True warehouse.flags.ignore_mandatory = True warehouse.insert(ignore_permissions=True) - warehouses_created = True except Exception as exc: frappe.log_error( From 3cd1a7147812a022c46fb34f2e3b8a2777f5d601 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Thu, 18 Dec 2025 18:09:52 +0530 Subject: [PATCH 07/22] modify test records --- gate_entry/tests/__init__.py | 2 +- gate_entry/tests/test_records.json | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 48e893f..2b41d5b 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -255,7 +255,7 @@ def ensure_warehouses_exist(): ) parent_wh.flags.ignore_permissions = True parent_wh.flags.ignore_mandatory = True - parent_wh.insert() + parent_wh.insert(ignore_permissions=True) parent_warehouse = parent_wh.name for wh_info in required_warehouses: warehouse_full_name = f"{wh_info['name']} - {company_abbr}" diff --git a/gate_entry/tests/test_records.json b/gate_entry/tests/test_records.json index 84b93e1..e375b4d 100644 --- a/gate_entry/tests/test_records.json +++ b/gate_entry/tests/test_records.json @@ -49,7 +49,12 @@ "selling_cost_center": "Main - WP", "income_account": "Sales - WP" } - ] + ], + "taxes": [ + { + "item_tax_template": "Nil-Rated - WP" + } + ] }, { "doctype": "Item", @@ -78,7 +83,12 @@ "selling_cost_center": "Main - WP", "income_account": "Sales - WP" } - ] + ], + "taxes": [ + { + "item_tax_template": "Nil-Rated - WP" + } + ] }, { "doctype": "Item", @@ -107,7 +117,12 @@ "selling_cost_center": "Main - WP", "income_account": "Sales - WP" } - ] + ], + "taxes": [ + { + "item_tax_template": "Nil-Rated - WP" + } + ] } ], "Supplier": [ From b55e002c5195f9a159ffb274f7f4dc1597353fd0 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 12:13:41 +0530 Subject: [PATCH 08/22] clear test setup --- gate_entry/tests/__init__.py | 204 +++-------------------------------- 1 file changed, 13 insertions(+), 191 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 9a8f6df..4583a02 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -37,128 +37,21 @@ def before_tests(): "email": "test@example.com", "password": "test", "chart_of_accounts": "Standard", + "company_gstin": "29MUMB22923F1D", + "default_gst_rate": "18.0", + "enable_audit_trail": 0, } ) - - add_company_to_fiscal_year(company_name) - - # Enable all roles for admin (like ERPNext does) - _enable_all_roles_for_admin() - set_default_settings_for_tests() create_test_records() set_default_company_for_tests() - ensure_warehouses_exist() frappe.db.commit() - + frappe.clear_cache() + frappe.flags.country = "India" frappe.flags.skip_test_records = True frappe.enqueue = partial(frappe.enqueue, now=True) -def ensure_transit_warehouse_type(): - """Ensure 'Transit' Warehouse Type exists (required for Company default warehouses).""" - try: - frappe.reload_doc("stock", "doctype", "warehouse_type") - if not frappe.db.exists("Warehouse Type", "Transit"): - doc = frappe.new_doc("Warehouse Type") - doc.name = "Transit" - doc.insert(ignore_permissions=True) - frappe.db.commit() - except Exception as exc: - frappe.log_error( - message=f"Failed to create Transit Warehouse Type: {exc}", - title="Gate Entry Test Setup - Warehouse Type", - ) - - -def add_companies_to_fiscal_year(data): - fy = get_fiscal_year(getdate(), as_dict=True) - doc = frappe.get_doc("Fiscal Year", fy.name) - fy_companies = [row.company for row in doc.companies] - - for company in data: - if (company_name := company["company_name"]) not in fy_companies: - doc.append("companies", {"company": company_name}) - - doc.save(ignore_permissions=True) - - -def ensure_uoms(): - """Ensure required Unit of Measures exist before creating test items.""" - required_uoms = ["Nos", "Kg", "Ltr", "Box", "Pcs"] - default_uom = "Nos" - - try: - frappe.reload_doc("setup", "doctype", "UOM") - for uom_name in required_uoms: - if not frappe.db.exists("UOM", uom_name): - doc = frappe.get_doc({"doctype": "UOM", "uom_name": uom_name}) - doc.insert(ignore_permissions=True) - - frappe.db.commit() - frappe.clear_cache() - - # Verify UOMs were created - for uom_name in required_uoms: - if not frappe.db.exists("UOM", uom_name): - raise Exception(f"Failed to create UOM: {uom_name}") - - # Set default UOM in Stock Settings - if frappe.db.exists("UOM", default_uom): - frappe.reload_doc("stock", "doctype", "stock_settings") - frappe.db.set_single_value("Stock Settings", "stock_uom", default_uom) - frappe.db.commit() - frappe.clear_cache() - except Exception as exc: - frappe.log_error( - message=f"Failed to create UOMs: {exc}", - title="Gate Entry Test Setup - UOM", - ) - # Re-raise to prevent silent failures - raise - - -def add_company_to_fiscal_year(company_name): - try: - # Get the current Fiscal Year (created by setup_complete) - fy = get_fiscal_year(getdate(), as_dict=True) - if not fy: - return - - doc = frappe.get_doc("Fiscal Year", fy.name) - fy_companies = [row.company for row in doc.companies] - - # Add company if not already present - if company_name not in fy_companies: - doc.append("companies", {"company": company_name}) - doc.save(ignore_permissions=True) - except Exception as exc: - frappe.log_error( - message=f"Failed to add company to Fiscal Year: {exc}", - title="Gate Entry Test Setup - Fiscal Year", - ) - # Don't re-raise - this is best-effort, but log for debugging - - -def _enable_all_roles_for_admin(): - """Enable all roles for Administrator user (like ERPNext does).""" - try: - from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to - - all_roles = set(frappe.db.get_values("Role", pluck="name")) - admin_roles = set( - frappe.db.get_values("Has Role", {"parent": "Administrator"}, fieldname="role", pluck="role") - ) - - if all_roles.difference(admin_roles): - add_all_roles_to("Administrator") - except Exception as exc: - frappe.log_error( - message=f"Failed to enable all roles for admin: {exc}", - title="Gate Entry Test Setup - Roles", - ) - - def set_default_settings_for_tests(): """Set default settings required for Gate Entry tests.""" # Set default groups (like ERPNext and india_compliance) @@ -219,84 +112,13 @@ def set_default_company_for_tests(): ) -def ensure_warehouses_exist(): - """Ensure default warehouses exist for the test company.""" - company_name = "Wind Power LLP" - company_abbr = "WP" - - if not frappe.db.exists("Company", company_name): - return - - try: - from frappe import _ - - # Reload company to trigger on_update which creates warehouses - company = frappe.get_doc("Company", company_name) - - # Check if any warehouse exists for this company - existing_warehouses = frappe.db.get_all( - "Warehouse", filters={"company": company_name}, fields=["name"], limit=1 - ) - - # If no warehouses exist, trigger company.on_update() to create default warehouses - if not existing_warehouses: - company.flags.ignore_validate = True - company.save(ignore_permissions=True) - - # Verify warehouses exist, create if missing - required_warehouses = [ - {"name": "Stores", "is_group": 0}, - {"name": "Finished Goods", "is_group": 0}, - {"name": "Work In Progress", "is_group": 0}, - {"name": "Goods In Transit", "is_group": 0, "warehouse_type": "Transit"}, - {"name": "Subcontractor", "is_group": 0}, - ] - - # Get parent warehouse (All Warehouses) - parent_warehouse = frappe.db.get_value( - "Warehouse", {"warehouse_name": "All Warehouses", "company": company_name}, "name" - ) +def add_companies_to_fiscal_year(data): + fy = get_fiscal_year(getdate(), as_dict=True) + doc = frappe.get_doc("Fiscal Year", fy.name) + fy_companies = [row.company for row in doc.companies] - if not parent_warehouse: - # Create parent warehouse first - parent_wh = frappe.get_doc( - { - "doctype": "Warehouse", - "warehouse_name": "All Warehouses", - "is_group": 1, - "company": company_name, - } - ) - parent_wh.flags.ignore_permissions = True - parent_wh.flags.ignore_mandatory = True - parent_wh.insert(ignore_permissions=True) - parent_warehouse = parent_wh.name - for wh_info in required_warehouses: - warehouse_full_name = f"{wh_info['name']} - {company_abbr}" - # Check by full name (with abbreviation) first - if not frappe.db.exists("Warehouse", warehouse_full_name): - # Also check by warehouse_name and company - if not frappe.db.exists( - "Warehouse", {"warehouse_name": wh_info["name"], "company": company_name} - ): - warehouse = frappe.get_doc( - { - "doctype": "Warehouse", - "warehouse_name": wh_info["name"], - "is_group": wh_info.get("is_group", 0), - "company": company_name, - "parent_warehouse": parent_warehouse, - "warehouse_type": wh_info.get("warehouse_type"), - } - ) - warehouse.flags.ignore_permissions = True - warehouse.flags.ignore_mandatory = True - warehouse.insert(ignore_permissions=True) + for company in data: + if (company_name := company["company_name"]) not in fy_companies: + doc.append("companies", {"company": company_name}) - except Exception as exc: - frappe.log_error( - message=f"Failed to ensure warehouses exist: {exc}", - title="Gate Entry Test Setup - Warehouses", - ) - # Re-raise to make test failures visible - raise + doc.save(ignore_permissions=True) From 0009077ce0797f224ef16f37902de4e65f10df7d Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 12:24:23 +0530 Subject: [PATCH 09/22] remove template --- gate_entry/tests/test_records.json | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/gate_entry/tests/test_records.json b/gate_entry/tests/test_records.json index f111bf6..e9e7ce4 100644 --- a/gate_entry/tests/test_records.json +++ b/gate_entry/tests/test_records.json @@ -63,12 +63,7 @@ "selling_cost_center": "Main - WP", "income_account": "Sales - WP" } - ], - "taxes": [ - { - "item_tax_template": "Nil-Rated - WP" - } - ] + ] }, { "doctype": "Item", @@ -97,12 +92,7 @@ "selling_cost_center": "Main - WP", "income_account": "Sales - WP" } - ], - "taxes": [ - { - "item_tax_template": "Nil-Rated - WP" - } - ] + ] }, { "doctype": "Item", @@ -131,12 +121,7 @@ "selling_cost_center": "Main - WP", "income_account": "Sales - WP" } - ], - "taxes": [ - { - "item_tax_template": "Nil-Rated - WP" - } - ] + ] } ], "Supplier": [ From 25a6961974f24629077d777c2f5409f72067308f Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 13:09:08 +0530 Subject: [PATCH 10/22] add ignore permission --- gate_entry/tests/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 4583a02..6eb1db0 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -37,7 +37,7 @@ def before_tests(): "email": "test@example.com", "password": "test", "chart_of_accounts": "Standard", - "company_gstin": "29MUMB22923F1D", + "company_gstin": "24AAQCA8719H1ZC", "default_gst_rate": "18.0", "enable_audit_trail": 0, } @@ -97,7 +97,7 @@ def set_default_company_for_tests(): # Set default company global_defaults = frappe.get_single("Global Defaults") global_defaults.default_company = company_name - global_defaults.save() + global_defaults.save(ignore_permissions=True) # Configure stock settings for the company frappe.db.set_value( From b99b71e50c8897027f88bae473344f2cb60a0064 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 13:16:44 +0530 Subject: [PATCH 11/22] remove before test --- gate_entry/tests/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 6eb1db0..6a0a44b 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -12,6 +12,7 @@ def before_tests(): + return """Set up test environment for Gate Entry module.""" frappe.clear_cache() From 614b7ae5fd632036c246f6ac2370e9fbfccf92c9 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 16:06:04 +0530 Subject: [PATCH 12/22] remove return --- gate_entry/tests/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 6a0a44b..6eb1db0 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -12,7 +12,6 @@ def before_tests(): - return """Set up test environment for Gate Entry module.""" frappe.clear_cache() From daaf40f8835280a69adc9837373a6eb8b22050ac Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 16:24:45 +0530 Subject: [PATCH 13/22] modify function --- gate_entry/tests/__init__.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 6eb1db0..8a5be08 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -93,23 +93,22 @@ def create_test_records(): def set_default_company_for_tests(): """Set default company and configure it for tests.""" company_name = "Wind Power LLP" - if frappe.db.exists("Company", company_name): - # Set default company - global_defaults = frappe.get_single("Global Defaults") - global_defaults.default_company = company_name - global_defaults.save(ignore_permissions=True) - - # Configure stock settings for the company - frappe.db.set_value( - "Company", - company_name, - { - "enable_perpetual_inventory": 1, - "default_inventory_account": "Stock In Hand - WP", - "stock_adjustment_account": "Stock Adjustment - WP", - "stock_received_but_not_billed": "Stock Received But Not Billed - WP", - }, - ) + # stock settings + frappe.db.set_value( + "Company", + company_name, + { + "enable_perpetual_inventory": 1, + "default_inventory_account": "Stock In Hand - WP", + "stock_adjustment_account": "Stock Adjustment - WP", + "stock_received_but_not_billed": "Stock Received But Not Billed - WP", + }, + ) + + # set default company + global_defaults = frappe.get_single("Global Defaults") + global_defaults.default_company = company_name + global_defaults.save() def add_companies_to_fiscal_year(data): From 832af679f61c67e33215515c1c1a98dfde214525 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 16:39:05 +0530 Subject: [PATCH 14/22] ensure warehouse exists --- gate_entry/tests/__init__.py | 117 ++++++++++++++++++++++++++++++----- 1 file changed, 101 insertions(+), 16 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 8a5be08..e38c2f5 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -43,6 +43,7 @@ def before_tests(): } ) set_default_settings_for_tests() + ensure_warehouses_exist() create_test_records() set_default_company_for_tests() frappe.db.commit() @@ -90,25 +91,109 @@ def create_test_records(): ) +def ensure_warehouses_exist(): + """Ensure default warehouses exist for the test company.""" + company_name = "Wind Power LLP" + company_abbr = "WP" + + if not frappe.db.exists("Company", company_name): + return + + try: + from frappe import _ + + # Reload company to trigger on_update which creates warehouses + company = frappe.get_doc("Company", company_name) + + # Check if any warehouse exists for this company + existing_warehouses = frappe.db.get_all( + "Warehouse", filters={"company": company_name}, fields=["name"], limit=1 + ) + + # If no warehouses exist, trigger company.on_update() to create default warehouses + if not existing_warehouses: + company.flags.ignore_validate = True + company.save(ignore_permissions=True) + + # Verify warehouses exist, create if missing + required_warehouses = [ + {"name": "Stores", "is_group": 0}, + {"name": "Finished Goods", "is_group": 0}, + {"name": "Work In Progress", "is_group": 0}, + {"name": "Goods In Transit", "is_group": 0, "warehouse_type": "Transit"}, + {"name": "Subcontractor", "is_group": 0}, + ] + + # Get parent warehouse (All Warehouses) + parent_warehouse = frappe.db.get_value( + "Warehouse", {"warehouse_name": "All Warehouses", "company": company_name}, "name" + ) + + if not parent_warehouse: + # Create parent warehouse first + parent_wh = frappe.get_doc( + { + "doctype": "Warehouse", + "warehouse_name": "All Warehouses", + "is_group": 1, + "company": company_name, + } + ) + parent_wh.flags.ignore_permissions = True + parent_wh.flags.ignore_mandatory = True + parent_wh.insert(ignore_permissions=True) + parent_warehouse = parent_wh.name + for wh_info in required_warehouses: + warehouse_full_name = f"{wh_info['name']} - {company_abbr}" + # Check by full name (with abbreviation) first + if not frappe.db.exists("Warehouse", warehouse_full_name): + # Also check by warehouse_name and company + if not frappe.db.exists( + "Warehouse", {"warehouse_name": wh_info["name"], "company": company_name} + ): + warehouse = frappe.get_doc( + { + "doctype": "Warehouse", + "warehouse_name": wh_info["name"], + "is_group": wh_info.get("is_group", 0), + "company": company_name, + "parent_warehouse": parent_warehouse, + "warehouse_type": wh_info.get("warehouse_type"), + } + ) + warehouse.flags.ignore_permissions = True + warehouse.flags.ignore_mandatory = True + warehouse.insert(ignore_permissions=True) + + except Exception as exc: + frappe.log_error( + message=f"Failed to ensure warehouses exist: {exc}", + title="Gate Entry Test Setup - Warehouses", + ) + # Re-raise to make test failures visible + raise + + def set_default_company_for_tests(): """Set default company and configure it for tests.""" company_name = "Wind Power LLP" - # stock settings - frappe.db.set_value( - "Company", - company_name, - { - "enable_perpetual_inventory": 1, - "default_inventory_account": "Stock In Hand - WP", - "stock_adjustment_account": "Stock Adjustment - WP", - "stock_received_but_not_billed": "Stock Received But Not Billed - WP", - }, - ) - - # set default company - global_defaults = frappe.get_single("Global Defaults") - global_defaults.default_company = company_name - global_defaults.save() + if frappe.db.exists("Company", company_name): + # stock settings + frappe.db.set_value( + "Company", + company_name, + { + "enable_perpetual_inventory": 1, + "default_inventory_account": "Stock In Hand - WP", + "stock_adjustment_account": "Stock Adjustment - WP", + "stock_received_but_not_billed": "Stock Received But Not Billed - WP", + }, + ) + + # set default company + global_defaults = frappe.get_single("Global Defaults") + global_defaults.default_company = company_name + global_defaults.save(ignore_permissions=True) def add_companies_to_fiscal_year(data): From 5682c7e0ed920acd55a12838f3ba0fdecb027cd8 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 16:54:36 +0530 Subject: [PATCH 15/22] ensure test company exists --- gate_entry/tests/__init__.py | 41 +++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index e38c2f5..788bc54 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -15,6 +15,10 @@ def before_tests(): """Set up test environment for Gate Entry module.""" frappe.clear_cache() + # Ensure _Test Company exists (required by ERPNext and other test records) + # This must be created early as compat_preload_test_records_upfront may run before before_tests() + ensure_test_company_exists() + # Set up company if it doesn't exist company_name = "Wind Power LLP" if not frappe.db.a_row_exists("Company"): @@ -37,7 +41,7 @@ def before_tests(): "email": "test@example.com", "password": "test", "chart_of_accounts": "Standard", - "company_gstin": "24AAQCA8719H1ZC", + "company_gstin": "24AAQCA8719H1ZA", "default_gst_rate": "18.0", "enable_audit_trail": 0, } @@ -53,6 +57,41 @@ def before_tests(): frappe.enqueue = partial(frappe.enqueue, now=True) +def ensure_test_company_exists(): + """Ensure _Test Company exists for compatibility with ERPNext test records.""" + if not frappe.db.exists("Company", "_Test Company"): + try: + from frappe.desk.page.setup_wizard.setup_wizard import setup_complete + from frappe.utils.data import now_datetime + + current_year = now_datetime().year + setup_complete( + { + "currency": "INR", + "full_name": "Test User", + "company_name": "_Test Company", + "timezone": "Asia/Kolkata", + "company_abbr": "_TC", + "industry": "Manufacturing", + "country": "India", + "fy_start_date": f"{current_year}-01-01", + "fy_end_date": f"{current_year}-12-31", + "language": "English", + "company_tagline": "Testing", + "email": "test@example.com", + "password": "test", + "chart_of_accounts": "Standard", + } + ) + frappe.db.commit() + except Exception as exc: + # Log but don't fail - this is a compatibility measure + frappe.log_error( + message=f"Failed to create _Test Company: {exc}", + title="Gate Entry Test Setup - _Test Company", + ) + + def set_default_settings_for_tests(): """Set default settings required for Gate Entry tests.""" # Set default groups (like ERPNext and india_compliance) From c7cb89dc854666adb4f4bc3456d7d34458fdbb1e Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 17:18:42 +0530 Subject: [PATCH 16/22] change condition --- gate_entry/tests/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 788bc54..e7879b3 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -21,7 +21,7 @@ def before_tests(): # Set up company if it doesn't exist company_name = "Wind Power LLP" - if not frappe.db.a_row_exists("Company"): + if not frappe.db.exists("Company", company_name): today = getdate() year = today.year if today.month > 3 else today.year - 1 From 065a865311851da52fd5a47b658f5930dacc36ef Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 17:22:09 +0530 Subject: [PATCH 17/22] remove india compliance --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b8588e..ec4802a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -109,7 +109,6 @@ jobs: bench setup requirements --dev bench new-site --db-root-password root --admin-password admin test_site bench --site test_site install-app erpnext - bench --site test_site install-app india_compliance bench --site test_site install-app gate_entry bench build env: From 1e366f1fa578149454c62f52a00d003fd81b2024 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 17:29:25 +0530 Subject: [PATCH 18/22] change test email --- gate_entry/tests/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index e7879b3..90257ac 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -38,7 +38,7 @@ def before_tests(): "fy_end_date": f"{year + 1}-03-31", "language": "English", "company_tagline": "Testing", - "email": "test@example.com", + "email": "test-wp@example.com", "password": "test", "chart_of_accounts": "Standard", "company_gstin": "24AAQCA8719H1ZA", From a4634b0e5729f3ac89539f1d56537fd5d922bf91 Mon Sep 17 00:00:00 2001 From: Guru107 Date: Fri, 19 Dec 2025 17:38:33 +0530 Subject: [PATCH 19/22] make india compliance optional --- gate_entry/tests/__init__.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 90257ac..ff69dcd 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -105,9 +105,13 @@ def set_default_settings_for_tests(): if frappe.db.exists("UOM", "Nos"): frappe.db.set_single_value("Stock Settings", "stock_uom", "Nos") - # Enable Sandbox Mode in GST Settings - if frappe.db.exists("GST Settings"): - frappe.db.set_single_value("GST Settings", "sandbox_mode", 1) + # Enable Sandbox Mode in GST Settings (if india_compliance app is installed) + try: + if frappe.db.exists("GST Settings"): + frappe.db.set_single_value("GST Settings", "sandbox_mode", 1) + except frappe.exceptions.DoesNotExistError: + # GST Settings doctype doesn't exist (india_compliance app not installed) + pass def create_test_records(): From 180417bc978e29173051e0043bac6e210a8bf56f Mon Sep 17 00:00:00 2001 From: Guru107 Date: Sun, 21 Dec 2025 19:17:06 +0530 Subject: [PATCH 20/22] use proper exception --- gate_entry/tests/__init__.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index ff69dcd..1162113 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -106,12 +106,13 @@ def set_default_settings_for_tests(): frappe.db.set_single_value("Stock Settings", "stock_uom", "Nos") # Enable Sandbox Mode in GST Settings (if india_compliance app is installed) - try: - if frappe.db.exists("GST Settings"): + # Check if GST Settings doctype exists (India Compliance app might not be installed) + if frappe.db.exists("DocType", "GST Settings"): + try: frappe.db.set_single_value("GST Settings", "sandbox_mode", 1) - except frappe.exceptions.DoesNotExistError: - # GST Settings doctype doesn't exist (india_compliance app not installed) - pass + except Exception: + # Handle cases where GST Settings document doesn't exist or other errors + pass def create_test_records(): From ec676ae51992ca1137c1db8d2d200e2c691940df Mon Sep 17 00:00:00 2001 From: Guru107 Date: Sun, 21 Dec 2025 19:25:39 +0530 Subject: [PATCH 21/22] fix cursor comment --- gate_entry/tests/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gate_entry/tests/__init__.py b/gate_entry/tests/__init__.py index 1162113..4955fae 100644 --- a/gate_entry/tests/__init__.py +++ b/gate_entry/tests/__init__.py @@ -47,8 +47,8 @@ def before_tests(): } ) set_default_settings_for_tests() - ensure_warehouses_exist() create_test_records() + ensure_warehouses_exist() set_default_company_for_tests() frappe.db.commit() frappe.clear_cache() From d15f3ff873fc0961292c0c01e2c1d67d2b767f1a Mon Sep 17 00:00:00 2001 From: Guru107 Date: Sun, 21 Dec 2025 19:31:05 +0530 Subject: [PATCH 22/22] remove india compliance --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec4802a..3b3e739 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -104,7 +104,6 @@ jobs: working-directory: /home/runner/frappe-bench run: | bench get-app --branch "${{ env.FRAPPE_VERSION }}" erpnext - bench get-app --branch "${{ env.FRAPPE_VERSION }}" https://github.com/resilient-tech/india-compliance bench get-app gate_entry $GITHUB_WORKSPACE bench setup requirements --dev bench new-site --db-root-password root --admin-password admin test_site