diff --git a/erpnext/stock/doctype/packing_slip/test_packing_slip.py b/erpnext/stock/doctype/packing_slip/test_packing_slip.py index bc405b20995..e8873e38212 100644 --- a/erpnext/stock/doctype/packing_slip/test_packing_slip.py +++ b/erpnext/stock/doctype/packing_slip/test_packing_slip.py @@ -3,9 +3,109 @@ import unittest -# test_records = frappe.get_test_records('Packing Slip') +import frappe from frappe.tests.utils import FrappeTestCase +from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle +from erpnext.stock.doctype.delivery_note.delivery_note import make_packing_slip +from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note +from erpnext.stock.doctype.item.test_item import make_item -class TestPackingSlip(unittest.TestCase): - pass + +class TestPackingSlip(FrappeTestCase): + def test_packing_slip(self): + # Step - 1: Create a Product Bundle + items = create_items() + make_product_bundle(items[0], items[1:], 5) + + # Step - 2: Create a Delivery Note (Draft) with Product Bundle + dn = create_delivery_note( + item_code=items[0], + qty=2, + do_not_save=True, + ) + dn.append( + "items", + { + "item_code": items[1], + "warehouse": "_Test Warehouse - _TC", + "qty": 10, + }, + ) + dn.save() + + # Step - 3: Make a Packing Slip from Delivery Note for 4 Qty + ps1 = make_packing_slip(dn.name) + for item in ps1.items: + item.qty = 4 + ps1.save() + ps1.submit() + + # Test - 1: `Packed Qty` should be updated to 4 in Delivery Note Items and Packed Items. + dn.load_from_db() + for item in dn.items: + if not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code}): + self.assertEqual(item.packed_qty, 4) + + for item in dn.packed_items: + self.assertEqual(item.packed_qty, 4) + + # Step - 4: Make another Packing Slip from Delivery Note for 6 Qty + ps2 = make_packing_slip(dn.name) + ps2.save() + ps2.submit() + + # Test - 2: `Packed Qty` should be updated to 10 in Delivery Note Items and Packed Items. + dn.load_from_db() + for item in dn.items: + if not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code}): + self.assertEqual(item.packed_qty, 10) + + for item in dn.packed_items: + self.assertEqual(item.packed_qty, 10) + + # Step - 5: Cancel Packing Slip [1] + ps1.cancel() + + # Test - 3: `Packed Qty` should be updated to 4 in Delivery Note Items and Packed Items. + dn.load_from_db() + for item in dn.items: + if not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code}): + self.assertEqual(item.packed_qty, 6) + + for item in dn.packed_items: + self.assertEqual(item.packed_qty, 6) + + # Step - 6: Cancel Packing Slip [2] + ps2.cancel() + + # Test - 4: `Packed Qty` should be updated to 0 in Delivery Note Items and Packed Items. + dn.load_from_db() + for item in dn.items: + if not frappe.db.exists("Product Bundle", {"new_item_code": item.item_code}): + self.assertEqual(item.packed_qty, 0) + + for item in dn.packed_items: + self.assertEqual(item.packed_qty, 0) + + # Step - 7: Make Packing Slip for more Qty than Delivery Note + ps3 = make_packing_slip(dn.name) + ps3.items[0].qty = 20 + + # Test - 5: Should throw an ValidationError, as Packing Slip Qty is more than Delivery Note Qty + self.assertRaises(frappe.exceptions.ValidationError, ps3.save) + + +def create_items(): + items_properties = [ + {"is_stock_item": 0}, + {"is_stock_item": 1}, + {"is_stock_item": 1}, + {"is_stock_item": 1}, + ] + + items = [] + for properties in items_properties: + items.append(make_item(properties=properties).name) + + return items