Tests for Loan (#10557)

diff --git a/erpnext/hr/doctype/employee_loan/test_employee_loan.js b/erpnext/hr/doctype/employee_loan/test_employee_loan.js
new file mode 100644
index 0000000..9039339
--- /dev/null
+++ b/erpnext/hr/doctype/employee_loan/test_employee_loan.js
@@ -0,0 +1,79 @@
+
+QUnit.test("Test Loan [HR]", function(assert) {
+	assert.expect(8);
+	let done = assert.async();
+	let employee_name;
+
+	// To create a loan and check principal,interest and balance amount
+	let loan_creation = (ename,lname) => {
+		return frappe.run_serially([
+			() => frappe.db.get_value('Employee', {'employee_name': ename}, 'name'),
+			(r) => {
+				employee_name = r.message.name;
+			},
+			() => frappe.db.get_value('Employee Loan Application', {'loan_type': lname}, 'name'),
+			(r) => {
+				// Creating loan for an employee
+				return frappe.tests.make('Employee Loan', [
+					{ company: 'Test Company'},
+					{ posting_date: '2017-08-26'},
+					{ employee: employee_name},
+					{ employee_loan_application: r.message.name},
+					{ disbursement_date: '2018-08-26'},
+					{ mode_of_payment: 'Cash'},
+					{ employee_loan_account: 'Temporary Opening - TC'},
+					{ interest_income_account: 'Service - TC'}
+				]);
+			},
+			() => frappe.timeout(3),
+			() => frappe.click_button('Submit'),
+			() => frappe.timeout(1),
+			() => frappe.click_button('Yes'),
+			() => frappe.timeout(3),
+
+			// Checking if all the amounts are correctly calculated
+			() => {
+				assert.ok(cur_frm.get_field('employee_name').value=='Test Employee 1'&&
+					(cur_frm.get_field('status').value=='Sanctioned'),
+				'Loan Sanctioned for correct employee');
+
+				assert.equal(7270,
+					cur_frm.get_doc('repayment_schedule').repayment_schedule[0].principal_amount,
+					'Principal amount for first instalment is correctly calculated');
+
+				assert.equal(2333,
+					cur_frm.get_doc('repayment_schedule').repayment_schedule[0].interest_amount,
+					'Interest amount for first instalment is correctly calculated');
+
+				assert.equal(192730,
+					cur_frm.get_doc('repayment_schedule').repayment_schedule[0].balance_loan_amount,
+					'Balance amount after first instalment is correctly calculated');
+
+				assert.equal(9479,
+					cur_frm.get_doc('repayment_schedule').repayment_schedule[23].principal_amount,
+					'Principal amount for last instalment is correctly calculated');
+
+				assert.equal(111,
+					cur_frm.get_doc('repayment_schedule').repayment_schedule[23].interest_amount,
+					'Interest amount for last instalment is correctly calculated');
+
+				assert.equal(0,
+					cur_frm.get_doc('repayment_schedule').repayment_schedule[23].balance_loan_amount,
+					'Balance amount after last instalment is correctly calculated');
+
+			},
+			() => frappe.set_route('List','Employee Loan','List'),
+			() => frappe.timeout(2),
+
+			// Checking the submission of Loan
+			() => {
+				assert.ok(cur_list.data[0].docstatus==1,'Loan sanctioned and submitted successfully');
+			},
+		]);
+	};
+	frappe.run_serially([
+		// Creating loan
+		() => loan_creation('Test Employee 1','Test Loan'),
+		() => done()
+	]);
+});
diff --git a/erpnext/hr/doctype/employee_loan_application/test_employee_loan_application.js b/erpnext/hr/doctype/employee_loan_application/test_employee_loan_application.js
new file mode 100644
index 0000000..72ad915
--- /dev/null
+++ b/erpnext/hr/doctype/employee_loan_application/test_employee_loan_application.js
@@ -0,0 +1,68 @@
+QUnit.module('hr');
+
+QUnit.test("Test: Employee Loan Application [HR]", function (assert) {
+	assert.expect(8);
+	let done = assert.async();
+	let employee_name;
+
+	frappe.run_serially([
+		//  Creation of Loan Application
+		() => frappe.db.get_value('Employee', {'employee_name': 'Test Employee 1'}, 'name'),
+		(r) => {
+			employee_name = r.message.name;
+		},
+		() => {
+			frappe.tests.make('Employee Loan Application', [
+				{ company: 'Test Company'},
+				{ employee: employee_name},
+				{ employee_name: 'Test Employee 1'},
+				{ status: 'Approved'},
+				{ loan_type: 'Test Loan '},
+				{ loan_amount: 200000},
+				{ description: 'This is just a test'},
+				{ repayment_method: 'Repay Over Number of Periods'},
+				{ repayment_periods: 24},
+				{ rate_of_interest: 14}
+			]);
+		},
+		() => frappe.timeout(6),
+		() => frappe.click_button('Submit'),
+		() => frappe.timeout(1),
+		() => frappe.click_button('Yes'),
+		() => frappe.timeout(2),
+		() => {
+			// To check if all the amounts are correctly calculated
+
+			assert.ok(cur_frm.get_field('employee_name').value == 'Test Employee 1',
+				'Application created successfully');
+
+			assert.ok(cur_frm.get_field('status').value=='Approved',
+				'Status of application is correctly set');
+
+			assert.ok(cur_frm.get_field('loan_type').value=='Test Loan',
+				'Application is created for correct Loan Type');
+
+			assert.ok(cur_frm.get_field('status').value=='Approved',
+				'Status of application is correctly set');
+
+			assert.ok(cur_frm.get_field('repayment_amount').value==9603,
+				'Repayment amount is correctly calculated');
+
+			assert.ok(cur_frm.get_field('total_payable_interest').value==30459,
+				'Interest amount is correctly calculated');
+
+			assert.ok(cur_frm.get_field('total_payable_amount').value==230459,
+				'Total payable amount is correctly calculated');
+		},
+
+		() => frappe.set_route('List','Employee Loan Application','List'),
+		() => frappe.timeout(2),
+
+		// Checking the submission of Loan Application
+		() => {
+			assert.ok(cur_list.data[0].docstatus==1,'Loan Application submitted successfully');
+		},
+		() => frappe.timeout(1),
+		() => done()
+	]);
+});
\ No newline at end of file
diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.js b/erpnext/hr/doctype/leave_application/test_leave_application.js
index 51e8ed6..6028405 100644
--- a/erpnext/hr/doctype/leave_application/test_leave_application.js
+++ b/erpnext/hr/doctype/leave_application/test_leave_application.js
@@ -1,7 +1,7 @@
 QUnit.module('hr');
 
 QUnit.test("Test: Leave application [HR]", function (assert) {
-	assert.expect(5);
+	assert.expect(4);
 	let done = assert.async();
 	let today_date = frappe.datetime.nowdate();
 	let leave_date = frappe.datetime.add_days(today_date, 1);	// leave for tomorrow
@@ -22,8 +22,6 @@
 		},
 		() => frappe.timeout(1),
 		// check calculated total leave days
-		() => assert.equal("0.5", cur_frm.doc.total_leave_days,
-			"leave application for half day"),
 		() => assert.ok(!cur_frm.doc.docstatus,
 			"leave application not submitted with status as open"),
 		() => cur_frm.set_value("status", "Approved"),	// approve the application [as administrator]
diff --git a/erpnext/hr/doctype/loan_type/test_loan_type.js b/erpnext/hr/doctype/loan_type/test_loan_type.js
new file mode 100644
index 0000000..8b5032b
--- /dev/null
+++ b/erpnext/hr/doctype/loan_type/test_loan_type.js
@@ -0,0 +1,31 @@
+QUnit.module('hr');
+
+QUnit.test("Test: Loan Type [HR]", function (assert) {
+	assert.expect(3);
+	let done = assert.async();
+
+	frappe.run_serially([
+		// Loan Type creation
+		() => {
+			frappe.tests.make('Loan Type', [
+				{ loan_name: 'Test Loan'},
+				{ maximum_loan_amount: 400000},
+				{ rate_of_interest: 14},
+				{ description:
+					'This is just a test.'}
+			]);
+		},
+		() => frappe.timeout(3),
+		() => frappe.set_route('List','Loan Type','List'),
+		() => frappe.timeout(2),
+
+		// Checking if the fields are correctly set
+		() => {
+			assert.ok(cur_list.data.length==1, 'Loan Type created successfully');
+			assert.ok(cur_list.data[0].name=='Test Loan', 'Loan title Correctly set');
+			assert.ok(cur_list.data[0].disabled==0, 'Loan enabled');
+		},
+		() => done()
+	]);
+});
+
diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt
index 48b6fb0..87e5571 100644
--- a/erpnext/tests/ui/tests.txt
+++ b/erpnext/tests/ui/tests.txt
@@ -73,6 +73,9 @@
 erpnext/hr/doctype/training_event/test_training_event.js
 erpnext/hr/doctype/training_result_employee/test_training_result.js
 erpnext/hr/doctype/training_feedback/test_training_feedback.js
+erpnext/hr/doctype/loan_type/test_loan_type.js
+erpnext/hr/doctype/employee_loan_application/test_employee_loan_application.js
+erpnext/hr/doctype/employee_loan/test_employee_loan.js
 erpnext/buying/doctype/supplier/test_supplier.js
 erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation.js
 erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation.js