test: add test cases for `Packing Slip`
diff --git a/erpnext/stock/doctype/packing_slip/test_packing_slip.py b/erpnext/stock/doctype/packing_slip/test_packing_slip.py
index bc405b2..e8873e3 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