From b5405a02cc1a27c6ee9d49d7d3de947a9c8c6667 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 26 Jun 2026 10:20:22 +0530 Subject: [PATCH 1/2] test: add coverage for Stock Qty vs Serial No Count report Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test_stock_qty_vs_serial_no_count.py | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py diff --git a/erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py b/erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py new file mode 100644 index 00000000000..0e796e105ea --- /dev/null +++ b/erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py @@ -0,0 +1,54 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe + +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.stock.report.stock_qty_vs_serial_no_count.stock_qty_vs_serial_no_count import execute +from erpnext.tests.utils import ERPNextTestSuite + + +class TestStockQtyVsSerialNoCount(ERPNextTestSuite): + def run_report(self, **extra): + filters = { + "company": "_Test Company", + "warehouse": "_Test Warehouse - _TC", + } + filters.update(extra) + return execute(frappe._dict(filters))[1] + + def test_serial_count_matches_stock_qty(self): + item = make_item( + properties={ + "is_stock_item": 1, + "has_serial_no": 1, + "serial_no_series": "SQS-.#####", + } + ).name + make_stock_entry( + item_code=item, + to_warehouse="_Test Warehouse - _TC", + qty=3, + rate=100, + posting_date="2026-06-01", + ) + + data = self.run_report() + row = next((entry for entry in data if entry["item_code"] == item), None) + + self.assertIsNotNone(row, "Serialized item should be present in the report") + self.assertEqual(row["total"], 3) + self.assertEqual(row["stock_qty"], 3) + self.assertEqual(row["difference"], 0) + + def test_warehouse_is_validated(self): + with self.assertRaises(frappe.ValidationError): + execute( + frappe._dict( + { + "company": "_Test Company", + "warehouse": "Non Existent Warehouse - XYZ", + } + ) + ) From 9cad192ccb0228662380209ea02af2cdc2522d0a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 26 Jun 2026 13:28:15 +0530 Subject: [PATCH 2/2] test: reuse BootStrapTestData master data to reduce runtime Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test_stock_qty_vs_serial_no_count.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py b/erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py index 0e796e105ea..021d7d0f3c6 100644 --- a/erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py +++ b/erpnext/stock/report/stock_qty_vs_serial_no_count/test_stock_qty_vs_serial_no_count.py @@ -3,7 +3,6 @@ import frappe -from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry from erpnext.stock.report.stock_qty_vs_serial_no_count.stock_qty_vs_serial_no_count import execute from erpnext.tests.utils import ERPNextTestSuite @@ -13,22 +12,16 @@ class TestStockQtyVsSerialNoCount(ERPNextTestSuite): def run_report(self, **extra): filters = { "company": "_Test Company", - "warehouse": "_Test Warehouse - _TC", + "warehouse": "Stores - _TC", } filters.update(extra) return execute(frappe._dict(filters))[1] def test_serial_count_matches_stock_qty(self): - item = make_item( - properties={ - "is_stock_item": 1, - "has_serial_no": 1, - "serial_no_series": "SQS-.#####", - } - ).name + item = "_Test Serialized Item With Series" make_stock_entry( item_code=item, - to_warehouse="_Test Warehouse - _TC", + to_warehouse="Stores - _TC", qty=3, rate=100, posting_date="2026-06-01", @@ -38,8 +31,9 @@ class TestStockQtyVsSerialNoCount(ERPNextTestSuite): row = next((entry for entry in data if entry["item_code"] == item), None) self.assertIsNotNone(row, "Serialized item should be present in the report") - self.assertEqual(row["total"], 3) - self.assertEqual(row["stock_qty"], 3) + # Serial No count should equal the stock qty in this warehouse, regardless of + # how many serials the shared master has accumulated across tests. + self.assertEqual(row["total"], row["stock_qty"]) self.assertEqual(row["difference"], 0) def test_warehouse_is_validated(self):