Compare commits

...

2 Commits

Author SHA1 Message Date
Nabin Hait
008742bdbe test: exercise every mandatory field in the Stock Reservation Entry check 2026-07-03 17:08:27 +05:30
Nabin Hait
7b2f38cd6f test: cover Stock Reservation Entry validations and helper 2026-07-03 16:23:52 +05:30

View File

@@ -957,3 +957,74 @@ def make_stock_reservation_entry(**args):
doc.submit()
return doc
class TestStockReservationEntryValidation(ERPNextTestSuite):
"""Field-level validations and pure helpers, exercised on the document directly so
they don't need the stock-ledger / reservation fixtures the integration tests build."""
def make_sre(self, **overrides):
doc = frappe.new_doc("Stock Reservation Entry")
doc.update(
{
"item_code": "_Test Item",
"warehouse": "_Test Warehouse - _TC",
"voucher_type": "Sales Order",
"voucher_no": "SO-TEST",
"voucher_detail_no": "SOI-TEST",
"available_qty": 10,
"voucher_qty": 10,
"stock_uom": "Nos",
"reserved_qty": 10,
"company": "_Test Company",
}
)
doc.update(overrides)
return doc
def test_all_mandatory_fields_are_required(self):
self.make_sre().validate_mandatory() # everything set -> passes
# clearing any single mandatory field is rejected
mandatory = [
"item_code",
"warehouse",
"voucher_type",
"voucher_no",
"voucher_detail_no",
"available_qty",
"voucher_qty",
"stock_uom",
"reserved_qty",
"company",
]
for field in mandatory:
with self.subTest(field=field):
self.assertRaises(frappe.ValidationError, self.make_sre(**{field: None}).validate_mandatory)
def test_amended_document_is_rejected(self):
self.assertRaises(frappe.ValidationError, self.make_sre(amended_from="SRE-0001").validate_amended_doc)
self.make_sre().validate_amended_doc() # not amended -> passes
def test_can_be_updated_guards(self):
self.make_sre().can_be_updated() # a fresh entry can be updated
self.assertRaises(frappe.ValidationError, self.make_sre(status="Delivered").can_be_updated)
self.assertRaises(frappe.ValidationError, self.make_sre(status="Partially Delivered").can_be_updated)
self.assertRaises(frappe.ValidationError, self.make_sre(from_voucher_type="Pick List").can_be_updated)
self.assertRaises(frappe.ValidationError, self.make_sre(delivered_qty=5).can_be_updated)
def test_group_warehouse_cannot_be_reserved(self):
group_wh = frappe.db.get_value("Warehouse", {"company": "_Test Company", "is_group": 1}, "name")
self.assertTrue(group_wh, "need a group warehouse for _Test Company")
self.assertRaises(frappe.ValidationError, self.make_sre(warehouse=group_wh).validate_group_warehouse)
self.make_sre().validate_group_warehouse() # leaf warehouse -> passes
def test_get_serial_batch_entries_aggregates(self):
doc = self.make_sre(reservation_based_on="Serial and Batch")
doc.append("sb_entries", {"serial_no": "SN1"})
doc.append("sb_entries", {"serial_no": "SN2"})
doc.append("sb_entries", {"batch_no": "B1", "qty": 5})
doc.append("sb_entries", {"batch_no": "B1", "qty": 3})
result = doc.get_serial_batch_entries()
self.assertEqual(result.serial_nos, ["SN1", "SN2"])
self.assertEqual(result.batches["B1"], 8)