diff --git a/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py b/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py
new file mode 100644
index 0000000..b3f6737
--- /dev/null
+++ b/erpnext/accounts/report/tax_withholding_details/test_tax_withholding_details.py
@@ -0,0 +1,111 @@
+# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
+# MIT License. See license.txt
+
+import frappe
+from frappe.tests.utils import FrappeTestCase
+from frappe.utils import today
+
+from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
+from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
+from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice
+from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
+from erpnext.accounts.doctype.tax_withholding_category.test_tax_withholding_category import (
+	create_tax_withholding_category,
+)
+from erpnext.accounts.report.tax_withholding_details.tax_withholding_details import execute
+from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
+from erpnext.accounts.utils import get_fiscal_year
+
+
+class TestTdsPayableMonthly(AccountsTestMixin, FrappeTestCase):
+	def setUp(self):
+		self.create_company()
+		self.clear_old_entries()
+		create_tax_accounts()
+		create_tcs_category()
+
+	def test_tax_withholding_for_customers(self):
+		si = create_sales_invoice(rate=1000)
+		pe = create_tcs_payment_entry()
+		filters = frappe._dict(
+			company="_Test Company", party_type="Customer", from_date=today(), to_date=today()
+		)
+		result = execute(filters)[1]
+		expected_values = [
+			[pe.name, "TCS", 0.075, 2550, 0.53, 2550.53],
+			[si.name, "TCS", 0.075, 1000, 0.52, 1000.52],
+		]
+		self.check_expected_values(result, expected_values)
+
+	def check_expected_values(self, result, expected_values):
+		for i in range(len(result)):
+			voucher = frappe._dict(result[i])
+			voucher_expected_values = expected_values[i]
+			self.assertEqual(voucher.ref_no, voucher_expected_values[0])
+			self.assertEqual(voucher.section_code, voucher_expected_values[1])
+			self.assertEqual(voucher.rate, voucher_expected_values[2])
+			self.assertEqual(voucher.base_total, voucher_expected_values[3])
+			self.assertAlmostEqual(voucher.tax_amount, voucher_expected_values[4])
+			self.assertAlmostEqual(voucher.grand_total, voucher_expected_values[5])
+
+	def tearDown(self):
+		self.clear_old_entries()
+
+
+def create_tax_accounts():
+	account_names = ["TCS", "TDS"]
+	for account in account_names:
+		frappe.get_doc(
+			{
+				"doctype": "Account",
+				"company": "_Test Company",
+				"account_name": account,
+				"parent_account": "Duties and Taxes - _TC",
+				"report_type": "Balance Sheet",
+				"root_type": "Liability",
+			}
+		).insert(ignore_if_duplicate=True)
+
+
+def create_tcs_category():
+	fiscal_year = get_fiscal_year(today(), company="_Test Company")
+	from_date = fiscal_year[1]
+	to_date = fiscal_year[2]
+
+	tax_category = create_tax_withholding_category(
+		category_name="TCS",
+		rate=0.075,
+		from_date=from_date,
+		to_date=to_date,
+		account="TCS - _TC",
+		cumulative_threshold=300,
+	)
+
+	customer = frappe.get_doc("Customer", "_Test Customer")
+	customer.tax_withholding_category = "TCS"
+	customer.save()
+
+
+def create_tcs_payment_entry():
+	payment_entry = create_payment_entry(
+		payment_type="Receive",
+		party_type="Customer",
+		party="_Test Customer",
+		paid_from="Debtors - _TC",
+		paid_to="Cash - _TC",
+		paid_amount=2550,
+	)
+
+	payment_entry.append(
+		"taxes",
+		{
+			"account_head": "TCS - _TC",
+			"charge_type": "Actual",
+			"tax_amount": 0.53,
+			"add_deduct_tax": "Add",
+			"description": "Test",
+			"cost_center": "Main - _TC",
+		},
+	)
+	payment_entry.submit()
+	return payment_entry
