refactor: clean-up and commonify payroll entry test setups
diff --git a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
index 5c68bd3..47b9962 100644
--- a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
+++ b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
@@ -25,7 +25,6 @@
 	create_account,
 	make_deduction_salary_component,
 	make_earning_salary_component,
-	make_employee_salary_slip,
 	set_salary_component_account,
 )
 from erpnext.payroll.doctype.salary_structure.test_salary_structure import (
@@ -38,10 +37,6 @@
 
 class TestPayrollEntry(FrappeTestCase):
 	def setUp(self):
-		frappe.db.set_value(
-			"Company", erpnext.get_default_company(), "default_holiday_list", "_Test Holiday List"
-		)
-
 		for dt in [
 			"Salary Slip",
 			"Salary Component",
@@ -51,76 +46,79 @@
 			"Salary Structure Assignment",
 			"Payroll Employee Detail",
 			"Additional Salary",
+			"Loan",
 		]:
-			frappe.db.sql("delete from `tab%s`" % dt)
+			frappe.db.delete(dt)
 
 		make_earning_salary_component(setup=True, company_list=["_Test Company"])
 		make_deduction_salary_component(setup=True, test_tax=False, company_list=["_Test Company"])
 
+		frappe.db.set_value("Company", "_Test Company", "default_holiday_list", "_Test Holiday List")
 		frappe.db.set_value("Payroll Settings", None, "email_salary_slip_to_employee", 0)
 
-	def test_payroll_entry(self):  # pylint: disable=no-self-use
+		# set default payable account
+		default_account = frappe.db.get_value(
+			"Company", "_Test Company", "default_payroll_payable_account"
+		)
+		if not default_account or default_account != "_Test Payroll Payable - _TC":
+			create_account(
+				account_name="_Test Payroll Payable",
+				company="_Test Company",
+				parent_account="Current Liabilities - _TC",
+				account_type="Payable",
+			)
+			frappe.db.set_value(
+				"Company", "_Test Company", "default_payroll_payable_account", "_Test Payroll Payable - _TC"
+			)
+
+	def test_payroll_entry(self):
+		company = frappe.get_doc("Company", "_Test Company")
+		employee = frappe.db.get_value("Employee", {"company": "_Test Company"})
+		setup_salary_structure(employee, company)
+
+		dates = get_start_end_dates("Monthly", nowdate())
+		make_payroll_entry(
+			start_date=dates.start_date,
+			end_date=dates.end_date,
+			payable_account=company.default_payroll_payable_account,
+			currency=company.default_currency,
+			company=company.name,
+		)
+
+	def test_multi_currency_payroll_entry(self):
 		company = erpnext.get_default_company()
+		employee = make_employee("test_muti_currency_employee@payroll.com", company=company)
 		for data in frappe.get_all("Salary Component", fields=["name"]):
 			if not frappe.db.get_value(
 				"Salary Component Account", {"parent": data.name, "company": company}, "name"
 			):
-				set_salary_component_account(data.name)
+				get_salary_component_account(data.name)
 
-		employee = frappe.db.get_value("Employee", {"company": company})
 		company_doc = frappe.get_doc("Company", company)
-		make_salary_structure(
-			"_Test Salary Structure",
-			"Monthly",
-			employee,
-			company=company,
-			currency=company_doc.default_currency,
+		salary_structure = make_salary_structure(
+			"_Test Multi Currency Salary Structure", "Monthly", company=company, currency="USD"
 		)
-		dates = get_start_end_dates("Monthly", nowdate())
-		if not frappe.db.get_value(
-			"Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}
-		):
-			make_payroll_entry(
-				start_date=dates.start_date,
-				end_date=dates.end_date,
-				payable_account=company_doc.default_payroll_payable_account,
-				currency=company_doc.default_currency,
-			)
-
-	def test_multi_currency_payroll_entry(self):
-		company = frappe.get_doc("Company", "_Test Company")
-		employee = make_employee(
-			"test_muti_currency_employee@payroll.com", company=company.name, department="Accounts - _TC"
+		create_salary_structure_assignment(
+			employee, salary_structure.name, company=company, currency="USD"
 		)
-
-		for data in frappe.get_all("Salary Component", fields=["name"]):
-			if not frappe.db.get_value(
-				"Salary Component Account", {"parent": data.name, "company": company.name}, "name"
-			):
-				set_salary_component_account(data.name)
-
-		salary_struct = make_salary_structure(
-			"_Test Multi Currency Salary Structure",
-			"Monthly",
-			employee,
-			currency="USD",
-			company=company.name,
+		frappe.db.sql(
+			"""delete from `tabSalary Slip` where employee=%s""",
+			(frappe.db.get_value("Employee", {"user_id": "test_muti_currency_employee@payroll.com"})),
 		)
-
-		frappe.db.delete("Salary Slip", {"employee": employee})
+		salary_slip = get_salary_slip(
+			"test_muti_currency_employee@payroll.com", "Monthly", "_Test Multi Currency Salary Structure"
+		)
 		dates = get_start_end_dates("Monthly", nowdate())
 		payroll_entry = make_payroll_entry(
 			start_date=dates.start_date,
 			end_date=dates.end_date,
-			payable_account=company.default_payroll_payable_account,
+			payable_account=company_doc.default_payroll_payable_account,
 			currency="USD",
 			exchange_rate=70,
-			company=company.name,
 		)
 		payroll_entry.make_payment_entry()
 
-		salary_slip = frappe.db.get_value("Salary Slip", {"payroll_entry": payroll_entry.name})
-		salary_slip = frappe.get_doc("Salary Slip", salary_slip)
+		salary_slip.load_from_db()
 
 		payroll_je = salary_slip.journal_entry
 		if payroll_je:
@@ -143,22 +141,11 @@
 		self.assertEqual(salary_slip.base_net_pay, payment_entry[0].total_credit)
 
 	def test_payroll_entry_with_employee_cost_center(self):
-		for data in frappe.get_all("Salary Component", fields=["name"]):
-			if not frappe.db.get_value(
-				"Salary Component Account", {"parent": data.name, "company": "_Test Company"}, "name"
-			):
-				set_salary_component_account(data.name)
-
 		if not frappe.db.exists("Department", "cc - _TC"):
 			frappe.get_doc(
 				{"doctype": "Department", "department_name": "cc", "company": "_Test Company"}
 			).insert()
 
-		frappe.db.sql("""delete from `tabEmployee` where employee_name='test_employee1@example.com' """)
-		frappe.db.sql("""delete from `tabEmployee` where employee_name='test_employee2@example.com' """)
-		frappe.db.sql("""delete from `tabSalary Structure` where name='_Test Salary Structure 1' """)
-		frappe.db.sql("""delete from `tabSalary Structure` where name='_Test Salary Structure 2' """)
-
 		employee1 = make_employee(
 			"test_employee1@example.com",
 			payroll_cost_center="_Test Cost Center - _TC",
@@ -169,38 +156,15 @@
 			"test_employee2@example.com", department="cc - _TC", company="_Test Company"
 		)
 
-		if not frappe.db.exists("Account", "_Test Payroll Payable - _TC"):
-			create_account(
-				account_name="_Test Payroll Payable",
-				company="_Test Company",
-				parent_account="Current Liabilities - _TC",
-				account_type="Payable",
-			)
+		company = frappe.get_doc("Company", "_Test Company")
+		setup_salary_structure(employee1, company)
 
-		if (
-			not frappe.db.get_value("Company", "_Test Company", "default_payroll_payable_account")
-			or frappe.db.get_value("Company", "_Test Company", "default_payroll_payable_account")
-			!= "_Test Payroll Payable - _TC"
-		):
-			frappe.db.set_value(
-				"Company", "_Test Company", "default_payroll_payable_account", "_Test Payroll Payable - _TC"
-			)
-		currency = frappe.db.get_value("Company", "_Test Company", "default_currency")
-
-		make_salary_structure(
-			"_Test Salary Structure 1",
-			"Monthly",
-			employee1,
-			company="_Test Company",
-			currency=currency,
-			test_tax=False,
-		)
 		ss = make_salary_structure(
 			"_Test Salary Structure 2",
 			"Monthly",
 			employee2,
 			company="_Test Company",
-			currency=currency,
+			currency=company.default_currency,
 			test_tax=False,
 		)
 
@@ -219,42 +183,38 @@
 		ssa_doc.append(
 			"payroll_cost_centers", {"cost_center": "_Test Cost Center 2 - _TC", "percentage": 40}
 		)
-
 		ssa_doc.save()
 
 		dates = get_start_end_dates("Monthly", nowdate())
-		if not frappe.db.get_value(
-			"Salary Slip", {"start_date": dates.start_date, "end_date": dates.end_date}
-		):
-			pe = make_payroll_entry(
-				start_date=dates.start_date,
-				end_date=dates.end_date,
-				payable_account="_Test Payroll Payable - _TC",
-				currency=frappe.db.get_value("Company", "_Test Company", "default_currency"),
-				department="cc - _TC",
-				company="_Test Company",
-				payment_account="Cash - _TC",
-				cost_center="Main - _TC",
-			)
-			je = frappe.db.get_value("Salary Slip", {"payroll_entry": pe.name}, "journal_entry")
-			je_entries = frappe.db.sql(
-				"""
-				select account, cost_center, debit, credit
-				from `tabJournal Entry Account`
-				where parent=%s
-				order by account, cost_center
-			""",
-				je,
-			)
-			expected_je = (
-				("_Test Payroll Payable - _TC", "Main - _TC", 0.0, 155600.0),
-				("Salary - _TC", "_Test Cost Center - _TC", 124800.0, 0.0),
-				("Salary - _TC", "_Test Cost Center 2 - _TC", 31200.0, 0.0),
-				("Salary Deductions - _TC", "_Test Cost Center - _TC", 0.0, 320.0),
-				("Salary Deductions - _TC", "_Test Cost Center 2 - _TC", 0.0, 80.0),
-			)
+		pe = make_payroll_entry(
+			start_date=dates.start_date,
+			end_date=dates.end_date,
+			payable_account="_Test Payroll Payable - _TC",
+			currency=frappe.db.get_value("Company", "_Test Company", "default_currency"),
+			department="cc - _TC",
+			company="_Test Company",
+			payment_account="Cash - _TC",
+			cost_center="Main - _TC",
+		)
+		je = frappe.db.get_value("Salary Slip", {"payroll_entry": pe.name}, "journal_entry")
+		je_entries = frappe.db.sql(
+			"""
+			select account, cost_center, debit, credit
+			from `tabJournal Entry Account`
+			where parent=%s
+			order by account, cost_center
+		""",
+			je,
+		)
+		expected_je = (
+			("_Test Payroll Payable - _TC", "Main - _TC", 0.0, 155600.0),
+			("Salary - _TC", "_Test Cost Center - _TC", 124800.0, 0.0),
+			("Salary - _TC", "_Test Cost Center 2 - _TC", 31200.0, 0.0),
+			("Salary Deductions - _TC", "_Test Cost Center - _TC", 0.0, 320.0),
+			("Salary Deductions - _TC", "_Test Cost Center 2 - _TC", 0.0, 80.0),
+		)
 
-			self.assertEqual(je_entries, expected_je)
+		self.assertEqual(je_entries, expected_je)
 
 	def test_get_end_date(self):
 		self.assertEqual(get_end_date("2017-01-01", "monthly"), {"end_date": "2017-01-31"})
@@ -267,31 +227,22 @@
 		self.assertEqual(get_end_date("2017-02-15", "daily"), {"end_date": "2017-02-15"})
 
 	def test_loan(self):
-		branch = "Test Employee Branch"
-		applicant = make_employee("test_employee@loan.com", company="_Test Company")
 		company = "_Test Company"
-		holiday_list = make_holiday("test holiday for loan")
-
-		company_doc = frappe.get_doc("Company", company)
-		if not company_doc.default_payroll_payable_account:
-			company_doc.default_payroll_payable_account = frappe.db.get_value(
-				"Account", {"company": company, "root_type": "Liability", "account_type": ""}, "name"
-			)
-			company_doc.save()
+		branch = "Test Employee Branch"
 
 		if not frappe.db.exists("Branch", branch):
 			frappe.get_doc({"doctype": "Branch", "branch": branch}).insert()
+		holiday_list = make_holiday("test holiday for loan")
 
-		employee_doc = frappe.get_doc("Employee", applicant)
-		employee_doc.branch = branch
-		employee_doc.holiday_list = holiday_list
-		employee_doc.save()
+		applicant = make_employee(
+			"test_employee@loan.com", company="_Test Company", branch=branch, holiday_list=holiday_list
+		)
+		company_doc = frappe.get_doc("Company", company)
 
-		salary_structure = "Test Salary Structure for Loan"
 		make_salary_structure(
-			salary_structure,
+			"Test Salary Structure for Loan",
 			"Monthly",
-			employee=employee_doc.name,
+			employee=applicant,
 			company="_Test Company",
 			currency=company_doc.default_currency,
 		)
@@ -352,21 +303,11 @@
 				self.assertEqual(row.principal_amount, principal_amount)
 				self.assertEqual(row.total_payment, interest_amount + principal_amount)
 
-		if salary_slip.docstatus == 0:
-			frappe.delete_doc("Salary Slip", name)
-
 	def test_salary_slip_operation_queueing(self):
-		# setup
-		company = erpnext.get_default_company()
+		company = "_Test Company"
 		company_doc = frappe.get_doc("Company", company)
 		employee = frappe.db.get_value("Employee", {"company": company})
-		make_salary_structure(
-			"_Test Salary Structure",
-			"Monthly",
-			employee,
-			company=company,
-			currency=company_doc.default_currency,
-		)
+		setup_salary_structure(employee, company_doc)
 
 		# enqueue salary slip creation via payroll entry
 		# Payroll Entry status should change to Queued
@@ -376,6 +317,7 @@
 			end_date=dates.end_date,
 			payable_account=company_doc.default_payroll_payable_account,
 			currency=company_doc.default_currency,
+			company=company_doc.name,
 		)
 		frappe.flags.enqueue_payroll_entry = True
 		payroll_entry.create_salary_slips()
@@ -385,10 +327,10 @@
 		frappe.flags.enqueue_payroll_entry = False
 
 	def test_salary_slip_operation_failure(self):
-		# setup
-		company = erpnext.get_default_company()
+		company = "_Test Company"
 		company_doc = frappe.get_doc("Company", company)
 		employee = frappe.db.get_value("Employee", {"company": company})
+
 		salary_structure = make_salary_structure(
 			"_Test Salary Structure",
 			"Monthly",
@@ -410,6 +352,7 @@
 			end_date=dates.end_date,
 			payable_account=company_doc.default_payroll_payable_account,
 			currency=company_doc.default_currency,
+			company=company_doc.name,
 		)
 		payroll_entry.create_salary_slips()
 		payroll_entry.submit_salary_slips()
@@ -419,41 +362,30 @@
 		self.assertIsNotNone(payroll_entry.error_message)
 
 		# set accounts
-		for data in frappe.get_all("Salary Component", fields=["name"]):
-			if not frappe.db.get_value(
-				"Salary Component Account", {"parent": data.name, "company": company}, "name"
-			):
-				set_salary_component_account(data.name, company_list=[company])
+		for data in frappe.get_all("Salary Component", pluck="name"):
+			set_salary_component_account(data, company_list=[company])
 
 		# Payroll Entry successful, status should change to Submitted
 		payroll_entry.submit_salary_slips()
 		payroll_entry.reload()
+
 		self.assertEqual(payroll_entry.status, "Submitted")
 		self.assertEqual(payroll_entry.error_message, "")
 
 	def test_payroll_entry_status(self):
-		company = erpnext.get_default_company()
-		for data in frappe.get_all("Salary Component", fields=["name"]):
-			if not frappe.db.get_value(
-				"Salary Component Account", {"parent": data.name, "company": company}, "name"
-			):
-				set_salary_component_account(data.name)
-
-		employee = frappe.db.get_value("Employee", {"company": company})
+		company = "_Test Company"
 		company_doc = frappe.get_doc("Company", company)
-		make_salary_structure(
-			"_Test Salary Structure",
-			"Monthly",
-			employee,
-			company=company,
-			currency=company_doc.default_currency,
-		)
+		employee = frappe.db.get_value("Employee", {"company": company})
+
+		setup_salary_structure(employee, company_doc)
+
 		dates = get_start_end_dates("Monthly", nowdate())
 		payroll_entry = get_payroll_entry_data(
 			start_date=dates.start_date,
 			end_date=dates.end_date,
 			payable_account=company_doc.default_payroll_payable_account,
 			currency=company_doc.default_currency,
+			company=company_doc.name,
 		)
 		payroll_entry.submit()
 		self.assertEqual(payroll_entry.status, "Submitted")
@@ -532,3 +464,28 @@
 		).insert()
 
 	return holiday_list_name
+
+
+def get_salary_slip(user, period, salary_structure):
+	salary_slip = make_employee_salary_slip(user, period, salary_structure)
+	salary_slip.exchange_rate = 70
+	salary_slip.calculate_net_pay()
+	salary_slip.db_update()
+
+	return salary_slip
+
+
+def setup_salary_structure(employee, company_doc, currency=None, salary_structure=None):
+	for data in frappe.get_all("Salary Component", pluck="name"):
+		if not frappe.db.get_value(
+			"Salary Component Account", {"parent": data, "company": company_doc.name}, "name"
+		):
+			set_salary_component_account(data)
+
+	make_salary_structure(
+		salary_structure or "_Test Salary Structure",
+		"Monthly",
+		employee,
+		company=company_doc.name,
+		currency=(currency or company_doc.default_currency),
+	)