From 168c24f8f0d09195cea02b0cb4314d21809b4845 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 24 Jun 2026 12:23:04 +0530 Subject: [PATCH 1/5] test: add coverage for Fixed Asset Register report The Fixed Asset Register report had no test file. Add tests for asset value (net purchase amount, reduced by opening accumulated depreciation), the status (In Location) and asset category filters, and group-by-asset-category value totals. --- .../test_fixed_asset_register.py | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py diff --git a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py new file mode 100644 index 00000000000..d419a839fee --- /dev/null +++ b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py @@ -0,0 +1,72 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.assets.doctype.asset.test_asset import create_asset, set_depreciation_settings_in_company +from erpnext.assets.report.fixed_asset_register.fixed_asset_register import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestFixedAssetRegister(ERPNextTestSuite): + def setUp(self): + set_depreciation_settings_in_company() + + def run_report(self, **extra): + filters = frappe._dict(company="_Test Company", **extra) + return execute(filters)[1] + + def test_asset_appears_with_purchase_value(self): + asset = create_asset( + item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True + ) + + row = next(row for row in self.run_report() if row["asset_id"] == asset.name) + self.assertEqual(row["net_purchase_amount"], 100000) + self.assertEqual(row["asset_value"], 100000) # no depreciation yet + self.assertEqual(row["asset_category"], "Computers") + + def test_asset_value_reduced_by_opening_depreciation(self): + asset = create_asset( + item_code="Macbook Pro", + net_purchase_amount=100000, + purchase_amount=100000, + opening_accumulated_depreciation=20000, + opening_number_of_booked_depreciations=2, + submit=True, + ) + + row = next(row for row in self.run_report() if row["asset_id"] == asset.name) + self.assertEqual(row["opening_accumulated_depreciation"], 20000) + self.assertEqual(row["asset_value"], 80000) # 100000 - 20000 + + def test_status_in_location_filter_shows_active_asset(self): + asset = create_asset( + item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True + ) + + ids = {row["asset_id"] for row in self.run_report(status="In Location")} + self.assertIn(asset.name, ids) + + def test_asset_category_filter(self): + asset = create_asset( + item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True + ) + + ids = {row["asset_id"] for row in self.run_report(asset_category="Computers")} + self.assertIn(asset.name, ids) + + def test_group_by_asset_category_sums_values(self): + create_asset(item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True) + create_asset( + item_code="Macbook Pro", + asset_name="Macbook Pro 2", + net_purchase_amount=50000, + purchase_amount=50000, + submit=True, + ) + + rows = self.run_report(group_by="Asset Category") + computers = next(row for row in rows if row["asset_category"] == "Computers") + self.assertEqual(computers["net_purchase_amount"], 150000) + self.assertEqual(computers["asset_value"], 150000) From f4413ebda3067c6ee79f42b68273d57abe12a032 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 25 Jun 2026 16:30:22 +0530 Subject: [PATCH 2/5] test: cover depreciation, sale, revaluation and capitalization in FA register Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test_fixed_asset_register.py | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py index d419a839fee..7d2c385da8e 100644 --- a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py +++ b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py @@ -3,7 +3,15 @@ import frappe +from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice +from erpnext.assets.doctype.asset.depreciation import post_depreciation_entries from erpnext.assets.doctype.asset.test_asset import create_asset, set_depreciation_settings_in_company +from erpnext.assets.doctype.asset_capitalization.test_asset_capitalization import ( + create_asset_capitalization, +) +from erpnext.assets.doctype.asset_value_adjustment.test_asset_value_adjustment import ( + make_asset_value_adjustment, +) from erpnext.assets.report.fixed_asset_register.fixed_asset_register import execute from erpnext.tests.utils import ERPNextTestSuite @@ -16,6 +24,9 @@ class TestFixedAssetRegister(ERPNextTestSuite): filters = frappe._dict(company="_Test Company", **extra) return execute(filters)[1] + def report_row(self, asset_name, **extra): + return next(row for row in self.run_report(**extra) if row["asset_id"] == asset_name) + def test_asset_appears_with_purchase_value(self): asset = create_asset( item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True @@ -70,3 +81,71 @@ class TestFixedAssetRegister(ERPNextTestSuite): computers = next(row for row in rows if row["asset_category"] == "Computers") self.assertEqual(computers["net_purchase_amount"], 150000) self.assertEqual(computers["asset_value"], 150000) + + def test_booked_depreciation_reduces_asset_value(self): + asset = create_asset( + item_code="Macbook Pro", + calculate_depreciation=1, + available_for_use_date="2019-12-31", + depreciation_start_date="2020-12-31", + frequency_of_depreciation=12, + total_number_of_depreciations=3, + expected_value_after_useful_life=10000, + net_purchase_amount=100000, + purchase_amount=100000, + submit=True, + ) + + # books one depreciation entry of (100000 - 10000) / 3 = 30000 + post_depreciation_entries(date="2021-01-01") + + row = self.report_row(asset.name) + self.assertEqual(row["depreciated_amount"], 30000) + self.assertEqual(row["asset_value"], 70000) # 100000 - 30000 + + def test_revaluation_adjusts_asset_value(self): + asset = create_asset( + item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True + ) + + # revalue the asset upwards by 20000 + make_asset_value_adjustment( + asset=asset.name, current_asset_value=100000, new_asset_value=120000 + ).submit() + + row = self.report_row(asset.name) + self.assertEqual(row["asset_value"], 120000) # 100000 + 20000 revaluation + + def test_sold_asset_hidden_from_in_location_and_shown_in_disposed(self): + asset = create_asset( + item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True + ) + + create_sales_invoice(item_code="Macbook Pro", asset=asset.name, qty=1, rate=80000) + self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold") + + self.assertNotIn(asset.name, {row["asset_id"] for row in self.run_report(status="In Location")}) + self.assertIn(asset.name, {row["asset_id"] for row in self.run_report(status="Disposed")}) + + def test_capitalized_asset_hidden_from_in_location_and_shown_in_disposed(self): + consumed_asset = create_asset( + asset_name="Consumed Asset", + net_purchase_amount=100000, + purchase_amount=100000, + submit=True, + ) + composite_asset = create_asset( + asset_name="Composite Asset", asset_type="Composite Asset", submit=False + ) + + create_asset_capitalization( + target_asset=composite_asset.name, consumed_asset=consumed_asset.name, submit=1 + ) + self.assertEqual(frappe.db.get_value("Asset", consumed_asset.name, "status"), "Capitalized") + + self.assertNotIn( + consumed_asset.name, {row["asset_id"] for row in self.run_report(status="In Location")} + ) + self.assertIn( + consumed_asset.name, {row["asset_id"] for row in self.run_report(status="Disposed")} + ) From 0a462f8d2f80e07bf497b51e19928c30c9248084 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 25 Jun 2026 16:46:02 +0530 Subject: [PATCH 3/5] test: cover combined depreciation and revaluation in FA register Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test_fixed_asset_register.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py index 7d2c385da8e..0479697bf6f 100644 --- a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py +++ b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py @@ -116,6 +116,32 @@ class TestFixedAssetRegister(ERPNextTestSuite): row = self.report_row(asset.name) self.assertEqual(row["asset_value"], 120000) # 100000 + 20000 revaluation + def test_depreciation_and_revaluation_together(self): + asset = create_asset( + item_code="Macbook Pro", + calculate_depreciation=1, + available_for_use_date="2019-12-31", + depreciation_start_date="2020-12-31", + frequency_of_depreciation=12, + total_number_of_depreciations=3, + expected_value_after_useful_life=10000, + net_purchase_amount=100000, + purchase_amount=100000, + submit=True, + ) + + # books one depreciation entry of (100000 - 10000) / 3 = 30000, leaving 70000 + post_depreciation_entries(date="2021-01-01") + + # revalue the depreciated asset down from 70000 to 60000 + make_asset_value_adjustment( + asset=asset.name, current_asset_value=70000, new_asset_value=60000 + ).submit() + + row = self.report_row(asset.name) + self.assertEqual(row["depreciated_amount"], 30000) + self.assertEqual(row["asset_value"], 60000) # 100000 - 30000 depreciation - 10000 revaluation + def test_sold_asset_hidden_from_in_location_and_shown_in_disposed(self): asset = create_asset( item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True From 78fd06048f0e91e012e79c29d1d2d87cf1058cba Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 25 Jun 2026 18:21:08 +0530 Subject: [PATCH 4/5] style: apply ruff formatting Co-Authored-By: Claude Opus 4.8 (1M context) --- .../report/fixed_asset_register/test_fixed_asset_register.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py index 71dc85c3265..2bfbdcda459 100644 --- a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py +++ b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py @@ -190,6 +190,4 @@ class TestFixedAssetRegister(AssetSetup): self.assertNotIn( consumed_asset.name, {row["asset_id"] for row in self.run_report(status="In Location")} ) - self.assertIn( - consumed_asset.name, {row["asset_id"] for row in self.run_report(status="Disposed")} - ) + self.assertIn(consumed_asset.name, {row["asset_id"] for row in self.run_report(status="Disposed")}) From 38385432f6bb67aee86c29b2b34f3d09555a60c9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 25 Jun 2026 18:22:58 +0530 Subject: [PATCH 5/5] test: assert group-by totals on delta to avoid shared-category leak Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test_fixed_asset_register.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py index 2bfbdcda459..6f03bd49d92 100644 --- a/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py +++ b/erpnext/assets/report/fixed_asset_register/test_fixed_asset_register.py @@ -86,6 +86,8 @@ class TestFixedAssetRegister(AssetSetup): self.assertIn(asset.name, ids) def test_group_by_asset_category_sums_values(self): + before_net, before_value = self.computers_group_totals() + create_asset(item_code="Macbook Pro", net_purchase_amount=100000, purchase_amount=100000, submit=True) create_asset( item_code="Macbook Pro", @@ -95,10 +97,17 @@ class TestFixedAssetRegister(AssetSetup): submit=True, ) - rows = self.run_report(group_by="Asset Category") - computers = next(row for row in rows if row["asset_category"] == "Computers") - self.assertEqual(computers["net_purchase_amount"], 150000) - self.assertEqual(computers["asset_value"], 150000) + after_net, after_value = self.computers_group_totals() + # assert on the delta so pre-existing Computers assets don't skew the totals + self.assertEqual(after_net - before_net, 150000) + self.assertEqual(after_value - before_value, 150000) + + def computers_group_totals(self): + row = next( + (r for r in self.run_report(group_by="Asset Category") if r["asset_category"] == "Computers"), + None, + ) + return (row["net_purchase_amount"], row["asset_value"]) if row else (0, 0) def test_booked_depreciation_reduces_asset_value(self): asset = create_asset(