Merge pull request #28959 from deepeshgarg007/consolidated_balance_return_fix

fix: Error on viewing consolidated financial statement
diff --git a/dev-requirements.txt b/dev-requirements.txt
new file mode 100644
index 0000000..15545c0
--- /dev/null
+++ b/dev-requirements.txt
@@ -0,0 +1 @@
+hypothesis~=6.31.0
diff --git a/erpnext/accounts/doctype/account/tests/test_account.js b/erpnext/accounts/doctype/account/tests/test_account.js
deleted file mode 100644
index 039e33e..0000000
--- a/erpnext/accounts/doctype/account/tests/test_account.js
+++ /dev/null
@@ -1,29 +0,0 @@
-QUnit.module('accounts');
-
-QUnit.test("test account", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.set_route('Tree', 'Account'),
-		() => frappe.timeout(3),
-		() => frappe.click_button('Expand All'),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Debtors'),
-		() => frappe.click_button('Edit'),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok(cur_frm.doc.root_type=='Asset');
-			assert.ok(cur_frm.doc.report_type=='Balance Sheet');
-			assert.ok(cur_frm.doc.account_type=='Receivable');
-		},
-		() => frappe.click_button('Ledger'),
-		() => frappe.timeout(1),
-		() => {
-			// check if general ledger report shown
-			assert.deepEqual(frappe.get_route(), ['query-report', 'General Ledger']);
-			window.history.back();
-			return frappe.timeout(1);
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/account/tests/test_account_with_number.js b/erpnext/accounts/doctype/account/tests/test_account_with_number.js
deleted file mode 100644
index c03e278..0000000
--- a/erpnext/accounts/doctype/account/tests/test_account_with_number.js
+++ /dev/null
@@ -1,69 +0,0 @@
-QUnit.module('accounts');
-
-QUnit.test("test account with number", function(assert) {
-	assert.expect(7);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.set_route('Tree', 'Account'),
-		() => frappe.click_link('Income'),
-		() => frappe.click_button('Add Child'),
-		() => frappe.timeout(.5),
-		() => {
-			cur_dialog.fields_dict.account_name.$input.val("Test Income");
-			cur_dialog.fields_dict.account_number.$input.val("4010");
-		},
-		() => frappe.click_button('Create New'),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok($('a:contains("4010 - Test Income"):visible').length!=0, "Account created with number");
-		},
-		() => frappe.click_link('4010 - Test Income'),
-		() => frappe.click_button('Edit'),
-		() => frappe.timeout(.5),
-		() => frappe.click_button('Update Account Number'),
-		() => frappe.timeout(.5),
-		() => {
-			cur_dialog.fields_dict.account_number.$input.val("4020");
-		},
-		() => frappe.timeout(1),
-		() => cur_dialog.primary_action(),
-		() => frappe.timeout(1),
-		() => cur_frm.refresh_fields(),
-		() => frappe.timeout(.5),
-		() => {
-			var abbr = frappe.get_abbr(frappe.defaults.get_default("Company"));
-			var new_account = "4020 - Test Income - " + abbr;
-			assert.ok(cur_frm.doc.name==new_account, "Account renamed");
-			assert.ok(cur_frm.doc.account_name=="Test Income", "account name remained same");
-			assert.ok(cur_frm.doc.account_number=="4020", "Account number updated to 4020");
-		},
-		() => frappe.timeout(1),
-		() => frappe.click_button('Menu'),
-		() => frappe.click_link('Rename'),
-		() => frappe.timeout(.5),
-		() => {
-			cur_dialog.fields_dict.new_name.$input.val("4030 - Test Income");
-		},
-		() => frappe.timeout(.5),
-		() => frappe.click_button("Rename"),
-		() => frappe.timeout(2),
-		() => {
-			assert.ok(cur_frm.doc.account_name=="Test Income", "account name remained same");
-			assert.ok(cur_frm.doc.account_number=="4030", "Account number updated to 4030");
-		},
-		() => frappe.timeout(.5),
-		() => frappe.click_button('Chart of Accounts'),
-		() => frappe.timeout(.5),
-		() => frappe.click_button('Menu'),
-		() => frappe.click_link('Refresh'),
-		() => frappe.click_button('Expand All'),
-		() => frappe.click_link('4030 - Test Income'),
-		() => frappe.click_button('Delete'),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(.5),
-		() => {
-			assert.ok($('a:contains("4030 - Test Account"):visible').length==0, "Account deleted");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/account/tests/test_make_tax_account.js b/erpnext/accounts/doctype/account/tests/test_make_tax_account.js
deleted file mode 100644
index a0e09a1..0000000
--- a/erpnext/accounts/doctype/account/tests/test_make_tax_account.js
+++ /dev/null
@@ -1,46 +0,0 @@
-QUnit.module('accounts');
-QUnit.test("test account", assert => {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.set_route('Tree', 'Account'),
-		() => frappe.click_button('Expand All'),
-		() => frappe.click_link('Duties and Taxes - '+ frappe.get_abbr(frappe.defaults.get_default("Company"))),
-		() => {
-			if($('a:contains("CGST"):visible').length == 0){
-				return frappe.map_tax.make('CGST', 9);
-			}
-		},
-		() => {
-			if($('a:contains("SGST"):visible').length == 0){
-				return frappe.map_tax.make('SGST', 9);
-			}
-		},
-		() => {
-			if($('a:contains("IGST"):visible').length == 0){
-				return frappe.map_tax.make('IGST', 18);
-			}
-		},
-		() => {
-			assert.ok($('a:contains("CGST"):visible').length!=0, "CGST Checked");
-			assert.ok($('a:contains("SGST"):visible').length!=0, "SGST Checked");
-			assert.ok($('a:contains("IGST"):visible').length!=0, "IGST Checked");
-		},
-		() => done()
-	]);
-});
-
-
-frappe.map_tax = {
-	make:function(text,rate){
-		return frappe.run_serially([
-			() => frappe.click_button('Add Child'),
-			() => frappe.timeout(0.2),
-			() => cur_dialog.set_value('account_name',text),
-			() => cur_dialog.set_value('account_type','Tax'),
-			() => cur_dialog.set_value('tax_rate',rate),
-			() => cur_dialog.set_value('account_currency','INR'),
-			() => frappe.click_button('Create New'),
-		]);
-	}
-};
diff --git a/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.js b/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.js
deleted file mode 100644
index f9aa166..0000000
--- a/erpnext/accounts/doctype/accounts_settings/test_accounts_settings.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.module('accounts');
-
-QUnit.test("test: Accounts Settings doesn't allow negatives", function (assert) {
-	let done = assert.async();
-
-	assert.expect(2);
-
-	frappe.run_serially([
-		() => frappe.set_route('Form', 'Accounts Settings', 'Accounts Settings'),
-		() => frappe.timeout(2),
-		() => unchecked_if_checked(cur_frm, 'Allow Stale Exchange Rates', frappe.click_check),
-		() => cur_frm.set_value('stale_days', 0),
-		() => frappe.click_button('Save'),
-		() => frappe.timeout(2),
-		() => {
-			assert.ok(cur_dialog);
-		},
-		() => frappe.click_button('Close'),
-		() => cur_frm.set_value('stale_days', -1),
-		() => frappe.click_button('Save'),
-		() => frappe.timeout(2),
-		() => {
-			assert.ok(cur_dialog);
-		},
-		() => frappe.click_button('Close'),
-		() => done()
-	]);
-
-});
-
-const unchecked_if_checked = function(frm, field_name, fn){
-	if (frm.doc.allow_stale) {
-		return fn(field_name);
-	}
-};
diff --git a/erpnext/accounts/doctype/journal_entry/test_journal_entry.js b/erpnext/accounts/doctype/journal_entry/test_journal_entry.js
deleted file mode 100644
index 28ccd95..0000000
--- a/erpnext/accounts/doctype/journal_entry/test_journal_entry.js
+++ /dev/null
@@ -1,39 +0,0 @@
-QUnit.module('Journal Entry');
-
-QUnit.test("test journal entry", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Journal Entry', [
-				{posting_date:frappe.datetime.add_days(frappe.datetime.nowdate(), 0)},
-				{accounts: [
-					[
-						{'account':'Debtors - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-						{'party_type':'Customer'},
-						{'party':'Test Customer 1'},
-						{'credit_in_account_currency':1000},
-						{'is_advance':'Yes'},
-					],
-					[
-						{'account':'HDFC - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-						{'debit_in_account_currency':1000},
-					]
-				]},
-				{cheque_no:1234},
-				{cheque_date: frappe.datetime.add_days(frappe.datetime.nowdate(), -1)},
-				{user_remark: 'Test'},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.total_debit==1000, "total debit correct");
-			assert.ok(cur_frm.doc.total_credit==1000, "total credit correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json b/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json
index 040624f..5c19091 100644
--- a/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json
+++ b/erpnext/accounts/doctype/opening_invoice_creation_tool_item/opening_invoice_creation_tool_item.json
@@ -110,12 +110,13 @@
    "description": "Reference number of the invoice from the previous system",
    "fieldname": "invoice_number",
    "fieldtype": "Data",
+   "in_list_view": 1,
    "label": "Invoice Number"
   }
  ],
  "istable": 1,
  "links": [],
- "modified": "2021-12-13 18:15:41.295007",
+ "modified": "2021-12-17 19:25:06.053187",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Opening Invoice Creation Tool Item",
diff --git a/erpnext/accounts/doctype/payment_entry/tests/test_payment_against_invoice.js b/erpnext/accounts/doctype/payment_entry/tests/test_payment_against_invoice.js
deleted file mode 100644
index 4f27b74..0000000
--- a/erpnext/accounts/doctype/payment_entry/tests/test_payment_against_invoice.js
+++ /dev/null
@@ -1,55 +0,0 @@
-QUnit.module('Payment Entry');
-
-QUnit.test("test payment entry", function(assert) {
-	assert.expect(6);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 1},
-						{'rate': 101},
-					]
-				]}
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Make'),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Payment'),
-		() => frappe.timeout(2),
-		() => {
-			assert.equal(frappe.get_route()[1], 'Payment Entry',
-				'made payment entry');
-			assert.equal(cur_frm.doc.party, 'Test Customer 1',
-				'customer set in payment entry');
-			assert.equal(cur_frm.doc.paid_amount, 101,
-				'paid amount set in payment entry');
-			assert.equal(cur_frm.doc.references[0].allocated_amount, 101,
-				'amount allocated against sales invoice');
-		},
-		() => frappe.timeout(1),
-		() => cur_frm.set_value('paid_amount', 100),
-		() => frappe.timeout(1),
-		() => {
-			frappe.model.set_value("Payment Entry Reference", cur_frm.doc.references[0].name,
-				"allocated_amount", 101);
-		},
-		() => frappe.timeout(1),
-		() => frappe.click_button('Write Off Difference Amount'),
-		() => frappe.timeout(1),
-		() => {
-			assert.equal(cur_frm.doc.difference_amount, 0, 'difference amount is zero');
-			assert.equal(cur_frm.doc.deductions[0].amount, 1, 'Write off amount = 1');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/payment_entry/tests/test_payment_against_purchase_invoice.js b/erpnext/accounts/doctype/payment_entry/tests/test_payment_against_purchase_invoice.js
deleted file mode 100644
index e8db2c3..0000000
--- a/erpnext/accounts/doctype/payment_entry/tests/test_payment_against_purchase_invoice.js
+++ /dev/null
@@ -1,60 +0,0 @@
-QUnit.module('Payment Entry');
-
-QUnit.test("test payment entry", function(assert) {
-	assert.expect(7	);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Invoice', [
-				{supplier: 'Test Supplier'},
-				{bill_no: 'in1234'},
-				{items: [
-					[
-						{'qty': 2},
-						{'item_code': 'Test Product 1'},
-						{'rate':1000},
-					]
-				]},
-				{update_stock:1},
-				{supplier_address: 'Test1-Billing'},
-				{contact_person: 'Contact 3-Test Supplier'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is just a Test'}
-			]);
-		},
-
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Make'),
-		() => frappe.timeout(2),
-		() => frappe.click_link('Payment'),
-		() => frappe.timeout(3),
-		() => cur_frm.set_value('mode_of_payment','Cash'),
-		() => frappe.timeout(3),
-		() => {
-			assert.equal(frappe.get_route()[1], 'Payment Entry',
-				'made payment entry');
-			assert.equal(cur_frm.doc.party, 'Test Supplier',
-				'supplier set in payment entry');
-			assert.equal(cur_frm.doc.paid_amount, 2000,
-				'paid amount set in payment entry');
-			assert.equal(cur_frm.doc.references[0].allocated_amount, 2000,
-				'amount allocated against purchase invoice');
-			assert.equal(cur_frm.doc.references[0].bill_no, 'in1234',
-				'invoice number allocated against purchase invoice');
-			assert.equal(cur_frm.get_field('total_allocated_amount').value, 2000,
-				'correct amount allocated in Write Off');
-			assert.equal(cur_frm.get_field('unallocated_amount').value, 0,
-				'correct amount unallocated in Write Off');
-		},
-
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/payment_entry/tests/test_payment_entry.js b/erpnext/accounts/doctype/payment_entry/tests/test_payment_entry.js
deleted file mode 100644
index 34af79f..0000000
--- a/erpnext/accounts/doctype/payment_entry/tests/test_payment_entry.js
+++ /dev/null
@@ -1,28 +0,0 @@
-QUnit.module('Accounts');
-
-QUnit.test("test payment entry", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Payment Entry', [
-				{payment_type:'Receive'},
-				{mode_of_payment:'Cash'},
-				{party_type:'Customer'},
-				{party:'Test Customer 3'},
-				{paid_amount:675},
-				{reference_no:123},
-				{reference_date: frappe.datetime.add_days(frappe.datetime.nowdate(), 0)},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.total_allocated_amount==675, "Allocated AmountCorrect");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/payment_entry/tests/test_payment_entry_write_off.js b/erpnext/accounts/doctype/payment_entry/tests/test_payment_entry_write_off.js
deleted file mode 100644
index 8c7f6f4..0000000
--- a/erpnext/accounts/doctype/payment_entry/tests/test_payment_entry_write_off.js
+++ /dev/null
@@ -1,67 +0,0 @@
-QUnit.module('Payment Entry');
-
-QUnit.test("test payment entry", function(assert) {
-	assert.expect(8);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{company: 'For Testing'},
-				{currency: 'INR'},
-				{selling_price_list: '_Test Price List'},
-				{items: [
-					[
-						{'qty': 1},
-						{'item_code': 'Test Product 1'},
-					]
-				]}
-			]);
-		},
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1.5),
-		() => frappe.click_button('Close'),
-		() => frappe.timeout(0.5),
-		() => frappe.click_button('Make'),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Payment'),
-		() => frappe.timeout(2),
-		() => cur_frm.set_value("paid_to", "_Test Cash - FT"),
-		() => frappe.timeout(0.5),
-		() => {
-			assert.equal(frappe.get_route()[1], 'Payment Entry', 'made payment entry');
-			assert.equal(cur_frm.doc.party, 'Test Customer 1', 'customer set in payment entry');
-			assert.equal(cur_frm.doc.paid_from, 'Debtors - FT', 'customer account set in payment entry');
-			assert.equal(cur_frm.doc.paid_amount, 100, 'paid amount set in payment entry');
-			assert.equal(cur_frm.doc.references[0].allocated_amount, 100,
-				'amount allocated against sales invoice');
-		},
-		() => cur_frm.set_value('paid_amount', 95),
-		() => frappe.timeout(1),
-		() => {
-			frappe.model.set_value("Payment Entry Reference",
-				cur_frm.doc.references[0].name, "allocated_amount", 100);
-		},
-		() => frappe.timeout(.5),
-		() => {
-			assert.equal(cur_frm.doc.difference_amount, 5, 'difference amount is 5');
-		},
-		() => {
-			frappe.db.set_value("Company", "For Testing", "write_off_account", "_Test Write Off - FT");
-			frappe.timeout(1);
-			frappe.db.set_value("Company", "For Testing",
-				"exchange_gain_loss_account", "_Test Exchange Gain/Loss - FT");
-		},
-		() => frappe.timeout(1),
-		() => frappe.click_button('Write Off Difference Amount'),
-		() => frappe.timeout(2),
-		() => {
-			assert.equal(cur_frm.doc.difference_amount, 0, 'difference amount is zero');
-			assert.equal(cur_frm.doc.deductions[0].amount, 5, 'Write off amount = 5');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js
deleted file mode 100644
index 8279b59..0000000
--- a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule.js
+++ /dev/null
@@ -1,28 +0,0 @@
-QUnit.module('Pricing Rule');
-
-QUnit.test("test pricing rule", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Pricing Rule", [
-				{title: 'Test Pricing Rule'},
-				{item_code:'Test Product 2'},
-				{selling:1},
-				{applicable_for:'Customer'},
-				{customer:'Test Customer 3'},
-				{currency: frappe.defaults.get_default("currency")}
-				{min_qty:1},
-				{max_qty:20},
-				{valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-				{discount_percentage:10},
-				{for_price_list:'Standard Selling'}
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.item_code=='Test Product 2');
-			assert.ok(cur_frm.doc.customer=='Test Customer 3');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js
deleted file mode 100644
index 4a29956..0000000
--- a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_different_currency.js
+++ /dev/null
@@ -1,58 +0,0 @@
-QUnit.module('Pricing Rule');
-
-QUnit.test("test pricing rule with different currency", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Pricing Rule", [
-				{title: 'Test Pricing Rule 2'},
-				{apply_on: 'Item Code'},
-				{item_code:'Test Product 4'},
-				{selling:1},
-				{priority: 1},
-				{min_qty:1},
-				{max_qty:20},
-				{valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-				{margin_type: 'Amount'},
-				{margin_rate_or_amount: 20},
-				{rate_or_discount: 'Rate'},
-				{rate:200},
-				{currency:'USD'}
-
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(0.3),
-		() => {
-			assert.ok(cur_frm.doc.item_code=='Test Product 4');
-		},
-
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{currency: 'INR'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': "Test Product 4"}
-					]
-				]}
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(0.3),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].pricing_rule=='Test Pricing Rule 2', "Pricing rule correct");
-			// margin not applied because different currency in pricing rule
-			assert.ok(cur_frm.doc.items[0].margin_type==null, "Margin correct");
-		},
-		() => frappe.timeout(0.3),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js b/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js
deleted file mode 100644
index 601ff6b..0000000
--- a/erpnext/accounts/doctype/pricing_rule/tests/test_pricing_rule_with_same_currency.js
+++ /dev/null
@@ -1,56 +0,0 @@
-QUnit.module('Pricing Rule');
-
-QUnit.test("test pricing rule with same currency", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Pricing Rule", [
-				{title: 'Test Pricing Rule 1'},
-				{apply_on: 'Item Code'},
-				{item_code:'Test Product 4'},
-				{selling:1},
-				{min_qty:1},
-				{max_qty:20},
-				{valid_upto: frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-				{rate_or_discount: 'Rate'},
-				{rate:200},
-				{currency:'USD'}
-
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(0.3),
-		() => {
-			assert.ok(cur_frm.doc.item_code=='Test Product 4');
-		},
-
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{currency: 'USD'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': "Test Product 4"}
-					]
-				]}
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(0.3),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].pricing_rule=='Test Pricing Rule 1', "Pricing rule correct");
-			assert.ok(cur_frm.doc.items[0].price_list_rate==200, "Item rate correct");
-			// get_total
-			assert.ok(cur_frm.doc.total== 1000, "Total correct");
-		},
-		() => frappe.timeout(0.3),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js
deleted file mode 100644
index 94b3b9e..0000000
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.js
+++ /dev/null
@@ -1,74 +0,0 @@
-QUnit.module('Purchase Invoice');
-
-QUnit.test("test purchase invoice", function(assert) {
-	assert.expect(9);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Invoice', [
-				{supplier: 'Test Supplier'},
-				{bill_no: 'in123'},
-				{items: [
-					[
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-						{'rate':100},
-					]
-				]},
-				{update_stock:1},
-				{supplier_address: 'Test1-Billing'},
-				{contact_person: 'Contact 3-Test Supplier'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-			// grand_total Calculated
-			assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct");
-
-			assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct");
-			assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty");
-
-		},
-		() => {
-			let date = cur_frm.doc.due_date;
-			frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1));
-			frappe.timeout(0.5);
-			assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user');
-		},
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.set_form_values(cur_frm, [{'payment_terms_schedule': ''}]),
-		() => {
-			let date = cur_frm.doc.due_date;
-			frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1));
-			frappe.timeout(0.5);
-			assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user');
-		},
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.set_form_values(cur_frm, [{'payment_schedule': []}]),
-		() => {
-			let date = cur_frm.doc.due_date;
-			frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1));
-			frappe.timeout(0.5);
-			assert.ok(!cur_dialog, 'Message is not shown');
-		},
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js b/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js
deleted file mode 100644
index 10b05d0..0000000
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_template/test_purchase_taxes_and_charges_template.js
+++ /dev/null
@@ -1,28 +0,0 @@
-QUnit.module('Sales Taxes and Charges Template');
-
-QUnit.test("test sales taxes and charges template", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Taxes and Charges Template', [
-				{title: "TEST In State GST"},
-				{taxes:[
-					[
-						{charge_type:"On Net Total"},
-						{account_head:"CGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) }
-					],
-					[
-						{charge_type:"On Net Total"},
-						{account_head:"SGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) }
-					]
-				]}
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.title=='TEST In State GST');
-			assert.ok(cur_frm.doc.name=='TEST In State GST - FT');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js
deleted file mode 100644
index 1c052bd..0000000
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.js
+++ /dev/null
@@ -1,73 +0,0 @@
-QUnit.module('Sales Invoice');
-
-QUnit.test("test sales Invoice", function(assert) {
-	assert.expect(9);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					]
-				]},
-				{update_stock:1},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-			// grand_total Calculated
-			assert.ok(cur_frm.doc.grand_total==590, "Grand Total correct");
-
-			assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct");
-			assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty");
-
-		},
-		() => {
-			let date = cur_frm.doc.due_date;
-			frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1));
-			frappe.timeout(0.5);
-			assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user');
-		},
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.set_form_values(cur_frm, [{'payment_terms_schedule': ''}]),
-		() => {
-			let date = cur_frm.doc.due_date;
-			frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1));
-			frappe.timeout(0.5);
-			assert.ok(cur_dialog && cur_dialog.is_visible, 'Message is displayed to user');
-		},
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.set_form_values(cur_frm, [{'payment_schedule': []}]),
-		() => {
-			let date = cur_frm.doc.due_date;
-			frappe.tests.set_control('due_date', frappe.datetime.add_days(date, 1));
-			frappe.timeout(0.5);
-			assert.ok(!cur_dialog, 'Message is not shown');
-		},
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice.js
deleted file mode 100644
index 61d78e1..0000000
--- a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice.js
+++ /dev/null
@@ -1,42 +0,0 @@
-QUnit.module('Sales Invoice');
-
-QUnit.test("test sales Invoice", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					]
-				]},
-				{update_stock:1},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-			// grand_total Calculated
-			assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_margin.js b/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_margin.js
deleted file mode 100644
index cf2d0fb..0000000
--- a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_margin.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.module('Accounts');
-
-QUnit.test("test sales invoice with margin", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{selling_price_list: 'Test-Selling-USD'},
-				{currency: 'USD'},
-				{items: [
-					[
-						{'item_code': 'Test Product 4'},
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 1},
-						{'margin_type': 'Percentage'},
-						{'margin_rate_or_amount': 20}
-					]
-				]}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			assert.ok(cur_frm.doc.items[0].rate_with_margin == 240, "Margin rate correct");
-			assert.ok(cur_frm.doc.items[0].base_rate_with_margin == cur_frm.doc.conversion_rate * 240, "Base margin rate correct");
-			assert.ok(cur_frm.doc.total == 240, "Amount correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js b/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js
deleted file mode 100644
index 45d9a14..0000000
--- a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment.js
+++ /dev/null
@@ -1,56 +0,0 @@
-QUnit.module('Sales Invoice');
-
-QUnit.test("test sales Invoice with payment", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					]
-				]},
-				{update_stock:1},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// grand_total Calculated
-			assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(2),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.tests.click_button('Make'),
-		() => frappe.tests.click_link('Payment'),
-		() => frappe.timeout(0.2),
-		() => { cur_frm.set_value('mode_of_payment','Cash');},
-		() => { cur_frm.set_value('paid_to','Cash - '+frappe.get_abbr(frappe.defaults.get_default('Company')));},
-		() => {cur_frm.set_value('reference_no','TEST1234');},
-		() => {cur_frm.set_value('reference_date',frappe.datetime.add_days(frappe.datetime.nowdate(), 0));},
-		() => cur_frm.save(),
-		() => {
-			// get payment details
-			assert.ok(cur_frm.doc.paid_amount==590, "Paid Amount Correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment_request.js b/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment_request.js
deleted file mode 100644
index 0464e45..0000000
--- a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_payment_request.js
+++ /dev/null
@@ -1,51 +0,0 @@
-QUnit.module('Sales Invoice');
-
-QUnit.test("test sales Invoice with payment request", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					]
-				]},
-				{update_stock:1},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// grand_total Calculated
-			assert.ok(cur_frm.doc.grand_total==590, "Grad Total correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(2),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.tests.click_button('Make'),
-		() => frappe.tests.click_link('Payment Request'),
-		() => frappe.timeout(0.2),
-		() => { cur_frm.set_value('print_format','GST Tax Invoice');},
-		() => { cur_frm.set_value('email_to','test@gmail.com');},
-		() => cur_frm.save(),
-		() => {
-			// get payment details
-			assert.ok(cur_frm.doc.grand_total==590, "grand total Correct");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_serialize_item.js b/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_serialize_item.js
deleted file mode 100644
index af484d7..0000000
--- a/erpnext/accounts/doctype/sales_invoice/tests/test_sales_invoice_with_serialize_item.js
+++ /dev/null
@@ -1,44 +0,0 @@
-QUnit.module('Sales Invoice');
-
-QUnit.test("test sales Invoice with serialize item", function(assert) {
-	assert.expect(5);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Invoice', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'qty': 2},
-						{'item_code': 'Test Product 4'},
-					]
-				]},
-				{update_stock:1},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-			// get batch number
-			assert.ok(cur_frm.doc.items[0].batch_no=='TEST-BATCH-001', " Batch Details correct");
-			// grand_total Calculated
-			assert.ok(cur_frm.doc.grand_total==218, "Grad Total correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js b/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js
deleted file mode 100644
index 8cd42f6..0000000
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_template/test_sales_taxes_and_charges_template.js
+++ /dev/null
@@ -1,28 +0,0 @@
-QUnit.module('Sales Taxes and Charges Template');
-
-QUnit.test("test sales taxes and charges template", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Taxes and Charges Template', [
-				{title: "TEST In State GST"},
-				{taxes:[
-					[
-						{charge_type:"On Net Total"},
-						{account_head:"CGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) }
-					],
-					[
-						{charge_type:"On Net Total"},
-						{account_head:"SGST - "+frappe.get_abbr(frappe.defaults.get_default("Company")) }
-					]
-				]}
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.title=='TEST In State GST');
-			assert.ok(cur_frm.doc.name=='TEST In State GST - FT');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js b/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js
deleted file mode 100644
index 63ea1bf..0000000
--- a/erpnext/accounts/doctype/shipping_rule/test_shipping_rule.js
+++ /dev/null
@@ -1,36 +0,0 @@
-QUnit.module('Shipping Rule');
-
-QUnit.test("test Shipping Rule", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Shipping Rule", [
-				{label: "Next Day Shipping"},
-				{shipping_rule_type: "Selling"},
-				{calculate_based_on: 'Net Total'},
-				{conditions:[
-					[
-						{from_value:1},
-						{to_value:200},
-						{shipping_amount:100}
-					],
-					[
-						{from_value:201},
-						{to_value:2000},
-						{shipping_amount:50}
-					],
-				]},
-				{countries:[
-					[
-						{country:'India'}
-					]
-				]},
-				{account:'Accounts Payable - '+frappe.get_abbr(frappe.defaults.get_default("Company"))},
-				{cost_center:'Main - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-			]);
-		},
-		() => {assert.ok(cur_frm.doc.name=='Next Day Shipping');},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/shipping_rule/tests/test_shipping_rule_for_buying.js b/erpnext/accounts/doctype/shipping_rule/tests/test_shipping_rule_for_buying.js
deleted file mode 100644
index f3668b8..0000000
--- a/erpnext/accounts/doctype/shipping_rule/tests/test_shipping_rule_for_buying.js
+++ /dev/null
@@ -1,36 +0,0 @@
-QUnit.module('Shipping Rule');
-
-QUnit.test("test Shipping Rule", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Shipping Rule", [
-				{label: "Two Day Shipping"},
-				{shipping_rule_type: "Buying"},
-				{fixed_shipping_amount: 0},
-				{conditions:[
-					[
-						{from_value:1},
-						{to_value:200},
-						{shipping_amount:100}
-					],
-					[
-						{from_value:201},
-						{to_value:3000},
-						{shipping_amount:200}
-					],
-				]},
-				{countries:[
-					[
-						{country:'India'}
-					]
-				]},
-				{account:'Accounts Payable - '+frappe.get_abbr(frappe.defaults.get_default("Company"))},
-				{cost_center:'Main - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-			]);
-		},
-		() => {assert.ok(cur_frm.doc.name=='Two Day Shipping');},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py
index 1dae87f..467d4a1 100644
--- a/erpnext/accounts/doctype/subscription/subscription.py
+++ b/erpnext/accounts/doctype/subscription/subscription.py
@@ -23,6 +23,7 @@
 	get_accounting_dimensions,
 )
 from erpnext.accounts.doctype.subscription_plan.subscription_plan import get_plan_rate
+from erpnext.accounts.party import get_party_account_currency
 
 
 class Subscription(Document):
@@ -355,6 +356,9 @@
 			if frappe.db.get_value('Supplier', self.party, 'tax_withholding_category'):
 				invoice.apply_tds = 1
 
+		### Add party currency to invoice
+		invoice.currency = get_party_account_currency(self.party_type, self.party, self.company)
+
 		## Add dimensions in invoice for subscription:
 		accounting_dimensions = get_accounting_dimensions()
 
diff --git a/erpnext/accounts/doctype/subscription/test_subscription.js b/erpnext/accounts/doctype/subscription/test_subscription.js
deleted file mode 100644
index 2872a21..0000000
--- a/erpnext/accounts/doctype/subscription/test_subscription.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Subscription", function (assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		// insert a new Subscription
-		() => {
-			return frappe.tests.make("Subscription", [
-				{reference_doctype: 'Sales Invoice'},
-				{reference_document: 'SINV-00004'},
-				{start_date: frappe.datetime.month_start()},
-				{end_date: frappe.datetime.month_end()},
-				{frequency: 'Weekly'}
-			]);
-		},
-		() => cur_frm.savesubmit(),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(2),
-		() => {
-			assert.ok(cur_frm.doc.frequency.includes("Weekly"), "Set frequency Weekly");
-			assert.ok(cur_frm.doc.reference_doctype.includes("Sales Invoice"), "Set base doctype Sales Invoice");
-			assert.equal(cur_frm.doc.docstatus, 1, "Submitted subscription");
-			assert.equal(cur_frm.doc.next_schedule_date,
-				frappe.datetime.add_days(frappe.datetime.get_today(), 7),  "Set schedule date");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/accounts/doctype/subscription/test_subscription.py b/erpnext/accounts/doctype/subscription/test_subscription.py
index 9dd370b..6f67bc5 100644
--- a/erpnext/accounts/doctype/subscription/test_subscription.py
+++ b/erpnext/accounts/doctype/subscription/test_subscription.py
@@ -60,15 +60,38 @@
 		plan.billing_interval_count = 3
 		plan.insert()
 
+	if not frappe.db.exists('Subscription Plan', '_Test Plan Multicurrency'):
+		plan = frappe.new_doc('Subscription Plan')
+		plan.plan_name = '_Test Plan Multicurrency'
+		plan.item = '_Test Non Stock Item'
+		plan.price_determination = "Fixed Rate"
+		plan.cost = 50
+		plan.currency = 'USD'
+		plan.billing_interval = 'Month'
+		plan.billing_interval_count = 1
+		plan.insert()
+
+def create_parties():
 	if not frappe.db.exists('Supplier', '_Test Supplier'):
 		supplier = frappe.new_doc('Supplier')
 		supplier.supplier_name = '_Test Supplier'
 		supplier.supplier_group = 'All Supplier Groups'
 		supplier.insert()
 
+	if not frappe.db.exists('Customer', '_Test Subscription Customer'):
+		customer = frappe.new_doc('Customer')
+		customer.customer_name = '_Test Subscription Customer'
+		customer.billing_currency = 'USD'
+		customer.append('accounts', {
+			'company': '_Test Company',
+			'account': '_Test Receivable USD - _TC'
+		})
+		customer.insert()
+
 class TestSubscription(unittest.TestCase):
 	def setUp(self):
 		create_plan()
+		create_parties()
 
 	def test_create_subscription_with_trial_with_correct_period(self):
 		subscription = frappe.new_doc('Subscription')
@@ -637,3 +660,22 @@
 
 		subscription.process()
 		self.assertEqual(len(subscription.invoices), 1)
+
+	def test_multicurrency_subscription(self):
+		subscription = frappe.new_doc('Subscription')
+		subscription.party_type = 'Customer'
+		subscription.party = '_Test Subscription Customer'
+		subscription.generate_invoice_at_period_start = 1
+		subscription.company = '_Test Company'
+		# select subscription start date as '2018-01-15'
+		subscription.start_date = '2018-01-01'
+		subscription.append('plans', {'plan': '_Test Plan Multicurrency', 'qty': 1})
+		subscription.save()
+
+		subscription.process()
+		self.assertEqual(len(subscription.invoices), 1)
+		self.assertEqual(subscription.status, 'Unpaid')
+
+		# Check the currency of the created invoice
+		currency = frappe.db.get_value('Sales Invoice', subscription.invoices[0].invoice, 'currency')
+		self.assertEqual(currency, 'USD')
\ No newline at end of file
diff --git a/erpnext/agriculture/doctype/crop/test_crop.js b/erpnext/agriculture/doctype/crop/test_crop.js
deleted file mode 100644
index 4055563..0000000
--- a/erpnext/agriculture/doctype/crop/test_crop.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Crop", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(2);
-
-	frappe.run_serially([
-		// insert a new Item
-		() => frappe.tests.make('Item', [
-			// values to be set
-			{item_code: 'Basil Seeds'},
-			{item_name: 'Basil Seeds'},
-			{item_group: 'Seed'}
-		]),
-		// insert a new Item
-		() => frappe.tests.make('Item', [
-			// values to be set
-			{item_code: 'Twigs'},
-			{item_name: 'Twigs'},
-			{item_group: 'By-product'}
-		]),
-		// insert a new Item
-		() => frappe.tests.make('Item', [
-			// values to be set
-			{item_code: 'Basil Leaves'},
-			{item_name: 'Basil Leaves'},
-			{item_group: 'Produce'}
-		]),
-		// insert a new Crop
-		() => frappe.tests.make('Crop', [
-			// values to be set
-			{title: 'Basil from seed'},
-			{crop_name: 'Basil'},
-			{scientific_name: 'Ocimum basilicum'},
-			{materials_required: [
-				[
-					{item_code: 'Basil Seeds'},
-					{qty: '25'},
-					{uom: 'Nos'},
-					{rate: '1'}
-				],
-				[
-					{item_code: 'Urea'},
-					{qty: '5'},
-					{uom: 'Kg'},
-					{rate: '10'}
-				]
-			]},
-			{byproducts: [
-				[
-					{item_code: 'Twigs'},
-					{qty: '25'},
-					{uom: 'Nos'},
-					{rate: '1'}
-				]
-			]},
-			{produce: [
-				[
-					{item_code: 'Basil Leaves'},
-					{qty: '100'},
-					{uom: 'Nos'},
-					{rate: '1'}
-				]
-			]},
-			{agriculture_task: [
-				[
-					{task_name: "Plough the field"},
-					{start_day: 1},
-					{end_day: 1},
-					{holiday_management: "Ignore holidays"}
-				],
-				[
-					{task_name: "Plant the seeds"},
-					{start_day: 2},
-					{end_day: 3},
-					{holiday_management: "Ignore holidays"}
-				],
-				[
-					{task_name: "Water the field"},
-					{start_day: 4},
-					{end_day: 4},
-					{holiday_management: "Ignore holidays"}
-				],
-				[
-					{task_name: "First harvest"},
-					{start_day: 8},
-					{end_day: 8},
-					{holiday_management: "Ignore holidays"}
-				],
-				[
-					{task_name: "Add the fertilizer"},
-					{start_day: 10},
-					{end_day: 12},
-					{holiday_management: "Ignore holidays"}
-				],
-				[
-					{task_name: "Final cut"},
-					{start_day: 15},
-					{end_day: 15},
-					{holiday_management: "Ignore holidays"}
-				]
-			]}
-		]),
-		// agriculture task list
-		() => {
-			assert.equal(cur_frm.doc.name, 'Basil from seed');
-			assert.equal(cur_frm.doc.period, 15);
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/agriculture/doctype/crop_cycle/test_crop_cycle.js b/erpnext/agriculture/doctype/crop_cycle/test_crop_cycle.js
deleted file mode 100644
index 87184da..0000000
--- a/erpnext/agriculture/doctype/crop_cycle/test_crop_cycle.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Crop Cycle", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(1);
-
-	frappe.run_serially([
-		// insert a new Crop Cycle
-		() => frappe.tests.make('Crop Cycle', [
-			// values to be set
-			{title: 'Basil from seed 2017'},
-			{detected_disease: [
-				[
-					{start_date: '2017-11-21'},
-					{disease: 'Aphids'}
-				]
-			]},
-			{linked_land_unit: [
-				[
-					{land_unit: 'Basil Farm'}
-				]
-			]},
-			{crop: 'Basil from seed'},
-			{start_date: '2017-11-11'},
-			{cycle_type: 'Less than a year'}
-		]),
-		() => assert.equal(cur_frm.doc.name, 'Basil from seed 2017'),
-		() => done()
-	]);
-});
diff --git a/erpnext/agriculture/doctype/disease/test_disease.js b/erpnext/agriculture/doctype/disease/test_disease.js
deleted file mode 100644
index 33f60c4..0000000
--- a/erpnext/agriculture/doctype/disease/test_disease.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Disease", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(1);
-
-	frappe.run_serially([
-		// insert a new Disease
-		() => frappe.tests.make('Disease', [
-			// values to be set
-			{common_name: 'Aphids'},
-			{scientific_name: 'Aphidoidea'},
-			{treatment_task: [
-				[
-					{task_name: "Survey and find the aphid locations"},
-					{start_day: 1},
-					{end_day: 2},
-					{holiday_management: "Ignore holidays"}
-				],
-				[
-					{task_name: "Apply Pesticides"},
-					{start_day: 3},
-					{end_day: 3},
-					{holiday_management: "Ignore holidays"}
-				]
-			]}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.treatment_period, 3);
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/agriculture/doctype/fertilizer/test_fertilizer.js b/erpnext/agriculture/doctype/fertilizer/test_fertilizer.js
deleted file mode 100644
index 5dd7313..0000000
--- a/erpnext/agriculture/doctype/fertilizer/test_fertilizer.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Fertilizer", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(1);
-
-	frappe.run_serially([
-		// insert a new Item
-		() => frappe.tests.make('Item', [
-			// values to be set
-			{item_code: 'Urea'},
-			{item_name: 'Urea'},
-			{item_group: 'Fertilizer'}
-		]),
-		// insert a new Fertilizer
-		() => frappe.tests.make('Fertilizer', [
-			// values to be set
-			{fertilizer_name: 'Urea'},
-			{item: 'Urea'}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.name, 'Urea');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/agriculture/doctype/soil_texture/test_soil_texture.js b/erpnext/agriculture/doctype/soil_texture/test_soil_texture.js
deleted file mode 100644
index d93f852..0000000
--- a/erpnext/agriculture/doctype/soil_texture/test_soil_texture.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Soil Texture", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(2);
-
-	frappe.run_serially([
-		// insert a new Soil Texture
-		() => frappe.tests.make('Soil Texture', [
-			// values to be set
-			{location: '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[72.882185,19.076395]}}]}'},
-			{collection_datetime: '2017-11-08'},
-			{clay_composition: 20},
-			{sand_composition: 30}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.silt_composition, 50);
-			assert.equal(cur_frm.doc.soil_type, 'Silt Loam');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/agriculture/doctype/water_analysis/test_water_analysis.js b/erpnext/agriculture/doctype/water_analysis/test_water_analysis.js
deleted file mode 100644
index bb01cb3..0000000
--- a/erpnext/agriculture/doctype/water_analysis/test_water_analysis.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Water Analysis", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(1);
-
-	frappe.run_serially([
-		// insert a new Water Analysis
-		() => frappe.tests.make('Water Analysis', [
-			// values to be set
-			{location: '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[72.882185,19.076395]}}]}'},
-			{collection_datetime: '2017-11-08 18:43:57'},
-			{laboratory_testing_datetime: '2017-11-10 18:43:57'}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.result_datetime, '2017-11-10 18:43:57');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order.js
deleted file mode 100644
index 012b061..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order.js
+++ /dev/null
@@ -1,80 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order", function(assert) {
-	assert.expect(16);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{currency: 'INR'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 2)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"rate": 100},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					],
-					[
-						{"item_code": 'Test Product 1'},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"qty": 2},
-						{"uom": 'Unit'},
-						{"rate": 100},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]},
-
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is a term.'}
-			]);
-		},
-
-		() => {
-			// Get supplier details
-			assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
-			assert.ok(cur_frm.doc.schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 1), "Schedule Date correct");
-			assert.ok(cur_frm.doc.contact_email == 'test@supplier.com', "Contact email correct");
-			// Get item details
-			assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 4', "Item name correct");
-			assert.ok(cur_frm.doc.items[0].description == 'Test Product 4', "Description correct");
-			assert.ok(cur_frm.doc.items[0].qty == 5, "Quantity correct");
-			assert.ok(cur_frm.doc.items[0].schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 2), "Schedule Date correct");
-
-			assert.ok(cur_frm.doc.items[1].item_name == 'Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.items[1].description == 'Test Product 1', "Description correct");
-			assert.ok(cur_frm.doc.items[1].qty == 2, "Quantity correct");
-			assert.ok(cur_frm.doc.items[1].schedule_date == cur_frm.doc.schedule_date, "Schedule Date correct");
-			// Calculate total
-			assert.ok(cur_frm.doc.total == 700, "Total correct");
-			// Get terms
-			assert.ok(cur_frm.doc.terms == 'This is a term.', "Terms correct");
-		},
-
-		() => cur_frm.print_doc(),
-		() => frappe.timeout(2),
-		() => {
-			assert.ok($('.btn-print-print').is(':visible'), "Print Format Available");
-			assert.ok($('div > div:nth-child(5) > div > div > table > tbody > tr > td:nth-child(4) > div').text().includes('Test Product 4'), "Print Preview Works");
-		},
-
-		() => cur_frm.print_doc(),
-		() => frappe.timeout(1),
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-
-		() => {
-			assert.ok(cur_frm.doc.status == 'To Receive and Bill', "Submitted successfully");
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_get_items.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_get_items.js
deleted file mode 100644
index bc3d767..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_get_items.js
+++ /dev/null
@@ -1,61 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order with get items", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{buying_price_list: 'Test-Buying-USD'},
-				{currency: 'USD'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]}
-			]);
-		},
-
-		() => {
-			assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
-		},
-
-		() => frappe.timeout(0.3),
-		() => frappe.click_button('Get items from'),
-		() => frappe.timeout(0.3),
-
-		() => frappe.click_link('Product Bundle'),
-		() => frappe.timeout(0.5),
-
-		() => cur_dialog.set_value('product_bundle', 'Computer'),
-		() => frappe.click_button('Get Items'),
-		() => frappe.timeout(1),
-
-		// Check if items are fetched from Product Bundle
-		() => {
-			assert.ok(cur_frm.doc.items[1].item_name == 'CPU', "Product bundle item 1 correct");
-			assert.ok(cur_frm.doc.items[2].item_name == 'Screen', "Product bundle item 2 correct");
-			assert.ok(cur_frm.doc.items[3].item_name == 'Keyboard', "Product bundle item 3 correct");
-		},
-
-		() => cur_frm.doc.items[1].warehouse = 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company")),
-		() => cur_frm.doc.items[2].warehouse = 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company")),
-		() => cur_frm.doc.items[3].warehouse = 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company")),
-
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_receipt.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_receipt.js
deleted file mode 100644
index daf8d6c..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_receipt.js
+++ /dev/null
@@ -1,74 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order receipt", function(assert) {
-	assert.expect(5);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{buying_price_list: 'Test-Buying-USD'},
-				{currency: 'USD'},
-				{items: [
-					[
-						{"item_code": 'Test Product 1'},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"rate": 100},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]},
-			]);
-		},
-
-		() => {
-
-			// Check supplier and item details
-			assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
-			assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.items[0].description == 'Test Product 1', "Description correct");
-			assert.ok(cur_frm.doc.items[0].qty == 5, "Quantity correct");
-
-		},
-
-		() => frappe.timeout(1),
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-
-		() => frappe.timeout(1.5),
-		() => frappe.click_button('Close'),
-		() => frappe.timeout(0.3),
-
-		// Make Purchase Receipt
-		() => frappe.click_button('Make'),
-		() => frappe.timeout(0.3),
-
-		() => frappe.click_link('Receipt'),
-		() => frappe.timeout(2),
-
-		() => cur_frm.save(),
-
-		// Save and submit Purchase Receipt
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-
-		// View Purchase order in Stock Ledger
-		() => frappe.click_button('View'),
-		() => frappe.timeout(0.3),
-
-		() => frappe.click_link('Stock Ledger'),
-		() => frappe.timeout(2),
-		() => {
-			assert.ok($('div.slick-cell.l2.r2 > a').text().includes('Test Product 1')
-				&& $('div.slick-cell.l9.r9 > div').text().includes(5), "Stock ledger entry correct");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_discount_on_grand_total.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_discount_on_grand_total.js
deleted file mode 100644
index 83eb295..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_discount_on_grand_total.js
+++ /dev/null
@@ -1,47 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order with discount on grand total", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{buying_price_list: 'Test-Buying-EUR'},
-				{currency: 'EUR'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"rate": 500 },
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]},
-				{apply_discount_on: 'Grand Total'},
-				{additional_discount_percentage: 10}
-			]);
-		},
-
-		() => frappe.timeout(1),
-
-		() => {
-			assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
-			assert.ok(cur_frm.doc.items[0].rate == 500, "Rate correct");
-			// Calculate total
-			assert.ok(cur_frm.doc.total == 2500, "Total correct");
-			// Calculate grand total after discount
-			assert.ok(cur_frm.doc.grand_total == 2250, "Grand total correct");
-		},
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_item_wise_discount.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_item_wise_discount.js
deleted file mode 100644
index a729dd9..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_item_wise_discount.js
+++ /dev/null
@@ -1,44 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order with item wise discount", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{buying_price_list: 'Test-Buying-EUR'},
-				{currency: 'EUR'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))},
-						{"discount_percentage": 20}
-					]
-				]}
-			]);
-		},
-
-		() => frappe.timeout(1),
-
-		() => {
-			assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
-			assert.ok(cur_frm.doc.items[0].discount_percentage == 20, "Discount correct");
-			// Calculate totals after discount
-			assert.ok(cur_frm.doc.total == 2000, "Total correct");
-			assert.ok(cur_frm.doc.grand_total == 2000, "Grand total correct");
-		},
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_multi_uom.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_multi_uom.js
deleted file mode 100644
index b605e76..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_multi_uom.js
+++ /dev/null
@@ -1,39 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order with multi UOM", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"rate": 100},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]}
-			]);
-		},
-
-		() => {
-			assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Supplier name correct");
-			assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 4', "Item name correct");
-			assert.ok(cur_frm.doc.items[0].uom == 'Unit', "Multi UOM correct");
-		},
-
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_shipping_rule.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_shipping_rule.js
deleted file mode 100644
index c258756..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_shipping_rule.js
+++ /dev/null
@@ -1,43 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order with shipping rule", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{buying_price_list: 'Test-Buying-USD'},
-				{currency: 'USD'},
-				{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"rate": 500 },
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]},
-
-				{shipping_rule:'Two Day Shipping'}
-			]);
-		},
-
-		() => {
-			// Check grand total
-			assert.ok(cur_frm.doc.total_taxes_and_charges == 200, "Taxes and charges correct");
-			assert.ok(cur_frm.doc.grand_total == 2700, "Grand total correct");
-		},
-
-		() => frappe.timeout(0.3),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_taxes_and_charges.js b/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_taxes_and_charges.js
deleted file mode 100644
index ccc383f..0000000
--- a/erpnext/buying/doctype/purchase_order/tests/test_purchase_order_with_taxes_and_charges.js
+++ /dev/null
@@ -1,44 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: purchase order with taxes and charges", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{is_subcontracted: 'No'},
-				{buying_price_list: 'Test-Buying-USD'},
-				{currency: 'USD'},
-				{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"rate": 500 },
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
-						{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]},
-
-				{taxes_and_charges: 'TEST In State GST - FT'}
-			]);
-		},
-
-		() => {
-			// Check taxes and calculate grand total
-			assert.ok(cur_frm.doc.taxes[1].account_head=='SGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), "Account Head abbr correct");
-			assert.ok(cur_frm.doc.total_taxes_and_charges == 225, "Taxes and charges correct");
-			assert.ok(cur_frm.doc.grand_total == 2725, "Grand total correct");
-		},
-
-		() => frappe.timeout(0.3),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation.js
deleted file mode 100644
index 75f85f8..0000000
--- a/erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation.js
+++ /dev/null
@@ -1,76 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: request_for_quotation", function(assert) {
-	assert.expect(14);
-	let done = assert.async();
-	let date;
-	frappe.run_serially([
-		() => {
-			date = frappe.datetime.add_days(frappe.datetime.now_date(), 10);
-			return frappe.tests.make('Request for Quotation', [
-				{transaction_date: date},
-				{suppliers: [
-					[
-						{"supplier": 'Test Supplier'},
-						{"email_id": 'test@supplier.com'}
-					]
-				]},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(),20)},
-						{"warehouse": 'All Warehouses - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]},
-				{message_for_supplier: 'Please supply the specified items at the best possible rates'},
-				{tc_name: 'Test Term 1'}
-			]);
-		},
-		() => frappe.timeout(3),
-		() => {
-			assert.ok(cur_frm.doc.transaction_date == date, "Date correct");
-			assert.ok(cur_frm.doc.company == cur_frm.doc.company, "Company correct");
-			assert.ok(cur_frm.doc.suppliers[0].supplier_name == 'Test Supplier', "Supplier name correct");
-			assert.ok(cur_frm.doc.suppliers[0].contact == 'Contact 3-Test Supplier', "Contact correct");
-			assert.ok(cur_frm.doc.suppliers[0].email_id == 'test@supplier.com', "Email id correct");
-			assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 4', "Item Name correct");
-			assert.ok(cur_frm.doc.items[0].warehouse == 'All Warehouses - '+frappe.get_abbr(frappe.defaults.get_default("Company")), "Warehouse correct");
-			assert.ok(cur_frm.doc.message_for_supplier == 'Please supply the specified items at the best possible rates', "Reply correct");
-			assert.ok(cur_frm.doc.tc_name == 'Test Term 1', "Term name correct");
-		},
-		() => frappe.timeout(3),
-		() => cur_frm.print_doc(),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok($('.btn-print-print').is(':visible'), "Print Format Available");
-			assert.ok($('.section-break+ .section-break .column-break:nth-child(1) .value').text().includes("Test Product 4"), "Print Preview Works");
-		},
-		() => cur_frm.print_doc(),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Get items from'),
-		() => frappe.timeout(0.3),
-		() => frappe.click_link('Material Request'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Get Items'),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok(cur_frm.doc.items[1].item_name == 'Test Product 1', "Getting items from material requests work");
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok(cur_frm.doc.docstatus == 1, "Quotation request submitted");
-		},
-		() => frappe.click_button('Send Supplier Emails'),
-		() => frappe.timeout(6),
-		() => {
-			assert.ok($('div.modal.fade.in > div.modal-dialog > div > div.modal-body.ui-front > div.msgprint').text().includes("Email sent to supplier Test Supplier"), "Send emails working");
-		},
-		() => frappe.click_button('Close'),
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation_for_status.js b/erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation_for_status.js
deleted file mode 100644
index f06c3f3..0000000
--- a/erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation_for_status.js
+++ /dev/null
@@ -1,128 +0,0 @@
-QUnit.module('buying');
-
-QUnit.test("Test: Request for Quotation", function (assert) {
-	assert.expect(5);
-	let done = assert.async();
-	let rfq_name = "";
-
-	frappe.run_serially([
-		// Go to RFQ list
-		() => frappe.set_route("List", "Request for Quotation"),
-		// Create a new RFQ
-		() => frappe.new_doc("Request for Quotation"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("transaction_date", "04-04-2017"),
-		() => cur_frm.set_value("company", "For Testing"),
-		// Add Suppliers
-		() => {
-			cur_frm.fields_dict.suppliers.grid.grid_rows[0].toggle_view();
-		},
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.fields_dict.suppliers.grid.grid_rows[0].doc.supplier = "_Test Supplier";
-			frappe.click_check('Send Email');
-			cur_frm.cur_grid.frm.script_manager.trigger('supplier');
-		},
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.cur_grid.toggle_view();
-		},
-		() => frappe.timeout(1),
-		() => frappe.click_button('Add Row',0),
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.fields_dict.suppliers.grid.grid_rows[1].toggle_view();
-		},
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.fields_dict.suppliers.grid.grid_rows[1].doc.supplier = "_Test Supplier 1";
-			frappe.click_check('Send Email');
-			cur_frm.cur_grid.frm.script_manager.trigger('supplier');
-		},
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.cur_grid.toggle_view();
-		},
-		() => frappe.timeout(1),
-		// Add Item
-		() => {
-			cur_frm.fields_dict.items.grid.grid_rows[0].toggle_view();
-		},
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.fields_dict.items.grid.grid_rows[0].doc.item_code = "_Test Item";
-			frappe.set_control('item_code',"_Test Item");
-			frappe.set_control('qty',5);
-			frappe.set_control('schedule_date', "05-05-2017");
-			cur_frm.cur_grid.frm.script_manager.trigger('supplier');
-		},
-		() => frappe.timeout(2),
-		() => {
-			cur_frm.cur_grid.toggle_view();
-		},
-		() => frappe.timeout(2),
-		() => {
-			cur_frm.fields_dict.items.grid.grid_rows[0].doc.warehouse = "_Test Warehouse - FT";
-		},
-		() => frappe.click_button('Save'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Submit'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Menu'),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Reload'),
-		() => frappe.timeout(1),
-		() => {
-			assert.equal(cur_frm.doc.docstatus, 1);
-			rfq_name = cur_frm.doc.name;
-			assert.ok(cur_frm.fields_dict.suppliers.grid.grid_rows[0].doc.quote_status == "Pending");
-			assert.ok(cur_frm.fields_dict.suppliers.grid.grid_rows[1].doc.quote_status == "Pending");
-		},
-		() => {
-			cur_frm.fields_dict.suppliers.grid.grid_rows[0].toggle_view();
-		},
-		() => frappe.timeout(1),
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.cur_grid.toggle_view();
-		},
-		() => frappe.click_button('Update'),
-		() => frappe.timeout(1),
-
-		() => frappe.click_button('Supplier Quotation'),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Make'),
-		() => frappe.timeout(1),
-		() => {
-			frappe.set_control('supplier',"_Test Supplier 1");
-		},
-		() => frappe.timeout(1),
-		() => frappe.click_button('Make Supplier Quotation'),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("company", "For Testing"),
-		() => cur_frm.fields_dict.items.grid.grid_rows[0].doc.rate = 4.99,
-		() => frappe.timeout(1),
-		() => frappe.click_button('Save'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Submit'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => frappe.set_route("List", "Request for Quotation"),
-		() => frappe.timeout(2),
-		() => frappe.set_route("List", "Request for Quotation"),
-		() => frappe.timeout(2),
-		() => frappe.click_link(rfq_name),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Menu'),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Reload'),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok(cur_frm.fields_dict.suppliers.grid.grid_rows[1].doc.quote_status == "Received");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/supplier/test_supplier.js b/erpnext/buying/doctype/supplier/test_supplier.js
deleted file mode 100644
index eaa4d09..0000000
--- a/erpnext/buying/doctype/supplier/test_supplier.js
+++ /dev/null
@@ -1,77 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: supplier", function(assert) {
-	assert.expect(6);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Supplier', [
-				{supplier_name: 'Test Supplier'},
-				{supplier_group: 'Hardware'},
-				{country: 'India'},
-				{default_currency: 'INR'},
-				{accounts: [
-					[
-						{'company': "For Testing"},
-						{'account': "Creditors - FT"}
-					]]
-				}
-			]);
-		},
-		() => frappe.timeout(1),
-		() => frappe.click_button('New Address'),
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{address_title:"Test3"},
-				{address_type: "Billing"},
-				{address_line1: "Billing Street 3"},
-				{city: "Billing City 3"},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => frappe.click_button('New Address'),
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{address_title:"Test3"},
-				{address_type: "Shipping"},
-				{address_line1: "Shipping Street 3"},
-				{city: "Shipping City 3"},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => frappe.click_button('New Address'),
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{address_title:"Test3"},
-				{address_type: "Warehouse"},
-				{address_line1: "Warehouse Street 3"},
-				{city: "Warehouse City 3"},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => frappe.click_button('New Contact'),
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{first_name: "Contact 3"},
-				{email_id: "test@supplier.com"}
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => frappe.set_route('Form', 'Supplier', 'Test Supplier'),
-		() => frappe.timeout(0.3),
-
-		() => {
-			assert.ok(cur_frm.doc.supplier_name == 'Test Supplier', "Name correct");
-			assert.ok(cur_frm.doc.supplier_group == 'Hardware', "Type correct");
-			assert.ok(cur_frm.doc.default_currency == 'INR', "Currency correct");
-			assert.ok(cur_frm.doc.accounts[0].account == 'Creditors - '+frappe.get_abbr('For Testing'), " Account Head abbr correct");
-			assert.ok($('.address-box:nth-child(3) p').text().includes('Shipping City 3'), "Address correct");
-			assert.ok($('.col-sm-6+ .col-sm-6 .h6').text().includes('Contact 3'), "Contact correct");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation.js
deleted file mode 100644
index 20fb430..0000000
--- a/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation.js
+++ /dev/null
@@ -1,74 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: supplier quotation", function(assert) {
-	assert.expect(11);
-	let done = assert.async();
-	let date;
-
-	frappe.run_serially([
-		() => {
-			date = frappe.datetime.add_days(frappe.datetime.now_date(), 10);
-			return frappe.tests.make('Supplier Quotation', [
-				{supplier: 'Test Supplier'},
-				{transaction_date: date},
-				{currency: 'INR'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"rate": 200},
-						{"warehouse": 'All Warehouses - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-					]
-				]},
-				{apply_discount_on: 'Grand Total'},
-				{additional_discount_percentage: 10},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is a term'}
-			]);
-		},
-		() => frappe.timeout(3),
-		() => {
-			// Get Supplier details
-			assert.ok(cur_frm.doc.supplier == 'Test Supplier', "Supplier correct");
-			assert.ok(cur_frm.doc.company == cur_frm.doc.company, "Company correct");
-			// Get Contact details
-			assert.ok(cur_frm.doc.contact_person == 'Contact 3-Test Supplier', "Conatct correct");
-			assert.ok(cur_frm.doc.contact_email == 'test@supplier.com', "Email correct");
-			// Get uom
-			assert.ok(cur_frm.doc.items[0].uom == 'Unit', "Multi uom correct");
-			assert.ok(cur_frm.doc.total ==  1000, "Total correct");
-			// Calculate total after discount
-			assert.ok(cur_frm.doc.grand_total ==  900, "Grand total correct");
-			// Get terms
-			assert.ok(cur_frm.doc.tc_name == 'Test Term 1', "Terms correct");
-		},
-
-		() => cur_frm.print_doc(),
-		() => frappe.timeout(2),
-		() => {
-			assert.ok($('.btn-print-print').is(':visible'), "Print Format Available");
-			assert.ok($("table > tbody > tr > td:nth-child(3) > div").text().includes("Test Product 4"), "Print Preview Works As Expected");
-		},
-		() => cur_frm.print_doc(),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Get items from'),
-		() => frappe.timeout(0.3),
-		() => frappe.click_link('Material Request'),
-		() => frappe.timeout(0.3),
-		() => frappe.click_button('Get Items'),
-		() => frappe.timeout(1),
-		() => {
-			// Get item from Material Requests
-			assert.ok(cur_frm.doc.items[1].item_name == 'Test Product 1', "Getting items from material requests work");
-		},
-
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_item_wise_discount.js b/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_item_wise_discount.js
deleted file mode 100644
index 0a51565..0000000
--- a/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_item_wise_discount.js
+++ /dev/null
@@ -1,34 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: supplier quotation with item wise discount", function(assert){
-	assert.expect(2);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Supplier Quotation', [
-				{supplier: 'Test Supplier'},
-				{company: 'For Testing'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"uom": 'Unit'},
-						{"warehouse": 'All Warehouses - FT'},
-						{'discount_percentage': 10},
-					]
-				]}
-			]);
-		},
-
-		() => {
-			assert.ok(cur_frm.doc.total == 900, "Total correct");
-			assert.ok(cur_frm.doc.grand_total == 900, "Grand total correct");
-		},
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_taxes_and_charges.js b/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_taxes_and_charges.js
deleted file mode 100644
index 7ea3e60..0000000
--- a/erpnext/buying/doctype/supplier_quotation/tests/test_supplier_quotation_for_taxes_and_charges.js
+++ /dev/null
@@ -1,37 +0,0 @@
-QUnit.module('Buying');
-
-QUnit.test("test: supplier quotation with taxes and charges", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	let supplier_quotation_name;
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Supplier Quotation', [
-				{supplier: 'Test Supplier'},
-				{items: [
-					[
-						{"item_code": 'Test Product 4'},
-						{"qty": 5},
-						{"rate": 100},
-						{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-					]
-				]},
-				{taxes_and_charges:'TEST In State GST - FT'},
-			]);
-		},
-		() => {supplier_quotation_name = cur_frm.doc.name;},
-		() => {
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-			assert.ok(cur_frm.doc.total_taxes_and_charges == 45, "Taxes and charges correct");
-			assert.ok(cur_frm.doc.grand_total == 545, "Grand total correct");
-		},
-
-		() => cur_frm.save(),
-		() => frappe.timeout(0.3),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/crm/doctype/lead/tests/test_lead_individual.js b/erpnext/crm/doctype/lead/tests/test_lead_individual.js
deleted file mode 100644
index 66d3337..0000000
--- a/erpnext/crm/doctype/lead/tests/test_lead_individual.js
+++ /dev/null
@@ -1,43 +0,0 @@
-QUnit.module("sales");
-
-QUnit.test("test: lead", function (assert) {
-	assert.expect(4);
-	let done = assert.async();
-	let lead_name = frappe.utils.get_random(10);
-	frappe.run_serially([
-		// test lead creation
-		() => frappe.set_route("List", "Lead"),
-		() => frappe.new_doc("Lead"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("lead_name", lead_name),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok(cur_frm.doc.lead_name.includes(lead_name),
-				'name correctly set');
-			frappe.lead_name = cur_frm.doc.name;
-		},
-		// create address and contact
-		() => frappe.click_link('Address & Contact'),
-		() => frappe.click_button('New Address'),
-		() => frappe.timeout(1),
-		() => frappe.set_control('address_line1', 'Gateway'),
-		() => frappe.set_control('city', 'Mumbai'),
-		() => cur_frm.save(),
-		() => frappe.timeout(3),
-		() => assert.equal(frappe.get_route()[1], 'Lead',
-			'back to lead form'),
-		() => frappe.click_link('Address & Contact'),
-		() => assert.ok($('.address-box').text().includes('Mumbai'),
-			'city is seen in address box'),
-
-		// make opportunity
-		() => frappe.click_button('Make'),
-		() => frappe.click_link('Opportunity'),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_frm.doc.lead, frappe.lead_name,
-			'lead name correctly mapped'),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/crm/doctype/lead/tests/test_lead_organization.js b/erpnext/crm/doctype/lead/tests/test_lead_organization.js
deleted file mode 100644
index 7fb9573..0000000
--- a/erpnext/crm/doctype/lead/tests/test_lead_organization.js
+++ /dev/null
@@ -1,55 +0,0 @@
-QUnit.module("sales");
-
-QUnit.test("test: lead", function (assert) {
-	assert.expect(5);
-	let done = assert.async();
-	let lead_name = frappe.utils.get_random(10);
-	frappe.run_serially([
-		// test lead creation
-		() => frappe.set_route("List", "Lead"),
-		() => frappe.new_doc("Lead"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("company_name", lead_name),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok(cur_frm.doc.lead_name.includes(lead_name),
-				'name correctly set');
-			frappe.lead_name = cur_frm.doc.name;
-		},
-		// create address and contact
-		() => frappe.click_link('Address & Contact'),
-		() => frappe.click_button('New Address'),
-		() => frappe.timeout(1),
-		() => frappe.set_control('address_line1', 'Gateway'),
-		() => frappe.set_control('city', 'Mumbai'),
-		() => cur_frm.save(),
-		() => frappe.timeout(3),
-		() => assert.equal(frappe.get_route()[1], 'Lead',
-			'back to lead form'),
-		() => frappe.click_link('Address & Contact'),
-		() => assert.ok($('.address-box').text().includes('Mumbai'),
-			'city is seen in address box'),
-
-		() => frappe.click_button('New Contact'),
-		() => frappe.timeout(1),
-		() => frappe.set_control('first_name', 'John'),
-		() => frappe.set_control('last_name', 'Doe'),
-		() => cur_frm.save(),
-		() => frappe.timeout(3),
-		() => frappe.set_route('Form', 'Lead', cur_frm.doc.links[0].link_name),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Address & Contact'),
-		() => assert.ok($('.address-box').text().includes('John'),
-			'contact is seen in contact box'),
-
-		// make customer
-		() => frappe.click_button('Make'),
-		() => frappe.click_link('Customer'),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_frm.doc.lead_name, frappe.lead_name,
-			'lead name correctly mapped'),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/crm/doctype/opportunity/test_opportunity.js b/erpnext/crm/doctype/opportunity/test_opportunity.js
deleted file mode 100644
index 45b97dd..0000000
--- a/erpnext/crm/doctype/opportunity/test_opportunity.js
+++ /dev/null
@@ -1,56 +0,0 @@
-QUnit.test("test: opportunity", function (assert) {
-	assert.expect(8);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.set_route('List', 'Opportunity'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('New'),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value('opportunity_from', 'Customer'),
-		() => cur_frm.set_value('customer', 'Test Customer 1'),
-
-		// check items
-		() => cur_frm.set_value('with_items', 1),
-		() => frappe.tests.set_grid_values(cur_frm, 'items', [
-			[
-				{item_code:'Test Product 1'},
-				{qty: 4}
-			]
-		]),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => {
-			assert.notOk(cur_frm.is_new(), 'saved');
-			frappe.opportunity_name = cur_frm.doc.name;
-		},
-
-		// close and re-open
-		() => frappe.click_button('Close'),
-		() => frappe.timeout(1),
-		() => assert.equal(cur_frm.doc.status, 'Closed',
-			'closed'),
-
-		() => frappe.click_button('Reopen'),
-		() => assert.equal(cur_frm.doc.status, 'Open',
-			'reopened'),
-		() => frappe.timeout(1),
-
-		// make quotation
-		() => frappe.click_button('Make'),
-		() => frappe.click_link('Quotation', 1),
-		() => frappe.timeout(2),
-		() => {
-			assert.equal(frappe.get_route()[1], 'Quotation',
-				'made quotation');
-			assert.equal(cur_frm.doc.customer, 'Test Customer 1',
-				'customer set in quotation');
-			assert.equal(cur_frm.doc.items[0].item_code, 'Test Product 1',
-				'item set in quotation');
-			assert.equal(cur_frm.doc.items[0].qty, 4,
-				'qty set in quotation');
-			assert.equal(cur_frm.doc.items[0].prevdoc_docname, frappe.opportunity_name,
-				'opportunity set in quotation');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/academic_term/test_academic_term.js b/erpnext/education/doctype/academic_term/test_academic_term.js
deleted file mode 100644
index 383b65a..0000000
--- a/erpnext/education/doctype/academic_term/test_academic_term.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Testing Setup Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Academic Term', function(assert){
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Academic Term', [
-				{academic_year: '2016-17'},
-				{term_name: "Semester 1"},
-				{term_start_date: '2016-07-20'},
-				{term_end_date:'2017-06-20'},
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.academic_year=='2016-17');
-			assert.ok(cur_frm.doc.term_name=='Semester 1');
-			assert.ok(cur_frm.doc.term_start_date=='2016-07-20');
-			assert.ok(cur_frm.doc.term_end_date=='2017-06-20');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js b/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js
deleted file mode 100644
index 724c4da..0000000
--- a/erpnext/education/doctype/assessment_criteria/test_assessment_criteria.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Education Assessment module
-QUnit.module('education');
-
-QUnit.test('Test: Assessment Criteria', function(assert){
-	assert.expect(0);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Assessment Criteria', [
-				{assessment_criteria: 'Pass'},
-				{assessment_criteria_group: 'Reservation'}
-			]);
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js b/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js
deleted file mode 100644
index ab27e63..0000000
--- a/erpnext/education/doctype/assessment_criteria_group/test_assessment_criteria_group.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// Education Assessment module
-QUnit.module('education');
-
-QUnit.test('Test: Assessment Criteria Group', function(assert){
-	assert.expect(0);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Assessment Criteria Group', [
-				{assessment_criteria_group: 'Reservation'}
-			]);
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/assessment_group/test_assessment_group.js b/erpnext/education/doctype/assessment_group/test_assessment_group.js
deleted file mode 100644
index 00e6309..0000000
--- a/erpnext/education/doctype/assessment_group/test_assessment_group.js
+++ /dev/null
@@ -1,65 +0,0 @@
-// Education Assessment module
-QUnit.module('education');
-
-QUnit.test('Test: Assessment Group', function(assert){
-	assert.expect(4);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => frappe.set_route('Tree', 'Assessment Group'),
-
-		// Checking adding child without selecting any Node
-		() => frappe.tests.click_button('New'),
-		() => frappe.timeout(0.2),
-		() => {assert.equal($(`.msgprint`).text(), "Select a group node first.", "Error message success");},
-		() => frappe.tests.click_button('Close'),
-		() => frappe.timeout(0.2),
-
-		// Creating child nodes
-		() => frappe.tests.click_link('All Assessment Groups'),
-		() => frappe.map_group.make('Assessment-group-1'),
-		() => frappe.map_group.make('Assessment-group-4', "All Assessment Groups", 1),
-		() => frappe.tests.click_link('Assessment-group-4'),
-		() => frappe.map_group.make('Assessment-group-5', "Assessment-group-3", 0),
-
-		// Checking Edit button
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_link('Assessment-group-1'),
-		() => frappe.tests.click_button('Edit'),
-		() => frappe.timeout(0.5),
-		() => {assert.deepEqual(frappe.get_route(), ["Form", "Assessment Group", "Assessment-group-1"], "Edit route checks");},
-
-		// Deleting child Node
-		() => frappe.set_route('Tree', 'Assessment Group'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_link('Assessment-group-1'),
-		() => frappe.tests.click_button('Delete'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Yes'),
-
-		// Checking Collapse and Expand button
-		() => frappe.timeout(2),
-		() => frappe.tests.click_link('Assessment-group-4'),
-		() => frappe.click_button('Collapse'),
-		() => frappe.tests.click_link('All Assessment Groups'),
-		() => frappe.click_button('Collapse'),
-		() => {assert.ok($('.opened').size() == 0, 'Collapsed');},
-		() => frappe.click_button('Expand'),
-		() => {assert.ok($('.opened').size() > 0, 'Expanded');},
-
-		() => done()
-	]);
-});
-
-frappe.map_group = {
-	make:function(assessment_group_name, parent_assessment_group = 'All Assessment Groups', is_group = 0){
-		return frappe.run_serially([
-			() => frappe.click_button('Add Child'),
-			() => frappe.timeout(0.2),
-			() => cur_dialog.set_value('is_group', is_group),
-			() => cur_dialog.set_value('assessment_group_name', assessment_group_name),
-			() => cur_dialog.set_value('parent_assessment_group', parent_assessment_group),
-			() => frappe.click_button('Create New'),
-		]);
-	}
-};
diff --git a/erpnext/education/doctype/assessment_plan/test_assessment_plan.js b/erpnext/education/doctype/assessment_plan/test_assessment_plan.js
deleted file mode 100644
index b0bff26..0000000
--- a/erpnext/education/doctype/assessment_plan/test_assessment_plan.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// Testing Assessment Module in education
-QUnit.module('education');
-
-QUnit.test('Test: Assessment Plan', function(assert){
-	assert.expect(6);
-	let done = assert.async();
-	let room_name, instructor_name, assessment_name;
-
-	frappe.run_serially([
-		() => frappe.db.get_value('Room', {'room_name': 'Room 1'}, 'name'),
-		(room) => {room_name = room.message.name;}, // Fetching Room name
-		() => frappe.db.get_value('Instructor', {'instructor_name': 'Instructor 1'}, 'name'),
-		(instructor) => {instructor_name = instructor.message.name;}, // Fetching Instructor name
-
-		() => {
-			return frappe.tests.make('Assessment Plan', [
-				{assessment_name: "Test-Mid-Term"},
-				{assessment_group: 'Assessment-group-5'},
-				{maximum_assessment_score: 100},
-				{student_group: 'test-course-wise-group-2'},
-				{course: 'Test_Sub'},
-				{grading_scale: 'GTU'},
-				{schedule_date: frappe.datetime.nowdate()},
-				{room: room_name},
-				{examiner: instructor_name},
-				{supervisor: instructor_name},
-				{from_time: "12:30:00"},
-				{to_time: "2:30:00"}
-			]);
-		},
-
-		() => {
-			assessment_name = cur_frm.doc.name; // Storing the name of current Assessment Plan
-			assert.equal(cur_frm.doc.assessment_criteria[0].assessment_criteria, 'Pass', 'Assessment Criteria auto-filled correctly');
-			assert.equal(cur_frm.doc.assessment_criteria[0].maximum_score, 100, 'Maximum score correctly set');
-		}, // Checking if the table was auto-filled upon selecting appropriate fields
-
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.5),
-		() => {assert.equal(cur_frm.doc.docstatus, 1, "Assessment Plan submitted successfully");},
-
-		() => frappe.click_button('Assessment Result'), // Checking out Assessment Result button option
-		() => frappe.timeout(0.5),
-		() => {
-			assert.deepEqual(frappe.get_route(), ["Form", "Assessment Result Tool"], 'Assessment Result properly linked');
-			assert.equal(cur_frm.doc.assessment_plan, assessment_name, 'Assessment correctly set');
-			assert.equal(cur_frm.doc.student_group, 'test-course-wise-group-2', 'Course for Assessment correctly set');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/assessment_result/test_assessment_result.js b/erpnext/education/doctype/assessment_result/test_assessment_result.js
deleted file mode 100644
index d4eb4b8..0000000
--- a/erpnext/education/doctype/assessment_result/test_assessment_result.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// Education Assessment module
-QUnit.module('education');
-
-QUnit.test('Test: Assessment Result', function(assert){
-	assert.expect(25);
-	let done = assert.async();
-	let student_list = [];
-	let assessment_name;
-	let tasks = []
-
-	frappe.run_serially([
-		// Saving Assessment Plan name
-		() => frappe.db.get_value('Assessment Plan', {'assessment_name': 'Test-Mid-Term'}, 'name'),
-		(assessment_plan) => {assessment_name = assessment_plan.message.name;},
-		// Fetching list of Student for which Result is supposed to be set
-		() => frappe.set_route('Form', 'Assessment Plan', assessment_name),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Assessment Result'),
-		() => frappe.timeout(1),
-		() => cur_frm.refresh(),
-		() => frappe.timeout(1),
-		() => {
-			$("tbody tr").each( function(i, input){
-				student_list.push($(input).data().student);
-			});
-		},
-
-		// Looping through each student in the list and setting up their score
-		() => {
-			student_list.forEach(index => {
-				tasks.push(
-					() => frappe.set_route('List', 'Assessment Result', 'List'),
-					() => frappe.timeout(0.5),
-					() => frappe.tests.click_button('New'),
-					() => frappe.timeout(0.5),
-					() => cur_frm.set_value('student', index),
-					() => cur_frm.set_value('assessment_plan', assessment_name),
-					() => frappe.timeout(0.2),
-					() => cur_frm.doc.details[0].score = (39 + (15 * student_list.indexOf(index))),
-					() => cur_frm.save(),
-					() => frappe.timeout(0.5),
-
-					() => frappe.db.get_value('Assessment Plan', {'name': 'ASP00001'}, ['grading_scale', 'maximum_assessment_score']),
-					(assessment_plan) => {
-						assert.equal(cur_frm.doc.grading_scale, assessment_plan.message.grading_scale, 'Grading scale correctly fetched');
-						assert.equal(cur_frm.doc.maximum_score, assessment_plan.message.maximum_assessment_score, 'Maximum score correctly fetched');
-
-						frappe.call({
-							method: "erpnext.education.api.get_grade",
-							args: {
-								"grading_scale": assessment_plan.message.grading_scale,
-								"percentage": cur_frm.doc.total_score
-							},
-							callback: function(r){
-								assert.equal(cur_frm.doc.grade, r.message, "Grade correctly calculated");
-							}
-						});
-					},
-
-					() => frappe.tests.click_button('Submit'),
-					() => frappe.timeout(0.5),
-					() => frappe.tests.click_button('Yes'),
-					() => frappe.timeout(0.5),
-					() => {assert.equal();},
-					() => {assert.equal(cur_frm.doc.docstatus, 1, "Submitted successfully");},
-				);
-			});
-			return frappe.run_serially(tasks);
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js b/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js
deleted file mode 100644
index 7ef5c68..0000000
--- a/erpnext/education/doctype/assessment_result_tool/test_assessment_result_tool.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Education Assessment module
-QUnit.module('education');
-
-QUnit.test('Test: Assessment Result Tool', function(assert){
-	assert.expect(1);
-	let done = assert.async();
-	let i, count = 0, assessment_name;
-
-	frappe.run_serially([
-		// Saving Assessment Plan name
-		() => frappe.db.get_value('Assessment Plan', {'assessment_name': 'Test-Mid-Term'}, 'name'),
-		(assessment_plan) => {assessment_name = assessment_plan.message.name;},
-
-		() => frappe.set_route('Form', 'Assessment Plan', assessment_name),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Assessment Result'),
-		() => frappe.timeout(1),
-		() => cur_frm.refresh(),
-		() => frappe.timeout(1),
-		() => {
-			for(i = 2; i < $('tbody tr').size() * 4; i = (i + 4)){
-				if(($(`tbody td:eq("${i}")`) != "") && ($(`tbody td:eq("${i+1}")`) != ""))
-					count++;
-			}
-			assert.equal($('tbody tr').size(), count, 'All grades correctly displayed');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/course/test_course.js b/erpnext/education/doctype/course/test_course.js
deleted file mode 100644
index 2b6860c..0000000
--- a/erpnext/education/doctype/course/test_course.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Testing Setup Module in education
-QUnit.module('education');
-
-QUnit.test('test course', function(assert) {
-	assert.expect(8);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Course', [
-				{course_name: 'Test_Subject'},
-				{course_code: 'Test_Sub'},
-				{department: 'Test Department'},
-				{course_abbreviation: 'Test_Sub'},
-				{course_intro: 'Test Subject Intro'},
-				{default_grading_scale: 'GTU'},
-				{assessment_criteria: [
-					[
-						{assessment_criteria: 'Pass'},
-						{weightage: 100}
-					]
-				]}
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.course_name == 'Test_Subject', 'Course name correctly set');
-			assert.ok(cur_frm.doc.course_code == 'Test_Sub', 'Course code correctly set');
-			assert.ok(cur_frm.doc.department == 'Test Department', 'Department selected correctly');
-			assert.ok(cur_frm.doc.course_abbreviation == 'Test_Sub');
-			assert.ok(cur_frm.doc.course_intro == 'Test Subject Intro');
-			assert.ok(cur_frm.doc.default_grading_scale == 'GTU', 'Grading scale selected correctly');
-			assert.ok(cur_frm.doc.assessment_criteria[0].assessment_criteria == 'Pass', 'Assessment criteria selected correctly');
-			assert.ok(cur_frm.doc.assessment_criteria[0].weightage == '100');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/education_settings/test_education_settings.js b/erpnext/education/doctype/education_settings/test_education_settings.js
deleted file mode 100644
index 990b0aa..0000000
--- a/erpnext/education/doctype/education_settings/test_education_settings.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-// Testing Setup Module in Education
-QUnit.module('education');
-
-QUnit.test("test: Education Settings", function (assert) {
-	let done = assert.async();
-
-	assert.expect(3);
-
-	frappe.run_serially([
-		() => frappe.set_route("List", "Education Settings"),
-		() => frappe.timeout(0.4),
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{current_academic_year: '2016-17'},
-				{current_academic_term: '2016-17 (Semester 1)'},
-				{attendance_freeze_date: '2016-07-20'}
-			]);
-		},
-		() => {
-			cur_frm.save();
-			assert.ok(cur_frm.doc.current_academic_year=="2016-17");
-			assert.ok(cur_frm.doc.current_academic_term=="2016-17 (Semester 1)");
-			assert.ok(cur_frm.doc.attendance_freeze_date=="2016-07-20");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/fees/test_fees.js b/erpnext/education/doctype/fees/test_fees.js
deleted file mode 100644
index 22e987e..0000000
--- a/erpnext/education/doctype/fees/test_fees.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Fees", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(1);
-
-	frappe.run_serially('Fees', [
-
-		// insert a new Fees
-		() => {
-			return frappe.tests.make('Fees', [
-				{student: 'STUD00001'},
-				{due_date: frappe.datetime.get_today()},
-				{fee_structure: 'FS00001'}
-			]);
-		},
-		() => {
-			assert.equal(cur_frm.doc.grand_total===cur_frm.doc.outstanding_amount);
-		},
-		() => frappe.timeout(0.3),
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => done()
-	]);
-
-});
diff --git a/erpnext/education/doctype/grading_scale/test_grading_scale.js b/erpnext/education/doctype/grading_scale/test_grading_scale.js
deleted file mode 100644
index fb56918..0000000
--- a/erpnext/education/doctype/grading_scale/test_grading_scale.js
+++ /dev/null
@@ -1,102 +0,0 @@
-// Education Assessment module
-QUnit.module('education');
-
-QUnit.test('Test: Grading Scale', function(assert){
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Grading Scale', [
-				{grading_scale_name: 'GTU'},
-				{description: 'The score will be set according to 100 based system.'},
-				{intervals: [
-					[
-						{grade_code: 'AA'},
-						{threshold: '95'},
-						{grade_description: 'First Class + Distinction'}
-					],
-					[
-						{grade_code: 'AB'},
-						{threshold: '90'},
-						{grade_description: 'First Class'}
-					],
-					[
-						{grade_code: 'BB'},
-						{threshold: '80'},
-						{grade_description: 'Distinction'}
-					],
-					[
-						{grade_code: 'BC'},
-						{threshold: '70'},
-						{grade_description: 'Second Class'}
-					],
-					[
-						{grade_code: 'CC'},
-						{threshold: '60'},
-						{grade_description: 'Third Class'}
-					],
-					[
-						{grade_code: 'CD'},
-						{threshold: '50'},
-						{grade_description: 'Average'}
-					],
-					[
-						{grade_code: 'DD'},
-						{threshold: '40'},
-						{grade_description: 'Pass'}
-					],
-					[
-						{grade_code: 'FF'},
-						{threshold: '0'},
-						{grade_description: 'Fail'}
-					],
-				]}
-			]);
-		},
-		() => {
-			return frappe.tests.make('Grading Scale', [
-				{grading_scale_name: 'GTU-2'},
-				{description: 'The score will be set according to 100 based system.'},
-				{intervals: [
-					[
-						{grade_code: 'AA'},
-						{threshold: '90'},
-						{grade_description: 'Distinction'}
-					],
-					[
-						{grade_code: 'FF'},
-						{threshold: '0'},
-						{grade_description: 'Fail'}
-					]
-				]}
-			]);
-		},
-
-		() => {
-			let grading_scale = ['GTU', 'GTU-2'];
-			let tasks = [];
-			grading_scale.forEach(index => {
-				tasks.push(
-					() => frappe.set_route('Form', 'Grading Scale', index),
-					() => frappe.timeout(0.5),
-					() => frappe.tests.click_button('Submit'),
-					() => frappe.timeout(0.5),
-					() => frappe.tests.click_button('Yes'),
-					() => {assert.equal(cur_frm.doc.docstatus, 1, 'Submitted successfully');}
-				);
-			});
-			return frappe.run_serially(tasks);
-		},
-
-		() => frappe.timeout(1),
-		() => frappe.set_route('Form', 'Grading Scale','GTU-2'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Cancel'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.5),
-		() => {assert.equal(cur_frm.doc.docstatus, 2, 'Cancelled successfully');},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/guardian/test_guardian.js b/erpnext/education/doctype/guardian/test_guardian.js
deleted file mode 100644
index 1ea6dc2..0000000
--- a/erpnext/education/doctype/guardian/test_guardian.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// Testing Student Module in education
-QUnit.module('education');
-
-QUnit.test('Test: Guardian', function(assert){
-	assert.expect(9);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Guardian', [
-				{guardian_name: 'Test Guardian'},
-				{email_address: 'guardian@testmail.com'},
-				{mobile_number: 9898980000},
-				{alternate_number: 8989890000},
-				{date_of_birth: '1982-07-22'},
-				{education: 'Testing'},
-				{occupation: 'Testing'},
-				{designation: 'Testing'},
-				{work_address: 'Testing address'}
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.guardian_name == 'Test Guardian');
-			assert.ok(cur_frm.doc.email_address == 'guardian@testmail.com');
-			assert.ok(cur_frm.doc.mobile_number == 9898980000);
-			assert.ok(cur_frm.doc.alternate_number == 8989890000);
-			assert.ok(cur_frm.doc.date_of_birth == '1982-07-22');
-			assert.ok(cur_frm.doc.education == 'Testing');
-			assert.ok(cur_frm.doc.occupation == 'Testing');
-			assert.ok(cur_frm.doc.designation == 'Testing');
-			assert.ok(cur_frm.doc.work_address == 'Testing address');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/instructor/test_instructor.js b/erpnext/education/doctype/instructor/test_instructor.js
deleted file mode 100644
index c584f45..0000000
--- a/erpnext/education/doctype/instructor/test_instructor.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Testing Setup Module in education
-QUnit.module('education');
-
-QUnit.test('Test: Instructor', function(assert){
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Instructor", [
-				{instructor_name: 'Instructor 1'},
-				{department: 'Test Department'}
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.instructor_name == 'Instructor 1');
-			assert.ok(cur_frm.doc.department = 'Test Department');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/program/test_program.js b/erpnext/education/doctype/program/test_program.js
deleted file mode 100644
index b9ca41a..0000000
--- a/erpnext/education/doctype/program/test_program.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// Testing Setup Module in education
-QUnit.module('education');
-
-QUnit.test('Test: Program', function(assert){
-	assert.expect(6);
-	let done = assert.async();
-	let fee_structure_code;
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Program', [
-				{program_name: 'Standard Test'},
-				{program_code: 'Standard Test'},
-				{department: 'Test Department'},
-				{program_abbreviation: 'Standard Test'},
-				{courses: [
-					[
-						{course: 'Test_Sub'},
-						{required: true}
-					]
-				]}
-			]);
-		},
-
-		() => {
-			assert.ok(cur_frm.doc.program_name == 'Standard Test');
-			assert.ok(cur_frm.doc.program_code == 'Standard Test');
-			assert.ok(cur_frm.doc.department == 'Test Department');
-			assert.ok(cur_frm.doc.program_abbreviation == 'Standard Test');
-			assert.ok(cur_frm.doc.courses[0].course == 'Test_Sub');
-			assert.ok(cur_frm.doc.courses[0].required == true);
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/room/test_room.js b/erpnext/education/doctype/room/test_room.js
deleted file mode 100644
index fdcbe92..0000000
--- a/erpnext/education/doctype/room/test_room.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Testing Setup Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Room', function(assert){
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Room', [
-				{room_name: 'Room 1'},
-				{room_number: '1'},
-				{seating_capacity: '60'},
-			]);
-		},
-		() => {
-			assert.ok(cur_frm.doc.room_name == 'Room 1');
-			assert.ok(cur_frm.doc.room_number = '1');
-			assert.ok(cur_frm.doc.seating_capacity = '60');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_admission/test_student_admission.js b/erpnext/education/doctype/student_admission/test_student_admission.js
deleted file mode 100644
index e01791a..0000000
--- a/erpnext/education/doctype/student_admission/test_student_admission.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// Testing Admission Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Admission', function(assert) {
-	assert.expect(10);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Student Admission', [
-				{academic_year: '2016-17'},
-				{admission_start_date: '2016-04-20'},
-				{admission_end_date: '2016-05-31'},
-				{title: '2016-17 Admissions'},
-				{enable_admission_application: 1},
-				{introduction: 'Test intro'},
-				{program_details: [
-					[
-						{'program': 'Standard Test'},
-						{'application_fee': 1000},
-						{'applicant_naming_series': 'AP'},
-					]
-				]}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			assert.ok(cur_frm.doc.academic_year == '2016-17');
-			assert.ok(cur_frm.doc.admission_start_date == '2016-04-20');
-			assert.ok(cur_frm.doc.admission_end_date == '2016-05-31');
-			assert.ok(cur_frm.doc.title == '2016-17 Admissions');
-			assert.ok(cur_frm.doc.enable_admission_application == 1);
-			assert.ok(cur_frm.doc.introduction == 'Test intro');
-			assert.ok(cur_frm.doc.program_details[0].program == 'Standard Test', 'Program correctly selected');
-			assert.ok(cur_frm.doc.program_details[0].application_fee == 1000);
-			assert.ok(cur_frm.doc.program_details[0].applicant_naming_series == 'AP');
-			assert.ok(cur_frm.doc.route == 'admissions/2016-17-Admissions', "Route successfully set");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_applicant/tests/test_student_applicant.js b/erpnext/education/doctype/student_applicant/tests/test_student_applicant.js
deleted file mode 100644
index fa67977..0000000
--- a/erpnext/education/doctype/student_applicant/tests/test_student_applicant.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// Testing Admission module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Applicant', function(assert){
-	assert.expect(24);
-	let done = assert.async();
-	let guradian_auto_code;
-	let guardian_name;
-	frappe.run_serially([
-		() => frappe.set_route('List', 'Guardian'),
-		() => frappe.timeout(0.5),
-		() => {$(`a:contains("Test Guardian"):visible`)[0].click();},
-		() => frappe.timeout(1),
-		() => {
-			guardian_name = cur_frm.doc.guardian_name;
-			guradian_auto_code = frappe.get_route()[2];
-		},
-		// Testing data entry for Student Applicant
-		() => {
-			return frappe.tests.make('Student Applicant',[
-				{first_name: 'Fname'},
-				{middle_name: 'Mname'},
-				{last_name: 'Lname'},
-				{program: 'Standard Test'},
-				{student_admission: '2016-17 Admissions'},
-				{academic_year: '2016-17'},
-				{date_of_birth: '1995-07-20'},
-				{student_email_id: 'test@testmail.com'},
-				{gender: 'Male'},
-				{student_mobile_number: '9898980000'},
-				{blood_group: 'O+'},
-				{address_line_1: 'Test appt, Test Society,'},
-				{address_line_2: 'Test district, Test city.'},
-				{city: 'Test'},
-				{state: 'Test'},
-				{pincode: '400086'}
-			]);
-		},
-		// Entry in Guardian child table
-		() => $('a:contains("Guardian Details"):visible').click(),
-		() => $('.btn:contains("Add Row"):visible').click(),
-		() => {
-			cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian = guradian_auto_code;
-			cur_frm.get_field("guardians").grid.grid_rows[0].doc.relation = "Father";
-			cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian_name = guardian_name;
-			$('a:contains("Guardian Details"):visible').click();
-		},
-		// Entry in Sibling child table
-		() => $('a:contains("Sibling Details"):visible').click(),
-		() => $('.btn:contains("Add Row"):visible').click(),
-		() => {
-			cur_frm.get_field("siblings").grid.grid_rows[0].doc.full_name = "Test Name";
-			cur_frm.get_field("siblings").grid.grid_rows[0].doc.gender = "Male";
-			cur_frm.get_field("siblings").grid.grid_rows[0].doc.institution = "Test Institution";
-			cur_frm.get_field("siblings").grid.grid_rows[0].doc.program = "Test Program";
-			cur_frm.get_field("siblings").grid.grid_rows[0].doc.date_of_birth = "1995-07-20";
-			$('span.hidden-xs.octicon.octicon-triangle-up').click();
-			cur_frm.save();
-		},
-		() => {
-			assert.ok(cur_frm.doc.first_name == 'Fname');
-			assert.ok(cur_frm.doc.middle_name == 'Mname');
-			assert.ok(cur_frm.doc.last_name == 'Lname');
-			assert.ok(cur_frm.doc.program == 'Standard Test', 'Program selected correctly');
-			assert.ok(cur_frm.doc.student_admission == '2016-17 Admissions', 'Student Admission entry correctly selected');
-			assert.ok(cur_frm.doc.academic_year == '2016-17');
-			assert.ok(cur_frm.doc.date_of_birth == '1995-07-20');
-			assert.ok(cur_frm.doc.student_email_id == 'test@testmail.com');
-			assert.ok(cur_frm.doc.gender == 'Male');
-			assert.ok(cur_frm.doc.student_mobile_number == '9898980000');
-			assert.ok(cur_frm.doc.blood_group == 'O+');
-			assert.ok(cur_frm.doc.address_line_1 == 'Test appt, Test Society,');
-			assert.ok(cur_frm.doc.address_line_2 == 'Test district, Test city.');
-			assert.ok(cur_frm.doc.city == 'Test');
-			assert.ok(cur_frm.doc.state == 'Test');
-			assert.ok(cur_frm.doc.pincode == '400086');
-		},
-		() => frappe.timeout(1),
-		() => $('a:contains("Guardian Details"):visible').click(),
-		() => {
-			assert.ok(cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian == guradian_auto_code, 'Guardian correctly selected from dropdown');
-			assert.ok(cur_frm.get_field("guardians").grid.grid_rows[0].doc.relation == 'Father');
-			assert.ok(cur_frm.get_field("guardians").grid.grid_rows[0].doc.guardian_name == guardian_name, 'Guardian name was correctly retrieved');
-		},
-		() => $('a:contains("Sibling Details"):visible').click(),
-		() => {
-			assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.full_name == 'Test Name');
-			assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.gender == 'Male');
-			assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.institution == 'Test Institution');
-			assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.program == 'Test Program');
-			assert.ok(cur_frm.get_field("siblings").grid.grid_rows[0].doc.date_of_birth == '1995-07-20');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_applicant/tests/test_student_applicant_dummy_data.js b/erpnext/education/doctype/student_applicant/tests/test_student_applicant_dummy_data.js
deleted file mode 100644
index 03101e4..0000000
--- a/erpnext/education/doctype/student_applicant/tests/test_student_applicant_dummy_data.js
+++ /dev/null
@@ -1,87 +0,0 @@
-QUnit.module('Admission');
-
-QUnit.test('Make Students', function(assert){
-	assert.expect(0);
-	let done = assert.async();
-	let tasks = [];
-	let loop = [1,2,3,4];
-	let fname;
-
-	frappe.run_serially([
-		// Making School House to be used in this test and later
-		() => frappe.set_route('Form', 'School House/New School House'),
-		() => frappe.timeout(0.5),
-		() => cur_frm.doc.house_name = 'Test_house',
-		() => cur_frm.save(),
-
-		// Making Student Applicant entries
-		() => {
-			loop.forEach(index => {
-				tasks.push(() => {
-					fname = "Fname" + index;
-
-					return frappe.tests.make('Student Applicant', [
-						{first_name: fname},
-						{middle_name: "Mname"},
-						{last_name: "Lname"},
-						{program: "Standard Test"},
-						{student_admission: "2016-17 Admissions"},
-						{date_of_birth: '1995-08-20'},
-						{student_email_id: ('test' + (index+3) + '@testmail.com')},
-						{gender: 'Male'},
-						{student_mobile_number: (9898980000 + index)},
-						{blood_group: 'O+'},
-						{address_line_1: 'Test appt, Test Society,'},
-						{address_line_2: 'Test district, Test city.'},
-						{city: 'Test'},
-						{state: 'Test'},
-						{pincode: '395007'}
-					]);
-				});
-			});
-			return frappe.run_serially(tasks);
-		},
-
-		// Using Program Enrollment Tool to enroll all dummy student at once
-		() => frappe.set_route('Form', 'Program Enrollment Tool'),
-		() => {
-			cur_frm.set_value("get_students_from", "Student Applicants");
-			cur_frm.set_value("academic_year", "2016-17");
-			cur_frm.set_value("program", "Standard Test");
-		},
-		() => frappe.tests.click_button("Get Students"),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button("Enroll Students"),
-		() => frappe.timeout(1.5),
-		() => frappe.tests.click_button("Close"),
-
-		// Submitting required data for each enrolled Student
-		() => {
-			tasks = [];
-			loop.forEach(index => {
-				tasks.push(
-					() => {fname = "Fname" + index + " Mname Lname";},
-					() => frappe.set_route('List', 'Program Enrollment/List'),
-					() => frappe.timeout(0.6),
-					() => frappe.tests.click_link(fname),
-					() => frappe.timeout(0.4),
-					() => {
-						cur_frm.set_value('program', 'Standard Test');
-						cur_frm.set_value('student_category', 'Reservation');
-						cur_frm.set_value('student_batch_name', 'A');
-						cur_frm.set_value('academic_year', '2016-17');
-						cur_frm.set_value('academic_term', '2016-17 (Semester 1)');
-						cur_frm.set_value('school_house', 'Test_house');
-					},
-					() => cur_frm.save(),
-					() => frappe.timeout(0.5),
-					() => frappe.tests.click_button('Submit'),
-					() => frappe.tests.click_button('Yes'),
-					() => frappe.timeout(0.5)
-				);
-			});
-			return frappe.run_serially(tasks);
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js b/erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js
deleted file mode 100644
index daa36e7..0000000
--- a/erpnext/education/doctype/student_applicant/tests/test_student_applicant_options.js
+++ /dev/null
@@ -1,110 +0,0 @@
-// Testing Admission module in Education
-QUnit.module('education');
-
-QUnit.test('test student applicant', function(assert){
-	assert.expect(11);
-	let done = assert.async();
-	let testing_status;
-	frappe.run_serially([
-		() => frappe.set_route('List', 'Student Applicant'),
-		() => frappe.timeout(0.5),
-		() => {$(`a:contains("Fname Mname Lname"):visible`)[0].click();},
-
-		// Checking different options
-		// 1. Moving forward with Submit
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.5),
-		() => {
-			testing_status = $('span.indicator.orange').text();
-			assert.ok(testing_status.indexOf('Submit this document to confirm') == -1); // checking if submit has been successfull
-		},
-
-		// 2. Cancelling the Submit request
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Cancel'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.5),
-		() => {
-			testing_status = $('h1.editable-title').text();
-			assert.ok(testing_status.indexOf('Cancelled') != -1); // checking if cancel request has been successfull
-		},
-
-		// 3. Checking Amend option
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Amend'),
-		() => cur_frm.doc.student_email_id = "test2@testmail.com", // updating email id since same id again is not allowed
-		() => cur_frm.save(),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'), // Submitting again after amend
-		() => {
-			testing_status = $('span.indicator.orange').text();
-			assert.ok(testing_status.indexOf('Submit this document to confirm') == -1); // checking if submit has been successfull after amend
-		},
-
-		// Checking different Application status option
-		() => {
-			testing_status = $('h1.editable-title').text();
-			assert.ok(testing_status.indexOf('Applied') != -1); // checking if Applied has been successfull
-		},
-		() => cur_frm.set_value('application_status', "Rejected"), // Rejected Status
-		() => frappe.tests.click_button('Update'),
-		() => {
-			testing_status = $('h1.editable-title').text();
-			assert.ok(testing_status.indexOf('Rejected') != -1); // checking if Rejected has been successfull
-		},
-		() => cur_frm.set_value('application_status', "Admitted"), // Admitted Status
-		() => frappe.tests.click_button('Update'),
-		() => {
-			testing_status = $('h1.editable-title').text();
-			assert.ok(testing_status.indexOf('Admitted') != -1); // checking if Admitted has been successfull
-		},
-		() => cur_frm.set_value('application_status', "Approved"), // Approved Status
-		() => frappe.tests.click_button('Update'),
-		() => {
-			testing_status = $('h1.editable-title').text();
-			assert.ok(testing_status.indexOf('Approved') != -1); // checking if Approved has been successfull
-		},
-
-		// Clicking on Enroll button should add the applicant's entry in Student doctype, and take you to Program Enrollment page
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Enroll'),
-		() => frappe.timeout(0.5),
-		() => {
-			assert.ok(frappe.get_route()[0] == 'Form'); // Checking if the current page is Program Enrollment page or not
-			assert.ok(frappe.get_route()[1] == 'Program Enrollment');
-		},
-
-		// Routing to Student List to check if the Applicant's entry has been made or not
-		() => frappe.timeout(0.5),
-		() => frappe.set_route('List', 'Student'),
-		() => frappe.timeout(0.5),
-		() => {$(`a:contains("Fname Mname Lname"):visible`)[0].click();},
-		() => frappe.timeout(0.5),
-		() => {assert.ok(($(`h1.editable-title`).text()).indexOf('Enabled') != -1, 'Student entry successfully created');}, // Checking if the Student entry has been enabled
-		// Enrolling the Student into a Program
-		() => {$('.form-documents .row:nth-child(1) .col-xs-6:nth-child(1) .octicon-plus').click();},
-		() => frappe.timeout(1),
-		() => cur_frm.set_value('program', 'Standard Test'),
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.set_value('student_category', 'Reservation');
-			cur_frm.set_value('student_batch_name', 'A');
-			cur_frm.set_value('academic_year', '2016-17');
-			cur_frm.set_value('academic_term', '2016-17 (Semester 1)');
-			cur_frm.set_value('school_house', 'Test_house');
-		},
-		() => cur_frm.save(),
-
-		// Submitting Program Enrollment form for our Test Student
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => {
-			assert.ok(cur_frm.doc.docstatus == 1, "Program enrollment successfully submitted");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_attendance/test_student_attendance.js b/erpnext/education/doctype/student_attendance/test_student_attendance.js
deleted file mode 100644
index 3d30b09..0000000
--- a/erpnext/education/doctype/student_attendance/test_student_attendance.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Testing Attendance Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Attendance', function(assert){
-	assert.expect(2);
-	let done = assert.async();
-	let student_code;
-
-	frappe.run_serially([
-		() => frappe.db.get_value('Student', {'student_email_id': 'test2@testmail.com'}, 'name'),
-		(student) => {student_code = student.message.name;}, // fetching student code from db
-
-		() => {
-			return frappe.tests.make('Student Attendance', [
-				{student: student_code},
-				{date: frappe.datetime.nowdate()},
-				{student_group: "test-batch-wise-group-2"},
-				{status: "Absent"}
-			]);
-		},
-
-		() => frappe.timeout(0.5),
-		() => {assert.equal(cur_frm.doc.status, "Absent", "Attendance correctly saved");},
-
-		() => frappe.timeout(0.5),
-		() => cur_frm.set_value("status", "Present"),
-		() => {assert.equal(cur_frm.doc.status, "Present", "Attendance correctly saved");},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js b/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js
deleted file mode 100644
index b66d839..0000000
--- a/erpnext/education/doctype/student_attendance_tool/test_student_attendance_tool.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// Testing Attendance Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Attendace Tool', function(assert){
-	assert.expect(10);
-	let done = assert.async();
-	let i, count = 0;
-
-	frappe.run_serially([
-		() => frappe.timeout(0.2),
-		() => frappe.set_route('Form', 'Student Attendance Tool'),
-		() => frappe.timeout(0.5),
-
-		() => {
-			if(cur_frm.doc.based_on == 'Student Group' || cur_frm.doc.based_on == 'Course Schedule'){
-				cur_frm.doc.based_on = 'Student Group';
-				assert.equal(1, 1, 'Attendance basis correctly set');
-				cur_frm.set_value("group_based_on", 'Batch');
-				cur_frm.set_value("student_group", "test-batch-wise-group");
-				cur_frm.set_value("date", frappe.datetime.nowdate());
-			}
-		},
-		() => frappe.timeout(0.5),
-		() => {
-			assert.equal($('input.students-check').size(), 5, "Student list based on batch correctly fetched");
-			assert.equal(frappe.datetime.nowdate(), cur_frm.doc.date, 'Current date correctly set');
-
-			cur_frm.set_value("student_group", "test-batch-wise-group-2");
-			assert.equal($('input.students-check').size(), 5, "Student list based on batch 2 correctly fetched");
-
-			cur_frm.set_value("group_based_on", 'Course');
-
-			cur_frm.set_value("student_group", "test-course-wise-group");
-			assert.equal($('input.students-check').size(), 5, "Student list based on course correctly fetched");
-
-			cur_frm.set_value("student_group", "test-course-wise-group-2");
-			assert.equal($('input.students-check').size(), 5, "Student list based on course 2 correctly fetched");
-		},
-
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Check all'), // Marking all Student as checked
-		() => {
-			for(i = 0; i < $('input.students-check').size(); i++){
-				if($('input.students-check')[i].checked == true)
-					count++;
-			}
-
-			if(count == $('input.students-check').size())
-				assert.equal($('input.students-check').size(), count, "All students marked checked");
-		},
-
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Uncheck all'), // Marking all Student as unchecked
-		() => {
-			count = 0;
-			for(i = 0; i < $('input.students-check').size(); i++){
-				if(!($('input.students-check')[i].checked))
-					count++;
-			}
-
-			if(count == $('input.students-check').size())
-				assert.equal($('input.students-check').size(), count, "All students marked checked");
-		},
-
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Check all'),
-		() => frappe.tests.click_button('Mark Attendance'),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => {
-			assert.equal($('.msgprint').text(), "Attendance has been marked successfully.", "Attendance successfully marked");
-			frappe.tests.click_button('Close');
-		},
-
-		() => frappe.timeout(1),
-		() => frappe.set_route('List', 'Student Attendance/List'),
-		() => frappe.timeout(1),
-		() => {
-			assert.equal(cur_list.data.length, count, "Attendance list created");
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_batch_name/test_student_batch_name.js b/erpnext/education/doctype/student_batch_name/test_student_batch_name.js
deleted file mode 100644
index 6c761b8..0000000
--- a/erpnext/education/doctype/student_batch_name/test_student_batch_name.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// Testing Setup Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Batch Name', function(assert){
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Student Batch Name', [
-				{batch_name: 'A'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			assert.ok(cur_frm.doc.batch_name=='A');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_category/test_student_category.js b/erpnext/education/doctype/student_category/test_student_category.js
deleted file mode 100644
index 01f50e2..0000000
--- a/erpnext/education/doctype/student_category/test_student_category.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// Testing Setup Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Category', function(assert){
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Student Category', [
-				{category: 'Reservation'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			assert.ok(cur_frm.doc.name=='Reservation');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_group/test_student_group.js b/erpnext/education/doctype/student_group/test_student_group.js
deleted file mode 100644
index 4c7e47b..0000000
--- a/erpnext/education/doctype/student_group/test_student_group.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// Testing Student Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Group', function(assert){
-	assert.expect(2);
-	let done = assert.async();
-	let group_based_on = ["test-batch-wise-group", "test-course-wise-group"];
-	let tasks = [];
-
-	frappe.run_serially([
-		// Creating a Batch and Course based group
-		() => {
-			return frappe.tests.make('Student Group', [
-				{academic_year: '2016-17'},
-				{academic_term: '2016-17 (Semester 1)'},
-				{program: "Standard Test"},
-				{group_based_on: 'Batch'},
-				{student_group_name: group_based_on[0]},
-				{max_strength: 10},
-				{batch: 'A'}
-			]);
-		},
-		() => {
-			return frappe.tests.make('Student Group', [
-				{academic_year: '2016-17'},
-				{academic_term: '2016-17 (Semester 1)'},
-				{program: "Standard Test"},
-				{group_based_on: 'Course'},
-				{student_group_name: group_based_on[1]},
-				{max_strength: 10},
-				{batch: 'A'},
-				{course: 'Test_Sub'},
-			]);
-		},
-
-		// Populating the created group with Students
-		() => {
-			tasks = [];
-			group_based_on.forEach(index => {
-				tasks.push(
-					() => frappe.timeout(0.5),
-					() => frappe.set_route("Form", ('Student Group/' + index)),
-					() => frappe.timeout(0.5),
-					() => frappe.tests.click_button('Get Students'),
-					() => frappe.timeout(1),
-					() => {
-						assert.equal(cur_frm.doc.students.length, 5, 'Successfully fetched list of students');
-					},
-				);
-			});
-			return frappe.run_serially(tasks);
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js b/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js
deleted file mode 100644
index fa612ba..0000000
--- a/erpnext/education/doctype/student_group_creation_tool/test_student_group_creation_tool.js
+++ /dev/null
@@ -1,84 +0,0 @@
-QUnit.module('education');
-
-QUnit.test('Test: Student Group Creation Tool', function(assert){
-	assert.expect(5);
-	let done = assert.async();
-	let instructor_code;
-
-	frappe.run_serially([
-		// Saving Instructor code beforehand
-		() => frappe.db.get_value('Instructor', {'instructor_name': 'Instructor 1'}, 'name'),
-		(instructor) => {instructor_code = instructor.message.name;},
-
-		// Setting up the creation tool to generate and save Student Group
-		() => frappe.set_route('Form', 'Student Group Creation Tool'),
-		() => frappe.timeout(0.5),
-		() => {
-			cur_frm.set_value("academic_year", "2016-17");
-			cur_frm.set_value("academic_term", "2016-17 (Semester 1)");
-			cur_frm.set_value("program", "Standard Test");
-			frappe.tests.click_button('Get Courses');
-		},
-		() => frappe.timeout(1),
-		() => {
-			let no_of_courses = $('input.grid-row-check.pull-left').size() - 1;
-			assert.equal(cur_frm.doc.courses.length, no_of_courses, 'Successfully created groups using the tool');
-		},
-
-		() => {
-			let d, grid, grid_row;
-
-			for(d = 0; d < cur_frm.doc.courses.length; d++)
-			{
-				grid = cur_frm.get_field("courses").grid;
-				grid_row = grid.get_row(d).toggle_view(true);
-				if(grid_row.doc.student_group_name == 'Standard Test/A/2016-17 (Semester 1)'){
-					grid_row.doc.max_strength = 10;
-					grid_row.doc.student_group_name = "test-batch-wise-group-2";
-					$(`.octicon.octicon-triangle-up`).click();
-					continue;
-				}
-				else if(grid_row.doc.student_group_name == 'Test_Sub/Standard Test/2016-17 (Semester 1)'){
-					grid_row.doc.max_strength = 10;
-					grid_row.doc.student_group_name = "test-course-wise-group-2";
-					$(`.octicon.octicon-triangle-up`).click();
-					continue;
-				}
-			}
-		},
-
-		// Generating Student Group
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button("Create Student Groups"),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button("Close"),
-
-		// Goin to the generated group to set up student and instructor list
-		() => {
-			let group_name = ['Student Group/test-batch-wise-group-2', 'Student Group/test-course-wise-group-2'];
-			let tasks = [];
-			group_name.forEach(index => {
-				tasks.push(
-					() => frappe.timeout(1),
-					() => frappe.set_route("Form", index),
-					() => frappe.timeout(0.5),
-					() => {
-						assert.equal(cur_frm.doc.students.length, 5, 'Successfully fetched list of students');
-					},
-					() => frappe.timeout(0.5),
-					() => {
-						d = cur_frm.add_child('instructors');
-						d.instructor = instructor_code;
-						cur_frm.save();
-					},
-					() => {
-						assert.equal(cur_frm.doc.instructors.length, 1, 'Instructor detail stored successfully');
-					},
-				);
-			});
-			return frappe.run_serially(tasks);
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_leave_application/test_student_leave_application.js b/erpnext/education/doctype/student_leave_application/test_student_leave_application.js
deleted file mode 100644
index 6bbf17b..0000000
--- a/erpnext/education/doctype/student_leave_application/test_student_leave_application.js
+++ /dev/null
@@ -1,69 +0,0 @@
-// Testing Attendance Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Leave Application', function(assert){
-	assert.expect(4);
-	let done = assert.async();
-	let student_code;
-	let leave_code;
-	frappe.run_serially([
-		() => frappe.db.get_value('Student', {'student_email_id': 'test2@testmail.com'}, 'name'),
-		(student) => {student_code = student.message.name;}, // fetching student code from db
-
-		() => {
-			return frappe.tests.make('Student Leave Application', [
-				{student: student_code},
-				{from_date: '2017-08-02'},
-				{to_date: '2017-08-04'},
-				{mark_as_present: 0},
-				{reason: "Sick Leave."}
-			]);
-		},
-		() => frappe.tests.click_button('Submit'), // Submitting the leave application
-		() => frappe.timeout(0.7),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.7),
-		() => {
-			assert.equal(cur_frm.doc.docstatus, 1, "Submitted leave application");
-			leave_code = frappe.get_route()[2];
-		},
-		() => frappe.tests.click_button('Cancel'), // Cancelling the leave application
-		() => frappe.timeout(0.7),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => {assert.equal(cur_frm.doc.docstatus, 2, "Cancelled leave application");},
-		() => frappe.tests.click_button('Amend'), // Amending the leave application
-		() => frappe.timeout(1),
-		() => {
-			cur_frm.doc.mark_as_present = 1;
-			cur_frm.save();
-		},
-		() => frappe.timeout(0.7),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.timeout(0.7),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.7),
-		() => {assert.equal(cur_frm.doc.amended_from, leave_code, "Amended successfully");},
-
-		() => frappe.timeout(0.5),
-		() => {
-			return frappe.tests.make('Student Leave Application', [
-				{student: student_code},
-				{from_date: '2017-08-07'},
-				{to_date: '2017-08-09'},
-				{mark_as_present: 0},
-				{reason: "Sick Leave."}
-			]);
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.timeout(0.7),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.7),
-		() => {
-			assert.equal(cur_frm.doc.docstatus, 1, "Submitted leave application");
-			leave_code = frappe.get_route()[2];
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/education/doctype/student_log/test_student_log.js b/erpnext/education/doctype/student_log/test_student_log.js
deleted file mode 100644
index 4c90c5f..0000000
--- a/erpnext/education/doctype/student_log/test_student_log.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Testing Student Module in Education
-QUnit.module('education');
-
-QUnit.test('Test: Student Log', function(assert){
-	assert.expect(9);
-	let done = assert.async();
-	let student_code;
-	frappe.run_serially([
-		() => frappe.db.get_value('Student', {'student_email_id': 'test2@testmail.com'}, 'name'),
-		(student) => {student_code = student.message.name;},
-		() => {
-			return frappe.tests.make("Student Log", [
-				{student: student_code},
-				{academic_year: '2016-17'},
-				{academic_term: '2016-17 (Semester 1)'},
-				{program: "Standard Test"},
-				{date: '2017-07-31'},
-				{student_batch: 'A'},
-				{log: 'This is Test log.'}
-			]);
-		},
-		() => {
-			assert.equal(cur_frm.doc.student, student_code, 'Student code was fetched properly');
-			assert.equal(cur_frm.doc.student_name, 'Fname Mname Lname', 'Student name was correctly auto-fetched');
-			assert.equal(cur_frm.doc.type, 'General', 'Default type selected');
-			assert.equal(cur_frm.doc.academic_year, '2016-17');
-			assert.equal(cur_frm.doc.academic_term, '2016-17 (Semester 1)');
-			assert.equal(cur_frm.doc.program, 'Standard Test', 'Program correctly selected');
-			assert.equal(cur_frm.doc.student_batch, 'A');
-			assert.equal(cur_frm.doc.date, '2017-07-31');
-			assert.equal(cur_frm.doc.log, 'This is Test log.');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/appraisal/test_appraisal.js b/erpnext/hr/doctype/appraisal/test_appraisal.js
deleted file mode 100644
index fb1354c..0000000
--- a/erpnext/hr/doctype/appraisal/test_appraisal.js
+++ /dev/null
@@ -1,57 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Expense Claim [HR]", function (assert) {
-	assert.expect(3);
-	let done = assert.async();
-	let employee_name;
-
-	frappe.run_serially([
-		// Creating Appraisal
-		() => frappe.set_route('List','Appraisal','List'),
-		() => frappe.timeout(0.3),
-		() => frappe.click_button('Make a new Appraisal'),
-		() => {
-			cur_frm.set_value('kra_template','Test Appraisal 1'),
-			cur_frm.set_value('start_date','2017-08-21'),
-			cur_frm.set_value('end_date','2017-09-21');
-		},
-		() => frappe.timeout(1),
-		() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 1','score',4),
-		() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 1','score_earned',2),
-		() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 2','score',4),
-		() => frappe.model.set_value('Appraisal Goal','New Appraisal Goal 2','score_earned',2),
-		() => frappe.timeout(1),
-		() => frappe.db.get_value('Employee', {'employee_name': 'Test Employee 1'}, 'name'),
-		(r) => {
-			employee_name = r.message.name;
-		},
-
-		() => frappe.timeout(1),
-		() => cur_frm.set_value('employee',employee_name),
-		() => cur_frm.set_value('employee_name','Test Employee 1'),
-		() => cur_frm.set_value('company','For Testing'),
-		() => frappe.click_button('Calculate Total Score'),
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-
-		// Submitting the Appraisal
-		() => frappe.click_button('Submit'),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(3),
-
-		// Checking if the appraisal is correctly set for the employee
-		() => {
-			assert.equal('Submitted',cur_frm.get_field('status').value,
-				'Appraisal is submitted');
-
-			assert.equal('Test Employee 1',cur_frm.get_field('employee_name').value,
-				'Appraisal is created for correct employee');
-
-			assert.equal(4,cur_frm.get_field('total_score').value,
-				'Total score is correctly calculated');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/appraisal_template/test_appraisal_template.js b/erpnext/hr/doctype/appraisal_template/test_appraisal_template.js
deleted file mode 100644
index 3eb64e0..0000000
--- a/erpnext/hr/doctype/appraisal_template/test_appraisal_template.js
+++ /dev/null
@@ -1,29 +0,0 @@
-QUnit.module('hr');
-QUnit.test("Test: Appraisal Template [HR]", function (assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		// Job Opening creation
-		() => {
-			frappe.tests.make('Appraisal Template', [
-				{ kra_title: 'Test Appraisal 1'},
-				{ description: 'This is just a test'},
-				{ goals: [
-					[
-						{ kra: 'Design'},
-						{ per_weightage: 50}
-					],
-					[
-						{ kra: 'Code creation'},
-						{ per_weightage: 50}
-					]
-				]},
-			]);
-		},
-		() => frappe.timeout(10),
-		() => {
-			assert.equal('Test Appraisal 1',cur_frm.doc.kra_title, 'Appraisal name correctly set');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/attendance/test_attendance.js b/erpnext/hr/doctype/attendance/test_attendance.js
deleted file mode 100644
index b3e7fef..0000000
--- a/erpnext/hr/doctype/attendance/test_attendance.js
+++ /dev/null
@@ -1,39 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Attendance [HR]", function (assert) {
-	assert.expect(4);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// test attendance creation for one employee
-		() => frappe.set_route("List", "Attendance", "List"),
-		() => frappe.timeout(0.5),
-		() => frappe.new_doc("Attendance"),
-		() => frappe.timeout(1),
-		() => assert.equal("Attendance", cur_frm.doctype,
-			"Form for new Attendance opened successfully."),
-		// set values in form
-		() => cur_frm.set_value("company", "For Testing"),
-		() => {
-			frappe.db.get_value('Employee', {'employee_name':'Test Employee 1'}, 'name', function(r) {
-				cur_frm.set_value("employee", r.name)
-			});
-		},
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		// check docstatus of attendance before submit [Draft]
-		() => assert.equal("0", cur_frm.doc.docstatus,
-			"attendance is currently drafted"),
-		// check docstatus of attendance after submit [Present]
-		() => cur_frm.savesubmit(),
-		() => frappe.timeout(0.5),
-		() => frappe.click_button('Yes'),
-		() => assert.equal("1", cur_frm.doc.docstatus,
-			"attendance is saved after submit"),
-		// check if auto filled date is present day
-		() => assert.equal(frappe.datetime.nowdate(), cur_frm.doc.attendance_date,
-			"attendance for Present day is marked"),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/employee/test_employee.js b/erpnext/hr/doctype/employee/test_employee.js
deleted file mode 100644
index 3a41458..0000000
--- a/erpnext/hr/doctype/employee/test_employee.js
+++ /dev/null
@@ -1,40 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Employee [HR]", function (assert) {
-	assert.expect(4);
-	let done = assert.async();
-	// let today_date = frappe.datetime.nowdate();
-	let employee_creation = (name, joining_date, birth_date) => {
-		frappe.run_serially([
-		// test employee creation
-			() => {
-				frappe.tests.make('Employee', [
-					{ employee_name: name},
-					{ salutation: 'Mr'},
-					{ company: 'For Testing'},
-					{ date_of_joining: joining_date},
-					{ date_of_birth: birth_date},
-					{ employment_type: 'Test Employment Type'},
-					{ holiday_list: 'Test Holiday List'},
-					{ branch: 'Test Branch'},
-					{ department: 'Test Department'},
-					{ designation: 'Test Designation'}
-				]);
-			},
-			() => frappe.timeout(2),
-			() => {
-				assert.ok(cur_frm.get_field('employee_name').value==name,
-					'Name of an Employee is correctly set');
-				assert.ok(cur_frm.get_field('gender').value=='Male',
-					'Gender of an Employee is correctly set');
-			},
-		]);
-	};
-	frappe.run_serially([
-		() => employee_creation('Test Employee 1','2017-04-01','1992-02-02'),
-		() => frappe.timeout(10),
-		() => employee_creation('Test Employee 3','2017-04-01','1992-02-02'),
-		() => frappe.timeout(10),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.js b/erpnext/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.js
deleted file mode 100644
index 48d4344..0000000
--- a/erpnext/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.js
+++ /dev/null
@@ -1,61 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Employee attendance tool [HR]", function (assert) {
-	assert.expect(2);
-	let done = assert.async();
-	let today_date = frappe.datetime.nowdate();
-	let date_of_attendance = frappe.datetime.add_days(today_date, -2);	// previous day
-
-	frappe.run_serially([
-		// create employee
-		() => {
-			return frappe.tests.make('Employee', [
-				{salutation: "Mr"},
-				{employee_name: "Test Employee 2"},
-				{company: "For Testing"},
-				{date_of_joining: frappe.datetime.add_months(today_date, -2)},	// joined 2 month from now
-				{date_of_birth: frappe.datetime.add_months(today_date, -240)},	// age is 20 years
-				{employment_type: "Test Employment type"},
-				{holiday_list: "Test Holiday list"},
-				{branch: "Test Branch"},
-				{department: "Test Department"},
-				{designation: "Test Designation"}
-			]);
-		},
-		() => frappe.set_route("Form", "Employee Attendance Tool"),
-		() => frappe.timeout(0.5),
-		() => assert.equal("Employee Attendance Tool", cur_frm.doctype,
-			"Form for Employee Attendance Tool opened successfully."),
-		// set values in form
-		() => cur_frm.set_value("date", date_of_attendance),
-		() => cur_frm.set_value("branch", "Test Branch"),
-		() => cur_frm.set_value("department", "Test Department"),
-		() => cur_frm.set_value("company", "For Testing"),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Check all'),
-		() => frappe.click_button('Mark Present'),
-		// check if attendance is marked
-		() => frappe.set_route("List", "Attendance", "List"),
-		() => frappe.timeout(1),
-		() => {
-			return frappe.call({
-				method: "frappe.client.get_list",
-				args: {
-					doctype: "Employee",
-					filters: {
-						"branch": "Test Branch",
-						"department": "Test Department",
-						"company": "For Testing",
-						"status": "Active"
-					}
-				},
-				callback: function(r) {
-					let marked_attendance = cur_list.data.filter(d => d.attendance_date == date_of_attendance);
-					assert.equal(marked_attendance.length, r.message.length,
-						'all the attendance are marked for correct date');
-				}
-			});
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/employment_type/test_employment_type.js b/erpnext/hr/doctype/employment_type/test_employment_type.js
deleted file mode 100644
index fd7c6a1..0000000
--- a/erpnext/hr/doctype/employment_type/test_employment_type.js
+++ /dev/null
@@ -1,22 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Employment type [HR]", function (assert) {
-	assert.expect(1);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// test employment type creation
-		() => frappe.set_route("List", "Employment Type", "List"),
-		() => frappe.new_doc("Employment Type"),
-		() => frappe.timeout(1),
-		() => frappe.quick_entry.dialog.$wrapper.find('.edit-full').click(),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("employee_type_name", "Test Employment type"),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => assert.equal("Test Employment type", cur_frm.doc.employee_type_name,
-			'name of employment type correctly saved'),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/expense_claim/test_expense_claim.js b/erpnext/hr/doctype/expense_claim/test_expense_claim.js
deleted file mode 100644
index 2529fae..0000000
--- a/erpnext/hr/doctype/expense_claim/test_expense_claim.js
+++ /dev/null
@@ -1,44 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Expense Claim [HR]", function (assert) {
-	assert.expect(3);
-	let done = assert.async();
-	let employee_name;
-	let d;
-	frappe.run_serially([
-		// Creating Expense Claim
-		() => frappe.set_route('List','Expense Claim','List'),
-		() => frappe.timeout(0.3),
-		() => frappe.click_button('New'),
-		() => {
-			cur_frm.set_value('is_paid',1),
-			cur_frm.set_value('expenses',[]),
-			d = frappe.model.add_child(cur_frm.doc,'Expense Claim Detail','expenses'),
-			d.expense_date = '2017-08-01',
-			d.expense_type = 'Test Expense Type 1',
-			d.description  = 'This is just to test Expense Claim',
-			d.amount = 2000,
-			d.sanctioned_amount=2000,
-			refresh_field('expenses');
-		},
-		() => frappe.timeout(1),
-		() => cur_frm.set_value('employee','Test Employee 1'),
-		() => cur_frm.set_value('company','For Testing'),
-		() => cur_frm.set_value('payable_account','Creditors - FT'),
-		() => cur_frm.set_value('cost_center','Main - FT'),
-		() => cur_frm.set_value('mode_of_payment','Cash'),
-		() => cur_frm.save(),
-		() => frappe.click_button('Submit'),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(3),
-
-		// Checking if the amount is correctly reimbursed for the employee
-		() => {
-			assert.equal("Test Employee 1",cur_frm.doc.employee, 'Employee name set correctly');
-			assert.equal(1, cur_frm.doc.is_paid, 'Expense is paid as required');
-			assert.equal(2000, cur_frm.doc.total_amount_reimbursed, 'Amount is reimbursed correctly');
-
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.js b/erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.js
deleted file mode 100644
index 3c9ed35..0000000
--- a/erpnext/hr/doctype/expense_claim_type/test_expense_claim_type.js
+++ /dev/null
@@ -1,29 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Expense Claim Type [HR]", function (assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		// Creating a Expense Claim Type
-		() => {
-			frappe.tests.make('Expense Claim Type', [
-				{ expense_type: 'Test Expense Type 1'},
-				{ description:'This is just a test'},
-				{ accounts: [
-					[
-						{ company: 'For Testing'},
-						{ default_account: 'Rounded Off - FT'}
-					]
-				]},
-			]);
-		},
-		() => frappe.timeout(5),
-
-		// Checking if the created type is present in the list
-		() => {
-			assert.equal('Test Expense Type 1', cur_frm.doc.expense_type,
-				'Expense Claim Type created successfully');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/holiday_list/test_holiday_list.js b/erpnext/hr/doctype/holiday_list/test_holiday_list.js
deleted file mode 100644
index ce76614..0000000
--- a/erpnext/hr/doctype/holiday_list/test_holiday_list.js
+++ /dev/null
@@ -1,42 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Holiday list [HR]", function (assert) {
-	assert.expect(3);
-	let done = assert.async();
-	let date = frappe.datetime.add_months(frappe.datetime.nowdate(), -2);		// date 2 months from now
-
-	frappe.run_serially([
-		// test holiday list creation
-		() => frappe.set_route("List", "Holiday List", "List"),
-		() => frappe.new_doc("Holiday List"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("holiday_list_name", "Test Holiday list"),
-		() => cur_frm.set_value("from_date", date),
-		() => cur_frm.set_value("weekly_off", "Sunday"),		// holiday list for sundays
-		() => frappe.click_button('Get Weekly Off Dates'),
-
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => assert.equal("Test Holiday list", cur_frm.doc.holiday_list_name,
-			'name of holiday list correctly saved'),
-
-		// check if holiday list contains correct days
-		() => {
-			var list = cur_frm.doc.holidays;
-			var list_length = list.length;
-			var i = 0;
-			for ( ; i < list_length; i++)
-				if (list[i].description != 'Sunday') break;
-			assert.equal(list_length, i, "all holidays are sundays in holiday list");
-		},
-
-		// check if to_date is set one year from from_date
-		() => {
-			var date_year_later = frappe.datetime.add_days(frappe.datetime.add_months(date, 12), -1);		// date after one year
-			assert.equal(date_year_later, cur_frm.doc.to_date,
-				"to date set correctly");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py b/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py
index 4185f28..d2ec5b9 100644
--- a/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py
+++ b/erpnext/hr/doctype/interview_feedback/test_interview_feedback.py
@@ -59,7 +59,7 @@
 		}, 'average_rating')
 
 		# 1. average should be reflected in Interview Detail.
-		self.assertEqual(avg_on_interview_detail, round(feedback_1.average_rating))
+		self.assertEqual(avg_on_interview_detail, feedback_1.average_rating)
 
 		'''For Second Interviewer Feedback'''
 		interviewer = interview.interview_details[1].interviewer
diff --git a/erpnext/hr/doctype/job_applicant/test_job_applicant.js b/erpnext/hr/doctype/job_applicant/test_job_applicant.js
deleted file mode 100644
index 741a182..0000000
--- a/erpnext/hr/doctype/job_applicant/test_job_applicant.js
+++ /dev/null
@@ -1,28 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Job Opening [HR]", function (assert) {
-	assert.expect(2);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// Job Applicant creation
-		() => {
-			frappe.tests.make('Job Applicant', [
-				{ applicant_name: 'Utkarsh Goswami'},
-				{ email_id: 'goswamiutkarsh0@gmail.com'},
-				{ job_title: 'software-developer'},
-				{ cover_letter: 'Highly skilled in designing, testing, and developing software.'+
-					' This is just a test.'}
-			]);
-		},
-		() => frappe.timeout(4),
-		() => frappe.set_route('List','Job Applicant'),
-		() => frappe.timeout(3),
-		() => {
-			assert.ok(cur_list.data.length==1, 'Job Applicant created successfully');
-			assert.ok(cur_list.data[0].name=='Utkarsh Goswami - goswamiutkarsh0@gmail.com - software-developer',
-				'Correct job applicant with valid job title');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/job_offer/test_job_offer.js b/erpnext/hr/doctype/job_offer/test_job_offer.js
deleted file mode 100644
index 5339b9c..0000000
--- a/erpnext/hr/doctype/job_offer/test_job_offer.js
+++ /dev/null
@@ -1,51 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Job Offer [HR]", function (assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		// Job Offer Creation
-		() => {
-			frappe.tests.make('Job Offer', [
-				{ job_applicant: 'Utkarsh Goswami - goswamiutkarsh0@gmail.com - software-developer'},
-				{ applicant_name: 'Utkarsh Goswami'},
-				{ status: 'Accepted'},
-				{ designation: 'Software Developer'},
-				{ offer_terms: [
-					[
-						{offer_term: 'Responsibilities'},
-						{value: 'Design, installation, testing and maintenance of software systems.'}
-					],
-					[
-						{offer_term: 'Department'},
-						{value: 'Research & Development'}
-					],
-					[
-						{offer_term: 'Probationary Period'},
-						{value: 'The Probation period is for 3 months.'}
-					]
-				]},
-			]);
-		},
-		() => frappe.timeout(10),
-		() => frappe.click_button('Submit'),
-		() => frappe.timeout(2),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(5),
-		// To check if the fields are correctly set
-		() => {
-			assert.ok(cur_frm.get_field('status').value=='Accepted',
-				'Status of job offer is correct');
-			assert.ok(cur_frm.get_field('designation').value=='Software Developer',
-				'Designation of applicant is correct');
-		},
-		() => frappe.set_route('List','Job Offer','List'),
-		() => frappe.timeout(2),
-		// Checking the submission of and Job Offer
-		() => {
-			assert.ok(cur_list.data[0].docstatus==1,'Job Offer Submitted successfully');
-		},
-		() => frappe.timeout(2),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/job_opening/test_job_opening.js b/erpnext/hr/doctype/job_opening/test_job_opening.js
deleted file mode 100644
index cc2f027..0000000
--- a/erpnext/hr/doctype/job_opening/test_job_opening.js
+++ /dev/null
@@ -1,26 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Job Opening [HR]", function (assert) {
-	assert.expect(2);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// Job Opening creation
-		() => {
-			frappe.tests.make('Job Opening', [
-				{ job_title: 'Software Developer'},
-				{ description:
-					'You might be responsible for writing and coding individual'+
-					' programmes or providing an entirely new software resource.'}
-			]);
-		},
-		() => frappe.timeout(4),
-		() => frappe.set_route('List','Job Opening'),
-		() => frappe.timeout(3),
-		() => {
-			assert.ok(cur_list.data.length==1, 'Job Opening created successfully');
-			assert.ok(cur_list.data[0].job_title=='Software Developer', 'Job title Correctly set');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/leave_allocation/test_leave_allocation.js b/erpnext/hr/doctype/leave_allocation/test_leave_allocation.js
deleted file mode 100644
index d5364fc..0000000
--- a/erpnext/hr/doctype/leave_allocation/test_leave_allocation.js
+++ /dev/null
@@ -1,41 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Leave allocation [HR]", function (assert) {
-	assert.expect(3);
-	let done = assert.async();
-	let today_date = frappe.datetime.nowdate();
-
-	frappe.run_serially([
-		// test creating leave alloction
-		() => frappe.set_route("List", "Leave Allocation", "List"),
-		() => frappe.new_doc("Leave Allocation"),
-		() => frappe.timeout(1),
-		() => {
-			frappe.db.get_value('Employee', {'employee_name':'Test Employee 1'}, 'name', function(r) {
-				cur_frm.set_value("employee", r.name)
-			});
-		},
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("leave_type", "Test Leave type"),
-		() => cur_frm.set_value("to_date", frappe.datetime.add_months(today_date, 2)),	// for two months
-		() => cur_frm.set_value("description", "This is just for testing"),
-		() => cur_frm.set_value("new_leaves_allocated", 2),
-		() => frappe.click_check('Add unused leaves from previous allocations'),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => cur_frm.savesubmit(),
-		() => frappe.timeout(1),
-		() => assert.equal("Confirm", cur_dialog.title,
-			'confirmation for leave alloction shown'),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(1),
-		// check auto filled from date
-		() => assert.equal(today_date, cur_frm.doc.from_date,
-			"from date correctly set"),
-		// check for total leaves
-		() => assert.equal(cur_frm.doc.unused_leaves + 2, cur_frm.doc.total_leaves_allocated,
-			"total leave calculation is correctly set"),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.js b/erpnext/hr/doctype/leave_application/test_leave_application.js
deleted file mode 100644
index 0866b0b..0000000
--- a/erpnext/hr/doctype/leave_application/test_leave_application.js
+++ /dev/null
@@ -1,42 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Leave application [HR]", function (assert) {
-	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
-
-	frappe.run_serially([
-		// test creating leave application
-		() => frappe.db.get_value('Employee', {'employee_name':'Test Employee 1'}, 'name'),
-		(employee) => {
-			return frappe.tests.make('Leave Application', [
-				{leave_type: "Test Leave type"},
-				{from_date: leave_date},	// for today
-				{to_date: leave_date},
-				{half_day: 1},
-				{employee: employee.message.name},
-				{follow_via_email: 0}
-			]);
-		},
-
-		() => frappe.timeout(1),
-		() => frappe.click_button('Actions'),
-		() => frappe.click_link('Approve'), // approve the application [as administrator]
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => assert.ok(cur_frm.doc.docstatus,
-			"leave application submitted after approval"),
-
-		// check auto filled posting date [today]
-
-		() => assert.equal(today_date, cur_frm.doc.posting_date,
-			"posting date correctly set"),
-		() => frappe.set_route("List", "Leave Application", "List"),
-		() => frappe.timeout(1),
-		// // check approved application in list
-		() => assert.deepEqual(["Test Employee 1", 1], [cur_list.data[0].employee_name, cur_list.data[0].docstatus]),
-		// 	"leave for correct employee is submitted"),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/leave_block_list/test_leave_block_list.js b/erpnext/hr/doctype/leave_block_list/test_leave_block_list.js
deleted file mode 100644
index b39601b..0000000
--- a/erpnext/hr/doctype/leave_block_list/test_leave_block_list.js
+++ /dev/null
@@ -1,27 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Leave block list [HR]", function (assert) {
-	assert.expect(1);
-	let done = assert.async();
-	let today_date = frappe.datetime.nowdate();
-
-	frappe.run_serially([
-		// test leave block list creation
-		() => frappe.set_route("List", "Leave Block List", "List"),
-		() => frappe.new_doc("Leave Block List"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("leave_block_list_name", "Test Leave block list"),
-		() => cur_frm.set_value("company", "For Testing"),
-		() => frappe.click_button('Add Row'),
-		() => {
-			cur_frm.fields_dict.leave_block_list_dates.grid.grid_rows[0].doc.block_date = today_date;
-			cur_frm.fields_dict.leave_block_list_dates.grid.grid_rows[0].doc.reason = "Blocked leave test";
-		},
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => assert.equal("Test Leave block list", cur_frm.doc.leave_block_list_name,
-			'name of blocked leave list correctly saved'),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.js b/erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.js
deleted file mode 100644
index 9d37327..0000000
--- a/erpnext/hr/doctype/leave_control_panel/test_leave_control_panel.js
+++ /dev/null
@@ -1,50 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Leave control panel [HR]", function (assert) {
-	assert.expect(2);
-	let done = assert.async();
-	let today_date = frappe.datetime.nowdate();
-
-	frappe.run_serially([
-		// test leave allocation using leave control panel
-		() => frappe.set_route("Form", "Leave Control Panel"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("leave_type", "Test Leave type"),
-		() => cur_frm.set_value("company", "For Testing"),
-		() => cur_frm.set_value("employment_type", "Test Employment Type"),
-		() => cur_frm.set_value("branch", "Test Branch"),
-		() => cur_frm.set_value("department", "Test Department"),
-		() => cur_frm.set_value("designation", "Test Designation"),
-		() => cur_frm.set_value("from_date", frappe.datetime.add_months(today_date, -2)),
-		() => cur_frm.set_value("to_date", frappe.datetime.add_days(today_date, -1)),	// for two months [not today]
-		() => cur_frm.set_value("no_of_days", 3),
-		// allocate leaves
-		() => frappe.click_button('Allocate'),
-		() => frappe.timeout(1),
-		() => assert.equal("Message", cur_dialog.title, "leave alloction message shown"),
-		() => frappe.click_button('Close'),
-		() => frappe.set_route("List", "Leave Allocation", "List"),
-		() => frappe.timeout(1),
-		() => {
-			return frappe.call({
-				method: "frappe.client.get_list",
-				args: {
-					doctype: "Employee",
-					filters: {
-						"branch": "Test Branch",
-						"department": "Test Department",
-						"company": "For Testing",
-						"designation": "Test Designation",
-						"status": "Active"
-					}
-				},
-				callback: function(r) {
-					let leave_allocated = cur_list.data.filter(d => d.leave_type == "Test Leave type");
-					assert.equal(r.message.length, leave_allocated.length,
-						'leave allocation successfully done for all the employees');
-				}
-			});
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/leave_type/test_leave_type.js b/erpnext/hr/doctype/leave_type/test_leave_type.js
deleted file mode 100644
index db910cd..0000000
--- a/erpnext/hr/doctype/leave_type/test_leave_type.js
+++ /dev/null
@@ -1,22 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Leave type [HR]", function (assert) {
-	assert.expect(1);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// test leave type creation
-		() => frappe.set_route("List", "Leave Type", "List"),
-		() => frappe.new_doc("Leave Type"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("leave_type_name", "Test Leave type"),
-		() => cur_frm.set_value("max_continuous_days_allowed", "5"),
-		() => frappe.click_check('Is Carry Forward'),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => assert.equal("Test Leave type", cur_frm.doc.leave_type_name,
-			'leave type correctly saved'),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/training_event/tests/test_training_event.js b/erpnext/hr/doctype/training_event/tests/test_training_event.js
deleted file mode 100644
index 08031a1..0000000
--- a/erpnext/hr/doctype/training_event/tests/test_training_event.js
+++ /dev/null
@@ -1,59 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Training Event [HR]", function (assert) {
-	assert.expect(5);
-	let done = assert.async();
-	let employee_name;
-
-	frappe.run_serially([
-		//  Creation of Training Event
-		() => frappe.db.get_value('Employee', {'employee_name': 'Test Employee 1'}, 'name'),
-		(r) => {
-			employee_name = r.message.name;
-		},
-		() => {
-			frappe.tests.make('Training Event', [
-				{ event_name: 'Test Training Event 1'},
-				{ location: 'Mumbai'},
-				{ start_time: '2017-09-01 11:00:0'},
-				{ end_time: '2017-09-01 17:00:0'},
-				{ introduction: 'This is just a test'},
-				{ employees: [
-					[
-						{employee: employee_name},
-						{employee_name: 'Test Employee 1'},
-						{attendance: 'Optional'}
-					]
-				]},
-			]);
-		},
-		() => frappe.timeout(7),
-		() => frappe.click_button('Submit'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(8),
-		() => {
-			// To check if the fields are correctly set
-			assert.ok(cur_frm.get_field('event_name').value == 'Test Training Event 1',
-				'Event created successfully');
-
-			assert.ok(cur_frm.get_field('event_status').value=='Scheduled',
-				'Status of event is correctly set');
-
-			assert.ok(cur_frm.doc.employees[0].employee_name=='Test Employee 1',
-				'Attendee Employee is correctly set');
-
-			assert.ok(cur_frm.doc.employees[0].attendance=='Optional',
-				'Attendance is correctly set');
-		},
-
-		() => frappe.set_route('List','Training Event','List'),
-		() => frappe.timeout(2),
-		// Checking the submission of Training Event
-		() => {
-			assert.ok(cur_list.data[0].docstatus==1,'Training Event Submitted successfully');
-		},
-		() => frappe.timeout(2),
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/training_feedback/test_training_feedback.js b/erpnext/hr/doctype/training_feedback/test_training_feedback.js
deleted file mode 100644
index 5c825ae..0000000
--- a/erpnext/hr/doctype/training_feedback/test_training_feedback.js
+++ /dev/null
@@ -1,51 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Training Feedback [HR]", function (assert) {
-	assert.expect(3);
-	let done = assert.async();
-	let employee_name;
-
-	frappe.run_serially([
-		// Creating Training Feedback
-		() => frappe.set_route('List','Training Feedback','List'),
-		() => frappe.timeout(0.3),
-		() => frappe.click_button('Make a new Training Feedback'),
-		() => frappe.timeout(1),
-		() => frappe.db.get_value('Employee', {'employee_name': 'Test Employee 1'}, 'name'),
-		(r) => {
-			employee_name = r.message.name;
-		},
-		() => cur_frm.set_value('employee',employee_name),
-		() => cur_frm.set_value('employee_name','Test Employee 1'),
-		() => cur_frm.set_value('training_event','Test Training Event 1'),
-		() => cur_frm.set_value('event_name','Test Training Event 1'),
-		() => cur_frm.set_value('feedback','Great Experience. This is just a test.'),
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-
-		// Submitting the feedback
-		() => frappe.click_button('Submit'),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(3),
-
-		// Checking if the feedback is given by correct employee
-		() => {
-			assert.equal('Test Employee 1',cur_frm.get_field('employee_name').value,
-				'Feedback is given by correct employee');
-
-			assert.equal('Test Training Event 1',cur_frm.get_field('training_event').value,
-				'Feedback is given for correct event');
-		},
-
-		() => frappe.set_route('List','Training Feedback','List'),
-		() => frappe.timeout(2),
-
-		// Checking the submission of Training Result
-		() => {
-			assert.ok(cur_list.data[0].docstatus==1,'Training Feedback Submitted successfully');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/hr/doctype/training_result_employee/test_training_result.js b/erpnext/hr/doctype/training_result_employee/test_training_result.js
deleted file mode 100644
index 3f39750..0000000
--- a/erpnext/hr/doctype/training_result_employee/test_training_result.js
+++ /dev/null
@@ -1,52 +0,0 @@
-QUnit.module('hr');
-
-QUnit.test("Test: Training Result [HR]", function (assert) {
-	assert.expect(5);
-	let done = assert.async();
-	frappe.run_serially([
-		// Creating Training Result
-		() => frappe.set_route('List','Training Result','List'),
-		() => frappe.timeout(0.3),
-		() => frappe.click_button('Make a new Training Result'),
-		() => {
-			cur_frm.set_value('training_event','Test Training Event 1');
-		},
-		() => frappe.timeout(1),
-		() => frappe.model.set_value('Training Result Employee','New Training Result Employee 1','hours',4),
-		() => frappe.model.set_value('Training Result Employee','New Training Result Employee 1','grade','A'),
-		() => frappe.model.set_value('Training Result Employee','New Training Result Employee 1','comments','Nice Seminar'),
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => cur_frm.save(),
-
-		// Submitting the Training Result
-		() => frappe.click_button('Submit'),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(4),
-
-		// Checking if the fields are correctly set
-		() => {
-			assert.equal('Test Training Event 1',cur_frm.get_field('training_event').value,
-				'Training Result is created');
-
-			assert.equal('Test Employee 1',cur_frm.doc.employees[0].employee_name,
-				'Training Result is created for correct employee');
-
-			assert.equal(4,cur_frm.doc.employees[0].hours,
-				'Hours field is correctly calculated');
-
-			assert.equal('A',cur_frm.doc.employees[0].grade,
-				'Grade field is correctly set');
-		},
-
-		() => frappe.set_route('List','Training Result','List'),
-		() => frappe.timeout(2),
-
-		// Checking the submission of Training Result
-		() => {
-			assert.ok(cur_list.data[0].docstatus==1,'Training Result Submitted successfully');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
index 37ea3fd..5017126 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
@@ -56,9 +56,14 @@
 
 		ms.submit()
 		s_id = ms.get_pending_data(data_type = "id", item_name = i.item_name, s_date = expected_dates[1])
-		test = make_maintenance_visit(source_name = ms.name, item_name = "_Test Item", s_id = s_id)
+
+		# Check if item is mapped in visit.
+		test_map_visit = make_maintenance_visit(source_name = ms.name, item_name = "_Test Item", s_id = s_id)
+		self.assertEqual(len(test_map_visit.purposes), 1)
+		self.assertEqual(test_map_visit.purposes[0].item_name, "_Test Item")
+
 		visit = frappe.new_doc('Maintenance Visit')
-		visit = test
+		visit = test_map_visit
 		visit.maintenance_schedule = ms.name
 		visit.maintenance_schedule_detail = s_id
 		visit.completion_status = "Partially Completed"
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
index 6f6ca61..d2197a6 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
@@ -47,7 +47,7 @@
 			frm.set_value({ status: 'Draft' });
 		}
 		if (frm.doc.__islocal) {
-			frm.clear_table("purposes");
+			frm.doc.maintenance_type == 'Unscheduled' && frm.clear_table("purposes");
 			frm.set_value({ mntc_date: frappe.datetime.get_today() });
 		}
 	},
diff --git a/erpnext/manufacturing/doctype/bom/test_bom.js b/erpnext/manufacturing/doctype/bom/test_bom.js
deleted file mode 100644
index 98a9198..0000000
--- a/erpnext/manufacturing/doctype/bom/test_bom.js
+++ /dev/null
@@ -1,63 +0,0 @@
-QUnit.test("test: item", function (assert) {
-	assert.expect(1);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// test item creation
-		() => frappe.set_route("List", "Item"),
-
-		// Create a BOM for a laptop
-		() => frappe.tests.make(
-			"BOM", [
-				{item: "Laptop"},
-				{quantity: 1},
-				{with_operations: 1},
-				{company: "For Testing"},
-				{operations: [
-					[
-						{operation: "Assemble CPU"},
-						{time_in_mins: 60},
-					],
-					[
-						{operation: "Assemble Keyboard"},
-						{time_in_mins: 30},
-					],
-					[
-						{operation: "Assemble Screen"},
-						{time_in_mins: 30},
-					]
-				]},
-				{scrap_items: [
-					[
-						{item_code: "Scrap item"}
-					]
-				]},
-				{items: [
-					[
-						{item_code: "CPU"},
-						{qty: 1}
-					],
-					[
-						{item_code: "Keyboard"},
-						{qty: 1}
-					],
-					[
-						{item_code: "Screen"},
-						{qty: 1}
-					]
-				]},
-			]
-		),
-		() => cur_frm.savesubmit(),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(1),
-
-		() => {
-			assert.ok(cur_frm.doc.operating_cost + cur_frm.doc.raw_material_cost -
-			cur_frm.doc.scrap_material_cost == cur_frm.doc.total_cost, 'Total_Cost calculated correctly');
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/manufacturing/doctype/operation/test_operation.js b/erpnext/manufacturing/doctype/operation/test_operation.js
deleted file mode 100644
index fd7783f..0000000
--- a/erpnext/manufacturing/doctype/operation/test_operation.js
+++ /dev/null
@@ -1,49 +0,0 @@
-QUnit.test("test: operation", function (assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		// test operation creation
-		() => frappe.set_route("List", "Operation"),
-
-		// Create a Keyboard operation
-		() => {
-			return frappe.tests.make(
-				"Operation", [
-					{__newname: "Assemble Keyboard"},
-					{workstation: "Keyboard assembly workstation"}
-				]
-			);
-		},
-		() => frappe.timeout(3),
-		() => {
-			assert.ok(cur_frm.docname.includes('Assemble Keyboard'),
-				'Assemble Keyboard created successfully');
-			assert.ok(cur_frm.doc.workstation.includes('Keyboard assembly workstation'),
-				'Keyboard assembly workstation was linked successfully');
-		},
-
-		// Create a Screen operation
-		() => {
-			return frappe.tests.make(
-				"Operation", [
-					{__newname: 'Assemble Screen'},
-					{workstation: "Screen assembly workstation"}
-				]
-			);
-		},
-		() => frappe.timeout(3),
-
-		// Create a CPU operation
-		() => {
-			return frappe.tests.make(
-				"Operation", [
-					{__newname: 'Assemble CPU'},
-					{workstation: "CPU assembly workstation"}
-				]
-			);
-		},
-		() => frappe.timeout(3),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.js b/erpnext/manufacturing/doctype/work_order/test_work_order.js
deleted file mode 100644
index 1e224eb..0000000
--- a/erpnext/manufacturing/doctype/work_order/test_work_order.js
+++ /dev/null
@@ -1,130 +0,0 @@
-QUnit.test("test: work order", function (assert) {
-	assert.expect(25);
-	let done = assert.async();
-	let laptop_quantity = 5;
-	let items = ["CPU", "Keyboard", "Screen"];
-	let operation_items = ["CPU", "Keyboard", "Screen"];
-	let click_make = () => {
-		let element = $(`.btn-primary:contains("Make"):visible`);
-		if(!element.length) {
-			throw `did not find any button containing 'Make'`;
-		}
-		element.click();
-		return frappe.timeout(1);
-	};
-
-	frappe.run_serially([
-		// test work order
-		() => frappe.set_route("List", "Work Order", "List"),
-		() => frappe.timeout(3),
-
-		// Create a laptop work order
-		() => {
-			return frappe.tests.make('Work Order', [
-				{production_item: 'Laptop'},
-				{company: 'For Testing'},
-				{qty: laptop_quantity},
-				{scrap_warehouse: "Laptop Scrap Warehouse - FT"},
-				{wip_warehouse: "Work In Progress - FT"},
-				{fg_warehouse: "Finished Goods - FT"}
-			]);
-		},
-		() => frappe.timeout(3),
-		() => {
-			assert.equal(cur_frm.doc.planned_operating_cost, cur_frm.doc.total_operating_cost,
-				"Total and Planned Cost is equal");
-			assert.equal(cur_frm.doc.planned_operating_cost, cur_frm.doc.total_operating_cost,
-				"Total and Planned Cost is equal");
-
-			items.forEach(function(item, index) {
-				assert.equal(item, cur_frm.doc.required_items[index].item_code, `Required item ${item} added`);
-				assert.equal("Stores - FT", cur_frm.doc.required_items[index].source_warehouse, `Item ${item} warhouse verified`);
-				assert.equal("5", cur_frm.doc.required_items[index].required_qty, `Item ${item} quantity verified`);
-			});
-
-			operation_items.forEach(function(operation_item, index) {
-				assert.equal(`Assemble ${operation_item}`, cur_frm.doc.operations[index].operation,
-					`Operation ${operation_item} added`);
-				assert.equal(`${operation_item} assembly workstation`, cur_frm.doc.operations[index].workstation,
-					`Workstation ${operation_item} linked`);
-			});
-		},
-
-		// Submit the work order
-		() => cur_frm.savesubmit(),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(2.5),
-
-		// Confirm the work order timesheet, save and submit it
-		() => frappe.click_link("TS-00"),
-		() => frappe.timeout(1),
-		() => frappe.click_button("Submit"),
-		() => frappe.timeout(1),
-		() => frappe.click_button("Yes"),
-		() => frappe.timeout(2.5),
-
-		// Start the work order process
-		() => frappe.set_route("List", "Work Order", "List"),
-		() => frappe.timeout(2),
-		() => frappe.click_link("Laptop"),
-		() => frappe.timeout(1),
-		() => frappe.click_button("Start"),
-		() => frappe.timeout(0.5),
-		() => click_make(),
-		() => frappe.timeout(1),
-		() => frappe.click_button("Save"),
-		() => frappe.timeout(0.5),
-
-		() => {
-			assert.equal(cur_frm.doc.total_outgoing_value, cur_frm.doc.total_incoming_value,
-				"Total incoming and outgoing cost is equal");
-			assert.equal(cur_frm.doc.total_outgoing_value, "99000",
-				"Outgoing cost is correct"); // Price of each item x5
-		},
-		// Submit for work
-		() => frappe.click_button("Submit"),
-		() => frappe.timeout(0.5),
-		() => frappe.click_button("Yes"),
-		() => frappe.timeout(0.5),
-
-		// Finish the work order by sending for manufacturing
-		() => frappe.set_route("List", "Work Order"),
-		() => frappe.timeout(1),
-		() => frappe.click_link("Laptop"),
-		() => frappe.timeout(1),
-
-		() => {
-			assert.ok(frappe.tests.is_visible("5 items in progress", 'p'), "Work order initiated");
-			assert.ok(frappe.tests.is_visible("Finish"), "Finish button visible");
-		},
-
-		() => frappe.click_button("Finish"),
-		() => frappe.timeout(0.5),
-		() => click_make(),
-		() => {
-			assert.equal(cur_frm.doc.total_incoming_value, "105700",
-				"Incoming cost is correct "+cur_frm.doc.total_incoming_value); // Price of each item x5, values are in INR
-			assert.equal(cur_frm.doc.total_outgoing_value, "99000",
-				"Outgoing cost is correct"); // Price of each item x5, values are in INR
-			assert.equal(cur_frm.doc.total_incoming_value - cur_frm.doc.total_outgoing_value, cur_frm.doc.value_difference,
-				"Value difference is correct"); // Price of each item x5, values are in INR
-		},
-		() => frappe.click_button("Save"),
-		() => frappe.timeout(1),
-		() => frappe.click_button("Submit"),
-		() => frappe.timeout(1),
-		() => frappe.click_button("Yes"),
-		() => frappe.timeout(1),
-
-		// Manufacturing finished
-		() => frappe.set_route("List", "Work Order", "List"),
-		() => frappe.timeout(1),
-		() => frappe.click_link("Laptop"),
-		() => frappe.timeout(1),
-
-		() => assert.ok(frappe.tests.is_visible("5 items produced", 'p'), "Work order completed"),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/manufacturing/doctype/workstation/test_workstation.js b/erpnext/manufacturing/doctype/workstation/test_workstation.js
deleted file mode 100644
index 1df53d0..0000000
--- a/erpnext/manufacturing/doctype/workstation/test_workstation.js
+++ /dev/null
@@ -1,89 +0,0 @@
-QUnit.test("test: workstation", function (assert) {
-	assert.expect(9);
-	let done = assert.async();
-	let elec_rate = 50;
-	let rent = 100;
-	let consumable_rate = 20;
-	let labour_rate = 500;
-	frappe.run_serially([
-		// test workstation creation
-		() => frappe.set_route("List", "Workstation"),
-
-		// Create a keyboard workstation
-		() => frappe.tests.make(
-			"Workstation", [
-				{workstation_name: "Keyboard assembly workstation"},
-				{hour_rate_electricity: elec_rate},
-				{hour_rate_rent: rent},
-				{hour_rate_consumable: consumable_rate},
-				{hour_rate_labour: labour_rate},
-				{working_hours: [
-					[
-						{enabled: 1},
-						{start_time: '11:00:00'},
-						{end_time: '18:00:00'}
-					]
-				]}
-			]
-		),
-		() => {
-			assert.ok(cur_frm.doc.workstation_name.includes('Keyboard assembly workstation'),
-				'Keyboard assembly workstation created successfully');
-			assert.equal(cur_frm.doc.hour_rate_electricity, elec_rate,
-				'electricity rate set correctly');
-			assert.equal(cur_frm.doc.hour_rate_rent, rent,
-				'rent set correctly');
-			assert.equal(cur_frm.doc.hour_rate_consumable, consumable_rate,
-				'consumable rate set correctly');
-			assert.equal(cur_frm.doc.hour_rate_labour, labour_rate,
-				'labour rate set correctly');
-			assert.equal(cur_frm.doc.working_hours[0].enabled, 1,
-				'working hours enabled');
-			assert.ok(cur_frm.doc.working_hours[0].start_time.includes('11:00:0'),
-				'start time set correctly');
-			assert.ok(cur_frm.doc.working_hours[0].end_time.includes('18:00:0'),
-				'end time set correctly');
-			assert.ok(cur_frm.doc.hour_rate_electricity+cur_frm.doc.hour_rate_rent+
-				cur_frm.doc.hour_rate_consumable+cur_frm.doc.hour_rate_labour==
-				cur_frm.doc.hour_rate, 'Net hour rate set correctly');
-		},
-
-		// Create a Screen workstation
-		() => frappe.tests.make(
-			"Workstation", [
-				{workstation_name: "Screen assembly workstation"},
-				{hour_rate_electricity: elec_rate},
-				{hour_rate_rent: rent},
-				{hour_rate_consumable: consumable_rate},
-				{hour_rate_labour: labour_rate},
-				{working_hours: [
-					[
-						{enabled: 1},
-						{start_time: '11:00:00'},
-						{end_time: '18:00:00'}
-					]
-				]}
-			]
-		),
-
-		// Create a CPU workstation
-		() => frappe.tests.make(
-			"Workstation", [
-				{workstation_name: "CPU assembly workstation"},
-				{hour_rate_electricity: elec_rate},
-				{hour_rate_rent: rent},
-				{hour_rate_consumable: consumable_rate},
-				{hour_rate_labour: labour_rate},
-				{working_hours: [
-					[
-						{enabled: 1},
-						{start_time: '11:00:00'},
-						{end_time: '18:00:00'}
-					]
-				]}
-			]
-		),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/non_profit/doctype/donor/test_donor.js b/erpnext/non_profit/doctype/donor/test_donor.js
deleted file mode 100644
index e478b34..0000000
--- a/erpnext/non_profit/doctype/donor/test_donor.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Donor", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(3);
-
-	frappe.run_serially([
-		// insert a new Member
-		() => frappe.tests.make('Donor', [
-			// values to be set
-			{donor_name: 'Test Donor'},
-			{donor_type: 'Test Organization'},
-			{email: 'test@example.com'}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.donor_name, 'Test Donor');
-			assert.equal(cur_frm.doc.donor_type, 'Test Organization');
-			assert.equal(cur_frm.doc.email, 'test@example.com');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/non_profit/doctype/grant_application/test_grant_application.js b/erpnext/non_profit/doctype/grant_application/test_grant_application.js
deleted file mode 100644
index 47230a5..0000000
--- a/erpnext/non_profit/doctype/grant_application/test_grant_application.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Grant Application", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(4);
-
-	frappe.run_serially([
-		// insert a new Member
-		() => frappe.tests.make('Grant Application', [
-			// values to be set
-			{applicant_name: 'Test Organization'},
-			{contact_person:'Test Applicant'},
-			{email: 'test@example.com'},
-			{grant_description:'Test message'},
-			{amount: 150000}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.applicant_name, 'Test Organization');
-			assert.equal(cur_frm.doc.contact_person, 'Test Applicant');
-			assert.equal(cur_frm.doc.email, 'test@example.com');
-			assert.equal(cur_frm.doc.amount, 150000);
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/non_profit/doctype/member/test_member.js b/erpnext/non_profit/doctype/member/test_member.js
deleted file mode 100644
index f7cca97..0000000
--- a/erpnext/non_profit/doctype/member/test_member.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Member", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(2);
-
-	frappe.run_serially([
-		// insert a new Member
-		() => frappe.tests.make('Member', [
-			// values to be set
-			{member_name: 'Test Member'},
-			{membership_type: 'Gold'},
-			{email: 'test@example.com'}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.membership_type, 'Gold');
-			assert.equal(cur_frm.doc.email, 'test@example.com');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/non_profit/doctype/membership_type/test_membership_type.js b/erpnext/non_profit/doctype/membership_type/test_membership_type.js
deleted file mode 100644
index 6440df8..0000000
--- a/erpnext/non_profit/doctype/membership_type/test_membership_type.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Membership Type", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(2);
-
-	frappe.run_serially([
-		// insert a new Member
-		() => frappe.tests.make('Membership Type', [
-			// values to be set
-			{membership_type: 'Gold'},
-			{amount:50000}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.membership_type, 'Gold');
-			assert.equal(cur_frm.doc.amount, '50000');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/non_profit/doctype/volunteer/test_volunteer.js b/erpnext/non_profit/doctype/volunteer/test_volunteer.js
deleted file mode 100644
index 45eb281..0000000
--- a/erpnext/non_profit/doctype/volunteer/test_volunteer.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Volunteer", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(4);
-
-	frappe.run_serially([
-		// insert a new Member
-		() => frappe.tests.make('Volunteer', [
-			// values to be set
-			{volunteer_name: 'Test Volunteer'},
-			{volunteer_type:'Test Work'},
-			{email:'test@example.com'},
-			{'availability': 'Weekends'},
-			{volunteer_skills:[
-					[
-						{'volunteer_skills': 'Fundraiser'},
-					]
-			]},
-		]),
-		() => {
-			assert.equal(cur_frm.doc.volunteer_name, 'Test Volunteer');
-			assert.equal(cur_frm.doc.volunteer_type, 'Test Work');
-			assert.equal(cur_frm.doc.email, 'test@example.com');
-			assert.equal(cur_frm.doc.availability, 'Weekends');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/non_profit/doctype/volunteer_type/test_volunteer_type.js b/erpnext/non_profit/doctype/volunteer_type/test_volunteer_type.js
deleted file mode 100644
index 08baaf0..0000000
--- a/erpnext/non_profit/doctype/volunteer_type/test_volunteer_type.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Volunteer Type", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(2);
-
-	frappe.run_serially([
-		// insert a new Member
-		() => {
-			return frappe.tests.make('Volunteer Type', [
-				// values to be set
-				{__newname: 'Test Work'},
-				{amount: 500}
-			]);
-		},
-		() => {
-			assert.equal(cur_frm.doc.name, 'Test Work');
-			assert.equal(cur_frm.doc.amount, 500);
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 65ad79e..d9cedab 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -316,5 +316,5 @@
 erpnext.patches.v14_0.rename_ongoing_status_in_sla_documents
 erpnext.patches.v14_0.migrate_crm_settings
 erpnext.patches.v13_0.rename_ksa_qr_field
-erpnext.patches.v13_0.disable_ksa_print_format_for_others
+erpnext.patches.v13_0.disable_ksa_print_format_for_others # 16-12-2021
 erpnext.patches.v14_0.add_default_exit_questionnaire_notification_template
\ No newline at end of file
diff --git a/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py b/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
index c815b3b..aa2a2d3 100644
--- a/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
+++ b/erpnext/patches/v13_0/disable_ksa_print_format_for_others.py
@@ -3,10 +3,13 @@
 
 import frappe
 
+from erpnext.regional.saudi_arabia.setup import add_print_formats
+
 
 def execute():
 	company = frappe.get_all('Company', filters = {'country': 'Saudi Arabia'})
 	if company:
+		add_print_formats()
 		return
 
 	if frappe.db.exists('DocType', 'Print Format'):
diff --git a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.js b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.js
deleted file mode 100644
index d24f243..0000000
--- a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.js
+++ /dev/null
@@ -1,62 +0,0 @@
-QUnit.module('HR');
-
-QUnit.test("test: Payroll Entry", function (assert) {
-	assert.expect(5);
-	let done = assert.async();
-	let employees, docname;
-
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Payroll Entry', [
-				{company: 'For Testing'},
-				{posting_date: frappe.datetime.add_days(frappe.datetime.nowdate(), 0)},
-				{payroll_frequency: 'Monthly'},
-				{cost_center: 'Main - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
-			]);
-		},
-
-		() => frappe.timeout(1),
-		() => {
-			assert.equal(cur_frm.doc.company, 'For Testing');
-			assert.equal(cur_frm.doc.posting_date, frappe.datetime.add_days(frappe.datetime.nowdate(), 0));
-			assert.equal(cur_frm.doc.cost_center, 'Main - FT');
-		},
-		() => frappe.click_button('Get Employee Details'),
-		() => {
-			employees = cur_frm.doc.employees.length;
-			docname = cur_frm.doc.name;
-		},
-
-		() => frappe.click_button('Submit'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(5),
-
-		() => frappe.click_button('View Salary Slip'),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_list.data.length, employees),
-
-		() => frappe.set_route('Form', 'Payroll Entry', docname),
-		() => frappe.timeout(2),
-		() => frappe.click_button('Submit Salary Slip'),
-		() => frappe.click_button('Yes'),
-		() => frappe.timeout(5),
-
-		() => frappe.click_button('Close'),
-		() => frappe.timeout(1),
-
-		() => frappe.click_button('View Salary Slip'),
-		() => frappe.timeout(2),
-		() => {
-			let count = 0;
-			for(var i = 0; i < employees; i++) {
-				if(cur_list.data[i].docstatus == 1){
-					count++;
-				}
-			}
-			assert.equal(count, employees, "Salary Slip submitted for all employees");
-		},
-
-		() => done()
-	]);
-});
diff --git a/erpnext/payroll/doctype/payroll_entry/test_set_salary_components.js b/erpnext/payroll/doctype/payroll_entry/test_set_salary_components.js
deleted file mode 100644
index 092cbd8..0000000
--- a/erpnext/payroll/doctype/payroll_entry/test_set_salary_components.js
+++ /dev/null
@@ -1,61 +0,0 @@
-QUnit.module('HR');
-
-QUnit.test("test: Set Salary Components", function (assert) {
-	assert.expect(5);
-	let done = assert.async();
-
-	frappe.run_serially([
-		() => frappe.set_route('Form', 'Salary Component', 'Leave Encashment'),
-		() => {
-			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
-			row.company = 'For Testing';
-			row.account = 'Salary - FT';
-		},
-
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
-
-		() => frappe.set_route('Form', 'Salary Component', 'Basic'),
-		() => {
-			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
-			row.company = 'For Testing';
-			row.account = 'Salary - FT';
-		},
-
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
-
-		() => frappe.set_route('Form', 'Salary Component', 'Income Tax'),
-		() => {
-			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
-			row.company = 'For Testing';
-			row.account = 'Salary - FT';
-		},
-
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
-
-		() => frappe.set_route('Form', 'Salary Component', 'Arrear'),
-		() => {
-			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
-			row.company = 'For Testing';
-			row.account = 'Salary - FT';
-		},
-
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_frm.doc.accounts[0].account, 'Salary - FT'),
-
-		() => frappe.set_route('Form', 'Company', 'For Testing'),
-		() => cur_frm.set_value('default_payroll_payable_account', 'Payroll Payable - FT'),
-		() => cur_frm.save(),
-		() => frappe.timeout(2),
-		() => assert.equal(cur_frm.doc.default_payroll_payable_account, 'Payroll Payable - FT'),
-
-		() => done()
-
-	]);
-});
diff --git a/erpnext/payroll/doctype/salary_slip/test_salary_slip.js b/erpnext/payroll/doctype/salary_slip/test_salary_slip.js
deleted file mode 100644
index a47eba1..0000000
--- a/erpnext/payroll/doctype/salary_slip/test_salary_slip.js
+++ /dev/null
@@ -1,55 +0,0 @@
-QUnit.test("test salary slip", function(assert) {
-	assert.expect(6);
-	let done = assert.async();
-	let employee_name;
-
-	let salary_slip = (ename) => {
-		frappe.run_serially([
-			() => frappe.db.get_value('Employee', {'employee_name': ename}, 'name'),
-			(r) => {
-				employee_name = r.message.name;
-			},
-			() => {
-				// Creating a salary slip for a employee
-				frappe.tests.make('Salary Slip', [
-					{ employee: employee_name}
-				]);
-			},
-			() => frappe.timeout(3),
-			() => {
-			// To check if all the calculations are correctly done
-				if(ename === 'Test Employee 1')
-				{
-					assert.ok(cur_frm.doc.gross_pay==24000,
-						'Gross amount for first employee is correctly calculated');
-					assert.ok(cur_frm.doc.total_deduction==4800,
-						'Deduction amount for first employee is correctly calculated');
-					assert.ok(cur_frm.doc.net_pay==19200,
-						'Net amount for first employee is correctly calculated');
-				}
-				if(ename === 'Test Employee 3')
-				{
-					assert.ok(cur_frm.doc.gross_pay==28800,
-						'Gross amount for second employee is correctly calculated');
-					assert.ok(cur_frm.doc.total_deduction==5760,
-						'Deduction amount for second employee is correctly calculated');
-					assert.ok(cur_frm.doc.net_pay==23040,
-						'Net amount for second employee is correctly calculated');
-				}
-			},
-		]);
-	};
-	frappe.run_serially([
-		() => salary_slip('Test Employee 1'),
-		() => frappe.timeout(6),
-		() => salary_slip('Test Employee 3'),
-		() => frappe.timeout(5),
-		() => frappe.set_route('List', 'Salary Slip', 'List'),
-		() => frappe.timeout(2),
-		() => {$('.list-row-checkbox').click();},
-		() => frappe.timeout(2),
-		() => frappe.click_button('Delete'),
-		() => frappe.click_button('Yes'),
-		() => done()
-	]);
-});
diff --git a/erpnext/payroll/doctype/salary_structure/test_salary_structure.js b/erpnext/payroll/doctype/salary_structure/test_salary_structure.js
deleted file mode 100644
index 542fa50..0000000
--- a/erpnext/payroll/doctype/salary_structure/test_salary_structure.js
+++ /dev/null
@@ -1,78 +0,0 @@
-QUnit.test("test Salary Structure", function(assert) {
-	assert.expect(7);
-	let done = assert.async();
-	let employee_name1;
-
-	frappe.run_serially([
-		() => frappe.db.get_value('Employee', {'employee_name': "Test Employee 1"}, 'name',
-			(r) => {
-				employee_name1 = r.name;
-			}
-		),
-		() => frappe.timeout(5),
-		() => frappe.db.get_value('Employee', {'employee_name': "Test Employee 3"}, 'name',
-			(r) => {
-			// Creating Salary Structure for employees);
-				return frappe.tests.make('Salary Structure', [
-					{ __newname: 'Test Salary Structure'},
-					{ company: 'For Testing'},
-					{ payroll_frequency: 'Monthly'},
-					{ employees: [
-						[
-							{employee: employee_name1},
-							{from_date: '2017-07-01'},
-							{base: 25000}
-						],
-						[
-							{employee: r.name},
-							{from_date: '2017-07-01'},
-							{base: 30000}
-						]
-					]},
-					{ earnings: [
-						[
-							{salary_component: 'Basic'},
-							{formula: 'base * .80'}
-						],
-						[
-							{salary_component: 'Leave Encashment'},
-							{formula: 'B * .20'}
-						]
-					]},
-					{ deductions: [
-						[
-							{salary_component: 'Income Tax'},
-							{formula: '(B+LE) * .20'}
-						]
-					]},
-					{ payment_account: 'CASH - FT'},
-				]);
-			}
-		),
-		() => frappe.timeout(15),
-		() => {
-			// To check if all the fields are correctly set
-			assert.ok(cur_frm.doc.employees[0].employee_name=='Test Employee 1',
-				'Employee 1 name correctly set');
-
-			assert.ok(cur_frm.doc.employees[1].employee_name=='Test Employee 3',
-				'Employee 2 name correctly set');
-
-			assert.ok(cur_frm.doc.employees[0].base==25000,
-				'Base value for first employee is correctly set');
-
-			assert.ok(cur_frm.doc.employees[1].base==30000,
-				'Base value for second employee is correctly set');
-
-			assert.ok(cur_frm.doc.earnings[0].formula.includes('base * .80'),
-				'Formula for earnings as Basic is correctly set');
-
-			assert.ok(cur_frm.doc.earnings[1].formula.includes('B * .20'),
-				'Formula for earnings as Leave Encashment is correctly set');
-
-			assert.ok(cur_frm.doc.deductions[0].formula.includes('(B+LE) * .20'),
-				'Formula for deductions as Income Tax is correctly set');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/projects/doctype/activity_type/test_activity_type.js b/erpnext/projects/doctype/activity_type/test_activity_type.js
deleted file mode 100644
index 62be972..0000000
--- a/erpnext/projects/doctype/activity_type/test_activity_type.js
+++ /dev/null
@@ -1,21 +0,0 @@
-QUnit.test("test: Activity Type", function (assert) {
-	// number of asserts
-	assert.expect(1);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// insert a new Activity Type
-		() => frappe.set_route("List", "Activity Type", "List"),
-		() => frappe.new_doc("Activity Type"),
-		() => frappe.timeout(1),
-		() => frappe.quick_entry.dialog.$wrapper.find('.edit-full').click(),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("activity_type", "Test Activity"),
-		() => frappe.click_button('Save'),
-		() => frappe.timeout(1),
-		() => {
-			assert.equal(cur_frm.doc.name,"Test Activity");
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/projects/doctype/task/tests/test_task.js b/erpnext/projects/doctype/task/tests/test_task.js
deleted file mode 100644
index 8a1a5bf..0000000
--- a/erpnext/projects/doctype/task/tests/test_task.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Task", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(2);
-
-	frappe.run_serially([
-		// insert a new Task
-		() => frappe.tests.make('Task', [
-			// values to be set
-			{subject: 'new task'}
-		]),
-		() => {
-			assert.equal(cur_frm.doc.status, 'Open');
-			assert.equal(cur_frm.doc.priority, 'Low');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/projects/doctype/task/tests/test_task_tree.js b/erpnext/projects/doctype/task/tests/test_task_tree.js
deleted file mode 100644
index 27dccbf..0000000
--- a/erpnext/projects/doctype/task/tests/test_task_tree.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Task Tree", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(4);
-
-	frappe.run_serially([
-		// insert a new Task
-		() => frappe.set_route('Tree', 'Task'),
-		() => frappe.timeout(0.5),
-
-		// Checking adding child without selecting any Node
-		() => frappe.tests.click_button('New'),
-		() => frappe.timeout(0.5),
-		() => {assert.equal($(`.msgprint`).text(), "Select a group node first.", "Error message success");},
-		() => frappe.tests.click_button('Close'),
-		() => frappe.timeout(0.5),
-
-		// Creating child nodes
-		() => frappe.tests.click_link('All Tasks'),
-		() => frappe.map_group.make('Test-1'),
-		() => frappe.map_group.make('Test-3', 1),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_link('Test-3'),
-		() => frappe.map_group.make('Test-4', 0),
-
-		// Checking Edit button
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_link('Test-1'),
-		() => frappe.tests.click_button('Edit'),
-		() => frappe.timeout(1),
-		() => frappe.db.get_value('Task', {'subject': 'Test-1'}, 'name'),
-		(task) => {assert.deepEqual(frappe.get_route(), ["Form", "Task", task.message.name], "Edit route checks");},
-
-		// Deleting child Node
-		() => frappe.set_route('Tree', 'Task'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_link('Test-1'),
-		() => frappe.tests.click_button('Delete'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Yes'),
-
-		// Deleting Group Node that has child nodes in it
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_link('Test-3'),
-		() => frappe.tests.click_button('Delete'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => {assert.equal(cur_dialog.title, 'Message', 'Error thrown correctly');},
-		() => frappe.tests.click_button('Close'),
-
-		// Add multiple child tasks
-		() => frappe.tests.click_link('Test-3'),
-		() => frappe.timeout(0.5),
-		() => frappe.click_button('Add Multiple'),
-		() => frappe.timeout(1),
-		() => cur_dialog.set_value('tasks', 'Test-6\nTest-7'),
-		() => frappe.timeout(0.5),
-		() => frappe.click_button('Submit'),
-		() => frappe.timeout(2),
-		() => frappe.click_button('Expand All'),
-		() => frappe.timeout(1),
-		() => {
-			let count = $(`a:contains("Test-6"):visible`).length + $(`a:contains("Test-7"):visible`).length;
-			assert.equal(count, 2, "Multiple Tasks added successfully");
-		},
-
-		() => done()
-	]);
-});
-
-frappe.map_group = {
-	make:function(subject, is_group = 0){
-		return frappe.run_serially([
-			() => frappe.click_button('Add Child'),
-			() => frappe.timeout(1),
-			() => cur_dialog.set_value('is_group', is_group),
-			() => cur_dialog.set_value('subject', subject),
-			() => frappe.click_button('Create New'),
-			() => frappe.timeout(1.5)
-		]);
-	}
-};
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index 93a2731..9339c5d 100755
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -430,12 +430,9 @@
 					qty = row.qty;
 				}
 				row[item_field] = d.alternate_item;
-				frm.script_manager.trigger(item_field, row.doctype, row.name)
-					.then(() => {
-						frappe.model.set_value(row.doctype, row.name, 'qty', qty);
-						frappe.model.set_value(row.doctype, row.name,
-							opts.original_item_field, d.item_code);
-					});
+				frappe.model.set_value(row.doctype, row.name, 'qty', qty);
+				frappe.model.set_value(row.doctype, row.name, opts.original_item_field, d.item_code);
+				frm.trigger(item_field, row.doctype, row.name);
 			});
 
 			refresh_field(opts.child_docname);
diff --git a/erpnext/restaurant/doctype/restaurant/test_restaurant.js b/erpnext/restaurant/doctype/restaurant/test_restaurant.js
deleted file mode 100644
index 8fe4e7b..0000000
--- a/erpnext/restaurant/doctype/restaurant/test_restaurant.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Restaurant", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(2);
-	let customer =  {
-		"Test Customer 1": [
-			{customer_name: "Test Customer 1"}
-		],
-		"Test Customer 2": [
-			{customer_name: "Test Customer 2"}
-		]
-	};
-
-	frappe.run_serially([
-		// insert a new Restaurant
-		() => frappe.tests.setup_doctype('Customer', customer),
-		() => {
-			return frappe.tests.make('Restaurant', [
-				// values to be set
-				{__newname: 'Test Restaurant 1'},
-				{company: 'Test Company'},
-				{invoice_series_prefix: 'Test-Rest-1-Inv-'},
-				{default_customer: 'Test Customer 1'}
-			])
-		},
-		() => frappe.timeout(3),
-		() => {
-			assert.equal(cur_frm.doc.company, 'Test Company');
-		},
-		() => {
-			return frappe.tests.make('Restaurant', [
-				// values to be set
-				{__newname: 'Test Restaurant 2'},
-				{company: 'Test Company'},
-				{invoice_series_prefix: 'Test-Rest-3-Inv-'},
-				{default_customer: 'Test Customer 2'}
-			]);
-		},
-		() => frappe.timeout(3),
-		() => {
-			assert.equal(cur_frm.doc.company, 'Test Company');
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/restaurant/doctype/restaurant_menu/test_restaurant_menu.js b/erpnext/restaurant/doctype/restaurant_menu/test_restaurant_menu.js
deleted file mode 100644
index f5ab9f0..0000000
--- a/erpnext/restaurant/doctype/restaurant_menu/test_restaurant_menu.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Restaurant Menu", function (assert) {
-	let done = assert.async();
-
-	let items =  {
-		"Food Item 1": [
-			{item_code: "Food Item 1"},
-			{item_group: "Products"},
-			{is_stock_item: 1},
-		],
-		"Food Item 2": [
-			{item_code: "Food Item 2"},
-			{item_group: "Products"},
-			{is_stock_item: 1},
-		],
-		"Food Item 3": [
-			{item_code: "Food Item 3"},
-			{item_group: "Products"},
-			{is_stock_item: 1},
-		]
-	};
-
-
-	// number of asserts
-	assert.expect(0);
-
-	frappe.run_serially([
-		// insert a new Restaurant Menu
-		() => frappe.tests.setup_doctype('Item', items),
-		() => {
-			return frappe.tests.make("Restaurant Menu", [
-				{__newname: 'Restaurant Menu 1'},
-				{restaurant: "Test Restaurant 1"},
-				{items: [
-					[
-						{"item": "Food Item 1"},
-						{"rate": 100}
-					],
-					[
-						{"item": "Food Item 2"},
-						{"rate": 90}
-					],
-					[
-						{"item": "Food Item 3"},
-						{"rate": 80}
-					]
-				]}
-			]);
-		},
-		() => frappe.timeout(2),
-		() => {
-			return frappe.tests.make("Restaurant Menu", [
-				{__newname: 'Restaurant Menu 2'},
-				{restaurant: "Test Restaurant 2"},
-				{items: [
-					[
-						{"item": "Food Item 1"},
-						{"rate": 105}
-					],
-					[
-						{"item": "Food Item 3"},
-						{"rate": 85}
-					]
-				]}
-			]);
-		},
-		() => frappe.timeout(2),
-		() => frappe.set_route('Form', 'Restaurant', 'Test Restaurant 1'),
-		() => cur_frm.set_value('active_menu', 'Restaurant Menu 1'),
-		() => cur_frm.save(),
-		() => done()
-	]);
-
-});
diff --git a/erpnext/restaurant/doctype/restaurant_order_entry/test_restaurant_order_entry.js b/erpnext/restaurant/doctype/restaurant_order_entry/test_restaurant_order_entry.js
deleted file mode 100644
index fec2a21..0000000
--- a/erpnext/restaurant/doctype/restaurant_order_entry/test_restaurant_order_entry.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Restaurant Order Entry", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(5);
-
-	frappe.run_serially([
-		// insert a new Restaurant Order Entry
-		() => frappe.set_route('Form', 'Restaurant Settings'),
-		() => cur_frm.set_value('default_customer', 'Test Customer 1'),
-		() => cur_frm.save(),
-		() => frappe.set_route('Form', 'Restaurant Order Entry'),
-		() => frappe.click_button('Clear'),
-		() => frappe.timeout(2),
-		() => cur_frm.set_value('restaurant_table', 'Test-Restaurant-1-01'),
-		() => cur_frm.set_value('add_item', 'Food Item 1'),
-		() => frappe.timeout(0.5),
-		() => {
-			var e = $.Event( "keyup", {which: 13} );
-			$('input[data-fieldname="add_item"]').trigger(e);
-			return frappe.timeout(0.5);
-		},
-		() => cur_frm.set_value('add_item', 'Food Item 1'),
-		() => {
-			var e = $.Event( "keyup", {which: 13} );
-			$('input[data-fieldname="add_item"]').trigger(e);
-			return frappe.timeout(0.5);
-		},
-		() => cur_frm.set_value('add_item', 'Food Item 2'),
-		() => {
-			var e = $.Event( "keyup", {which: 13} );
-			$('input[data-fieldname="add_item"]').trigger(e);
-			return frappe.timeout(0.5);
-		},
-		() => {
-			assert.equal(cur_frm.doc.items[0].item, 'Food Item 1');
-			assert.equal(cur_frm.doc.items[0].qty, 2);
-			assert.equal(cur_frm.doc.items[1].item, 'Food Item 2');
-			assert.equal(cur_frm.doc.items[1].qty, 1);
-		},
-		() => frappe.click_button('Update'),
-		() => frappe.timeout(2),
-		() => {
-			assert.equal(cur_frm.doc.grand_total, 290);
-		}
-		() => done()
-	]);
-
-});
diff --git a/erpnext/restaurant/doctype/restaurant_reservation/test_restaurant_reservation.js b/erpnext/restaurant/doctype/restaurant_reservation/test_restaurant_reservation.js
deleted file mode 100644
index eeea5a9..0000000
--- a/erpnext/restaurant/doctype/restaurant_reservation/test_restaurant_reservation.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Restaurant Reservation", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(1);
-
-	frappe.run_serially([
-		// insert a new Restaurant Reservation
-		() => frappe.tests.make('Restaurant Reservation', [
-			// values to be set
-			{restaurant: 'Gokul - JP Nagar'},
-			{customer_name: 'test customer'},
-			{reservation_time: frappe.datetime.now_date() + " 19:00:00"},
-			{no_of_people: 4},
-		]),
-		() => {
-			assert.equal(cur_frm.doc.reservation_end_time,
-				frappe.datetime.now_date() + ' 20:00:00');
-		},
-		() => done()
-	]);
-
-});
diff --git a/erpnext/restaurant/doctype/restaurant_table/test_restaurant_table.js b/erpnext/restaurant/doctype/restaurant_table/test_restaurant_table.js
deleted file mode 100644
index 16035f0..0000000
--- a/erpnext/restaurant/doctype/restaurant_table/test_restaurant_table.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Restaurant Table", function (assert) {
-	let done = assert.async();
-
-	// number of asserts
-	assert.expect(0);
-
-	frappe.run_serially([
-		// insert a new Restaurant Table
-		() => frappe.tests.make('Restaurant Table', [
-			// values to be set
-			{restaurant: 'Test Restaurant 1'},
-			{no_of_seats: 4},
-		]),
-		() => frappe.tests.make('Restaurant Table', [
-			// values to be set
-			{restaurant: 'Test Restaurant 1'},
-			{no_of_seats: 5},
-		]),
-		() => frappe.tests.make('Restaurant Table', [
-			// values to be set
-			{restaurant: 'Test Restaurant 1'},
-			{no_of_seats: 2},
-		]),
-		() => frappe.tests.make('Restaurant Table', [
-			// values to be set
-			{restaurant: 'Test Restaurant 1'},
-			{no_of_seats: 2},
-		]),
-		() => frappe.tests.make('Restaurant Table', [
-			// values to be set
-			{restaurant: 'Test Restaurant 1'},
-			{no_of_seats: 6},
-		]),
-		() => done()
-	]);
-
-});
diff --git a/erpnext/selling/doctype/product_bundle/test_product_bundle.js b/erpnext/selling/doctype/product_bundle/test_product_bundle.js
deleted file mode 100644
index 0dc90ec..0000000
--- a/erpnext/selling/doctype/product_bundle/test_product_bundle.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.test("test sales order", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Product Bundle', [
-				{new_item_code: 'Computer'},
-				{items: [
-					[
-						{item_code:'CPU'},
-						{qty:1}
-					],
-					[
-						{item_code:'Screen'},
-						{qty:1}
-					],
-					[
-						{item_code:'Keyboard'},
-						{qty:1}
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_code=='CPU', "Item Code correct");
-			assert.ok(cur_frm.doc.items[1].item_code=='Screen', "Item Code correct");
-			assert.ok(cur_frm.doc.items[2].item_code=='Keyboard', "Item Code correct");
-			assert.ok(cur_frm.doc.new_item_code == "Computer", "Parent Item correct");
-		},
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation.js b/erpnext/selling/doctype/quotation/tests/test_quotation.js
deleted file mode 100644
index ad942fe..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation.js
+++ /dev/null
@@ -1,58 +0,0 @@
-QUnit.test("test: quotation", function (assert) {
-	assert.expect(12);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Quotation", [
-				{customer: "Test Customer 1"},
-				{items: [
-					[
-						{"item_code": "Test Product 1"},
-						{"qty": 5}
-					]]
-				},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name == "Test Product 1", "Added Test Product 1");
-
-			// calculate_taxes_and_totals
-			assert.ok(cur_frm.doc.grand_total === 500, String(cur_frm.doc.grand_total));
-		},
-		() => cur_frm.set_value("customer_address", "Test1-Billing"),
-		() => cur_frm.set_value("shipping_address_name", "Test1-Warehouse"),
-		() => cur_frm.set_value("contact_person", "Contact 1-Test Customer 1"),
-		() => cur_frm.set_value("currency", "USD"),
-		() => frappe.timeout(0.3),
-		() => cur_frm.set_value("selling_price_list", "Test-Selling-USD"),
-		() => frappe.timeout(0.5),
-		() => cur_frm.doc.items[0].rate = 200,
-		() => frappe.timeout(0.3),
-		() => cur_frm.set_value("tc_name", "Test Term 1"),
-		() => cur_frm.set_value("payment_schedule", []),
-		() => frappe.timeout(0.5),
-		() => cur_frm.save(),
-		() => {
-			// Check Address and Contact Info
-			assert.ok(cur_frm.doc.address_display.includes("Billing Street 1"), "Address Changed");
-			assert.ok(cur_frm.doc.shipping_address.includes("Warehouse Street 1"), "Address Changed");
-			assert.ok(cur_frm.doc.contact_display == "Contact 1", "Contact info changed");
-
-			// Check Currency
-			assert.ok(cur_frm.doc.currency == "USD", "Currency Changed");
-			assert.ok(cur_frm.doc.selling_price_list == "Test-Selling-USD", "Price List Changed");
-			assert.ok(cur_frm.doc.items[0].rate == 200, "Price Changed Manually");
-			assert.equal(cur_frm.doc.total, 1000, "New Total Calculated");
-
-			// Check Terms and Conditions
-			assert.ok(cur_frm.doc.tc_name == "Test Term 1", "Terms and Conditions Checked");
-
-			assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct");
-			assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty");
-
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_submit_cancel_amend.js b/erpnext/selling/doctype/quotation/tests/test_quotation_submit_cancel_amend.js
deleted file mode 100644
index 26a099e..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation_submit_cancel_amend.js
+++ /dev/null
@@ -1,41 +0,0 @@
-QUnit.module('Quotation');
-
-QUnit.test("test quotation submit cancel amend", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Quotation', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 1'}
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			// get uom details
-			assert.ok(cur_frm.doc.grand_total== 500, "Grand total correct ");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-		() => frappe.tests.click_button('Close'),
-		() => frappe.tests.click_button('Cancel'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.5),
-		() => frappe.tests.click_button('Amend'),
-		() => cur_frm.save(),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js b/erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js
deleted file mode 100644
index b59bb05..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation_with_discount_on_grand_total.js
+++ /dev/null
@@ -1,43 +0,0 @@
-QUnit.module('Quotation');
-
-QUnit.test("test quotation with additional discount in grand total", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Quotation', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{apply_discount_on:'Grand Total'},
-				{additional_discount_percentage:10},
-				{payment_schedule: []}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 450, "Grand total correct ");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_with_item_wise_discount.js b/erpnext/selling/doctype/quotation/tests/test_quotation_with_item_wise_discount.js
deleted file mode 100644
index f5172fb..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation_with_item_wise_discount.js
+++ /dev/null
@@ -1,37 +0,0 @@
-QUnit.module('Quotation');
-
-QUnit.test("test quotation with item wise discount", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Quotation', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-						{'discount_percentage': 10},
-						{'margin_type': 'Percentage'}
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 450, "Grand total correct ");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_with_margin.js b/erpnext/selling/doctype/quotation/tests/test_quotation_with_margin.js
deleted file mode 100644
index 0d34099..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation_with_margin.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.module('Selling');
-
-QUnit.test("test quotation with margin", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Quotation', [
-				{customer: 'Test Customer 1'},
-				{selling_price_list: 'Test-Selling-USD'},
-				{currency: 'USD'},
-				{items: [
-					[
-						{'item_code': 'Test Product 4'},
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 1},
-						{'margin_type': 'Percentage'},
-						{'margin_rate_or_amount': 20}
-					]
-				]}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			assert.ok(cur_frm.doc.items[0].rate_with_margin == 240, "Margin rate correct");
-			assert.ok(cur_frm.doc.items[0].base_rate_with_margin == cur_frm.doc.conversion_rate * 240, "Base margin rate correct");
-			assert.ok(cur_frm.doc.total == 240, "Amount correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_with_multi_uom.js b/erpnext/selling/doctype/quotation/tests/test_quotation_with_multi_uom.js
deleted file mode 100644
index 84be56f..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation_with_multi_uom.js
+++ /dev/null
@@ -1,38 +0,0 @@
-QUnit.module('Quotation');
-
-QUnit.test("test quotation with multi uom", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Quotation', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-						{'uom': 'unit'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get uom details
-			assert.ok(cur_frm.doc.items[0].uom=='Unit', "Multi Uom correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 5000, "Grand total correct ");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_with_shipping_rule.js b/erpnext/selling/doctype/quotation/tests/test_quotation_with_shipping_rule.js
deleted file mode 100644
index 17c5dd2..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation_with_shipping_rule.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.module('Quotation');
-
-QUnit.test("test quotation with shipping rule", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Quotation', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{shipping_rule:'Next Day Shipping'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 550, "Grand total correct ");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/quotation/tests/test_quotation_with_taxes_and_charges.js b/erpnext/selling/doctype/quotation/tests/test_quotation_with_taxes_and_charges.js
deleted file mode 100644
index 5e21f81..0000000
--- a/erpnext/selling/doctype/quotation/tests/test_quotation_with_taxes_and_charges.js
+++ /dev/null
@@ -1,40 +0,0 @@
-QUnit.module('Quotation');
-
-QUnit.test("test quotation with taxes and charges", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Quotation', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order.js
deleted file mode 100644
index c99f9ef..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order.js
+++ /dev/null
@@ -1,68 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test sales order", function(assert) {
-	assert.expect(12);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5.123},
-						{'item_code': 'Test Product 3'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{selling_price_list:'Test-Selling-USD'},
-				{currency: 'USD'}
-			]);
-		},
-		() => frappe.timeout(1.5),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 3', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => cur_frm.print_doc(),
-		() => frappe.timeout(1),
-		() => {
-			// Payment Terms
-			assert.ok(cur_frm.doc.payment_terms_template, "Payment Terms Template is correct");
-			assert.ok(cur_frm.doc.payment_schedule.length > 0, "Payment Term Schedule is not empty");
-
-			// totals
-			assert.ok(cur_frm.doc.items[0].price_list_rate==250, "Item 1 price_list_rate");
-			assert.ok(cur_frm.doc.net_total== 1280.75, "net total correct ");
-			assert.ok(cur_frm.doc.base_grand_total== flt(1511.29* cur_frm.doc.conversion_rate, precision('base_grand_total')), String(flt(1511.29* cur_frm.doc.conversion_rate, precision('base_grand_total')) + ' ' + cur_frm.doc.base_grand_total));
-			assert.ok(cur_frm.doc.grand_total== 1511.29 , "grand total correct ");
-			assert.ok(cur_frm.doc.rounded_total== 1511.30, "rounded total correct ");
-
-			// print format
-			assert.ok($('.btn-print-print').is(':visible'), "Print Format Available");
-			frappe.timeout(1);
-			assert.ok($(".section-break+ .section-break .column-break:nth-child(1) .data-field:nth-child(1) .value").text().includes("Billing Street 1"), "Print Preview Works As Expected");
-		},
-		() => cur_frm.print_doc(),
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_bypass_credit_limit_check.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_bypass_credit_limit_check.js
deleted file mode 100644
index 79d798b..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_bypass_credit_limit_check.js
+++ /dev/null
@@ -1,58 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test_sales_order_with_bypass_credit_limit_check", function(assert) {
-//#PR : 10861, Author : ashish-greycube & jigneshpshah,  Email:mr.ashish.shah@gmail.com
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.new_doc('Customer'),
-		() => frappe.timeout(1),
-		() => frappe.quick_entry.dialog.$wrapper.find('.edit-full').click(),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("customer_name", "Test Customer 10"),
-		() => cur_frm.add_child('credit_limits', {
-			'company': cur_frm.doc.company || '_Test Company'
-			'credit_limit': 1000,
-			'bypass_credit_limit_check': 1}),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-
-		() => frappe.new_doc('Item'),
-		() => frappe.timeout(1),
-		() => frappe.quick_entry.dialog.$wrapper.find('.edit-full').click(),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("item_code", "Test Product 10"),
-		() => cur_frm.set_value("item_group", "Products"),
-		() => cur_frm.set_value("standard_rate", 100),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 5'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 10'},
-					]
-				]}
-
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => assert.equal("Confirm", cur_dialog.title,'confirmation for submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(3),
-		() => {
-
-			assert.ok(cur_frm.doc.status=="To Deliver and Bill", "It is submited. Credit limit is NOT checked for sales order");
-
-
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js
deleted file mode 100644
index de61a61..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_discount_on_grand_total.js
+++ /dev/null
@@ -1,43 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test sales order with additional discount in grand total", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => {
-			return frappe.tests.set_form_values(cur_frm, [
-				{apply_discount_on:'Grand Total'},
-				{additional_discount_percentage:10},
-				{payment_schedule: []}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 450, "Grand total correct ");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js
deleted file mode 100644
index 2c48108..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_item_wise_discount.js
+++ /dev/null
@@ -1,38 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test sales order", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-						{'discount_percentage': 10},
-						{'margin_type': 'Percentage'}
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{payment_terms_template: '_Test Payment Term Template UI'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 450, "Grand total correct ");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_margin.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_margin.js
deleted file mode 100644
index 9eebfda..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_margin.js
+++ /dev/null
@@ -1,37 +0,0 @@
-QUnit.module('Selling');
-
-QUnit.test("test sales order with margin", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer:'Test Customer 1'},
-				{selling_price_list: 'Test-Selling-USD'},
-				{currency: 'USD'},
-				{items: [
-					[
-						{'item_code': 'Test Product 4'},
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 1},
-						{'margin_type': 'Amount'},
-						{'margin_rate_or_amount': 20}
-					]
-				]},
-			]);
-		},
-
-		() => cur_frm.save(),
-		() => {
-			// get_rate_details
-			assert.ok(cur_frm.doc.items[0].rate_with_margin == 220, "Margin rate correct");
-			assert.ok(cur_frm.doc.items[0].base_rate_with_margin == cur_frm.doc.conversion_rate * 220, "Base margin rate correct");
-			assert.ok(cur_frm.doc.total == 220, "Amount correct");
-		},
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multi_uom.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multi_uom.js
deleted file mode 100644
index 84301f5..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multi_uom.js
+++ /dev/null
@@ -1,38 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test sales order", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-						{'uom': 'Unit'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get uom details
-			assert.ok(cur_frm.doc.items[0].uom=='Unit', "Multi Uom correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 5000, "Grand total correct ");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multiple_delivery_date.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multiple_delivery_date.js
deleted file mode 100644
index be76c49..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_multiple_delivery_date.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* eslint-disable */
-// rename this file from _test_[name] to test_[name] to activate
-// and remove above this line
-
-QUnit.test("test: Sales Order", function (assert) {
-	assert.expect(2);
-	let done = assert.async();
-	let delivery_date = frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1);
-
-	frappe.run_serially([
-		// insert a new Sales Order
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: "Test Customer 1"},
-				{delivery_date: delivery_date},
-				{order_type: 'Sales'},
-				{items: [
-					[
-						{"item_code": "Test Product 1"},
-						{"qty": 5},
-						{'rate': 100},
-					]]
-				}
-			])
-		},
-		() => {
-			assert.ok(cur_frm.doc.items[0].delivery_date == delivery_date);
-		},
-		() => frappe.timeout(1),
-		// make SO without delivery date in parent,
-		// parent delivery date should be set based on final delivery date entered in item
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: "Test Customer 1"},
-				{order_type: 'Sales'},
-				{items: [
-					[
-						{"item_code": "Test Product 1"},
-						{"qty": 5},
-						{'rate': 100},
-						{'delivery_date': delivery_date}
-					],
-					[
-						{"item_code": "Test Product 2"},
-						{"qty": 5},
-						{'rate': 100},
-						{'delivery_date': frappe.datetime.add_days(delivery_date, 5)}
-					]]
-				}
-			])
-		},
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => {
-			assert.ok(cur_frm.doc.delivery_date == frappe.datetime.add_days(delivery_date, 5));
-		},
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_pricing_rule.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_pricing_rule.js
deleted file mode 100644
index e91fb01..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_pricing_rule.js
+++ /dev/null
@@ -1,34 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test sales order with shipping rule", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 3'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 2'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 2', "Item name correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 675, "Grand total correct ");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_shipping_rule.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_shipping_rule.js
deleted file mode 100644
index 7d1211f..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_shipping_rule.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test sales order with shipping rule", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{shipping_rule:'Next Day Shipping'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get grand_total details
-			assert.ok(cur_frm.doc.grand_total== 550, "Grand total correct ");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_taxes_and_charges.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_taxes_and_charges.js
deleted file mode 100644
index a3668ab..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_with_taxes_and_charges.js
+++ /dev/null
@@ -1,40 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test sales order with taxes and charges", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 1'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 4'},
-					]
-				]},
-				{customer_address: 'Test1-Billing'},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/selling/doctype/sales_order/tests/test_sales_order_without_bypass_credit_limit_check.js b/erpnext/selling/doctype/sales_order/tests/test_sales_order_without_bypass_credit_limit_check.js
deleted file mode 100644
index 8de39f9..0000000
--- a/erpnext/selling/doctype/sales_order/tests/test_sales_order_without_bypass_credit_limit_check.js
+++ /dev/null
@@ -1,62 +0,0 @@
-QUnit.module('Sales Order');
-
-QUnit.test("test_sales_order_without_bypass_credit_limit_check", function(assert) {
-//#PR : 10861, Author : ashish-greycube & jigneshpshah,  Email:mr.ashish.shah@gmail.com
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.new_doc('Customer'),
-		() => frappe.timeout(1),
-		() => frappe.quick_entry.dialog.$wrapper.find('.edit-full').click(),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("customer_name", "Test Customer 11"),
-		() => cur_frm.add_child('credit_limits', {
-			'credit_limit': 1000,
-			'company': '_Test Company',
-			'bypass_credit_limit_check': 1}),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-
-		() => frappe.new_doc('Item'),
-		() => frappe.timeout(1),
-		() => frappe.click_link('Edit in full page'),
-		() => cur_frm.set_value("item_code", "Test Product 11"),
-		() => cur_frm.set_value("item_group", "Products"),
-		() => cur_frm.set_value("standard_rate", 100),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-
-		() => {
-			return frappe.tests.make('Sales Order', [
-				{customer: 'Test Customer 11'},
-				{items: [
-					[
-						{'delivery_date': frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1)},
-						{'qty': 5},
-						{'item_code': 'Test Product 11'},
-					]
-				]}
-
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.tests.click_button('Submit'),
-		() => assert.equal("Confirm", cur_dialog.title,'confirmation for submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(3),
-		() => {
-
-			if (cur_dialog.body.innerText.match(/^Credit limit has been crossed for customer.*$/))
-				{
-    				/*Match found */
-    				assert.ok(true, "Credit Limit crossed message received");
-				}
-
-
-		},
-		() => cur_dialog.cancel(),
-		() => done()
-	]);
-});
diff --git a/erpnext/setup/doctype/company/tests/test_company.js b/erpnext/setup/doctype/company/tests/test_company.js
deleted file mode 100644
index b568494..0000000
--- a/erpnext/setup/doctype/company/tests/test_company.js
+++ /dev/null
@@ -1,25 +0,0 @@
-QUnit.module('setup');
-
-QUnit.test("Test: Company [SetUp]", function (assert) {
-	assert.expect(2);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// test company creation
-		() => frappe.set_route("List", "Company", "List"),
-		() => frappe.new_doc("Company"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("company_name", "Test Company"),
-		() => cur_frm.set_value("abbr", "TC"),
-		() => cur_frm.set_value("domain", "Services"),
-		() => cur_frm.set_value("default_currency", "INR"),
-		// save form
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-		() => assert.equal("Debtors - TC", cur_frm.doc.default_receivable_account,
-			'chart of acounts created'),
-		() => assert.equal("Main - TC", cur_frm.doc.cost_center,
-			'chart of cost centers created'),
-		() => done()
-	]);
-});
diff --git a/erpnext/setup/doctype/company/tests/test_company_production.js b/erpnext/setup/doctype/company/tests/test_company_production.js
deleted file mode 100644
index a4c1e2e..0000000
--- a/erpnext/setup/doctype/company/tests/test_company_production.js
+++ /dev/null
@@ -1,19 +0,0 @@
-QUnit.test("Test: Company", function (assert) {
-	assert.expect(0);
-
-	let done = assert.async();
-
-	frappe.run_serially([
-		// Added company for Work Order testing
-		() => frappe.set_route("List", "Company"),
-		() => frappe.new_doc("Company"),
-		() => frappe.timeout(1),
-		() => cur_frm.set_value("company_name", "For Testing"),
-		() => cur_frm.set_value("abbr", "RB"),
-		() => cur_frm.set_value("default_currency", "INR"),
-		() => cur_frm.save(),
-		() => frappe.timeout(1),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/batch/test_batch.js b/erpnext/stock/doctype/batch/test_batch.js
deleted file mode 100644
index 2d2150b..0000000
--- a/erpnext/stock/doctype/batch/test_batch.js
+++ /dev/null
@@ -1,22 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test Batch", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Batch', [
-				{batch_id:'TEST-BATCH-001'},
-				{item:'Test Product 4'},
-				{expiry_date:frappe.datetime.add_days(frappe.datetime.now_date(), 2)},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.batch_id=='TEST-BATCH-001', "Batch Id correct");
-		},
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.js b/erpnext/stock/doctype/delivery_note/test_delivery_note.js
deleted file mode 100644
index 76f7989..0000000
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.js
+++ /dev/null
@@ -1,35 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test delivery note", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Delivery Note', [
-				{customer:'Test Customer 1'},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 5},
-					]
-				]},
-				{shipping_address_name: 'Test1-Shipping'},
-				{contact_person: 'Contact 1-Test Customer 1'},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{transporter_name:'TEST TRANSPORT'},
-				{lr_no:'MH-04-FG 1111'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.grand_total==590, " Grand Total correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note_with_margin.js b/erpnext/stock/doctype/delivery_note/test_delivery_note_with_margin.js
deleted file mode 100644
index 9f1375f..0000000
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note_with_margin.js
+++ /dev/null
@@ -1,36 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test delivery note with margin", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Delivery Note', [
-				{customer:'Test Customer 1'},
-				{selling_price_list: 'Test-Selling-USD'},
-				{currency: 'USD'},
-				{items: [
-					[
-						{'item_code': 'Test Product 4'},
-						{'qty': 1},
-						{'margin_type': 'Amount'},
-						{'margin_rate_or_amount': 10}
-					]
-				]},
-			]);
-		},
-
-		() => cur_frm.save(),
-		() => {
-			// get_rate_details
-			assert.ok(cur_frm.doc.items[0].rate_with_margin == 210, "Margin rate correct");
-			assert.ok(cur_frm.doc.items[0].base_rate_with_margin == cur_frm.doc.conversion_rate * 210, "Base margin rate correct");
-			assert.ok(cur_frm.doc.total == 210, "Amount correct");
-		},
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/item/tests/test_item.js b/erpnext/stock/doctype/item/tests/test_item.js
deleted file mode 100644
index 7f7e72d..0000000
--- a/erpnext/stock/doctype/item/tests/test_item.js
+++ /dev/null
@@ -1,121 +0,0 @@
-QUnit.module('stock');
-QUnit.test("test: item", function (assert) {
-	assert.expect(6);
-	let done = assert.async();
-	let keyboard_cost  = 800;
-	let screen_cost  = 4000;
-	let CPU_cost  = 15000;
-	let scrap_cost = 100;
-	let no_of_items_to_stock = 100;
-	let is_stock_item = 1;
-	frappe.run_serially([
-		// test item creation
-		() => frappe.set_route("List", "Item"),
-
-		// Create a keyboard item
-		() => frappe.tests.make(
-			"Item", [
-				{item_code: "Keyboard"},
-				{item_group: "Products"},
-				{is_stock_item: is_stock_item},
-				{standard_rate: keyboard_cost},
-				{opening_stock: no_of_items_to_stock},
-				{default_warehouse: "Stores - FT"}
-			]
-		),
-		() => {
-			assert.ok(cur_frm.doc.item_name.includes('Keyboard'),
-				'Item Keyboard created correctly');
-			assert.ok(cur_frm.doc.item_code.includes('Keyboard'),
-				'item_code for Keyboard set correctly');
-			assert.ok(cur_frm.doc.item_group.includes('Products'),
-				'item_group for Keyboard set correctly');
-			assert.equal(cur_frm.doc.is_stock_item, is_stock_item,
-				'is_stock_item for Keyboard set correctly');
-			assert.equal(cur_frm.doc.standard_rate, keyboard_cost,
-				'standard_rate for Keyboard set correctly');
-			assert.equal(cur_frm.doc.opening_stock, no_of_items_to_stock,
-				'opening_stock for Keyboard set correctly');
-		},
-
-		// Create a Screen item
-		() => frappe.tests.make(
-			"Item", [
-				{item_code: "Screen"},
-				{item_group: "Products"},
-				{is_stock_item: is_stock_item},
-				{standard_rate: screen_cost},
-				{opening_stock: no_of_items_to_stock},
-				{default_warehouse: "Stores - FT"}
-			]
-		),
-
-		// Create a CPU item
-		() => frappe.tests.make(
-			"Item", [
-				{item_code: "CPU"},
-				{item_group: "Products"},
-				{is_stock_item: is_stock_item},
-				{standard_rate: CPU_cost},
-				{opening_stock: no_of_items_to_stock},
-				{default_warehouse: "Stores - FT"}
-			]
-		),
-
-		// Create a laptop item
-		() => frappe.tests.make(
-			"Item", [
-				{item_code: "Laptop"},
-				{item_group: "Products"},
-				{default_warehouse: "Stores - FT"}
-			]
-		),
-		() => frappe.tests.make(
-			"Item", [
-				{item_code: "Computer"},
-				{item_group: "Products"},
-				{is_stock_item: 0},
-			]
-		),
-
-		// Create a scrap item
-		() => frappe.tests.make(
-			"Item", [
-				{item_code: "Scrap item"},
-				{item_group: "Products"},
-				{is_stock_item: is_stock_item},
-				{standard_rate: scrap_cost},
-				{opening_stock: no_of_items_to_stock},
-				{default_warehouse: "Stores - FT"}
-			]
-		),
-		() => frappe.tests.make(
-			"Item", [
-				{item_code: "Test Product 4"},
-				{item_group: "Products"},
-				{is_stock_item: 1},
-				{has_batch_no: 1},
-				{create_new_batch: 1},
-				{uoms:
-					[
-						[
-							{uom:"Unit"},
-							{conversion_factor: 10},
-						]
-					]
-				},
-				{taxes:
-					[
-						[
-							{tax_type:"SGST - "+frappe.get_abbr(frappe.defaults.get_default("Company"))},
-							{tax_rate: 0},
-						]
-					]},
-				{has_serial_no: 1},
-				{standard_rate: 100},
-				{opening_stock: 100},
-			]
-		),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/item_price/test_item_price.js b/erpnext/stock/doctype/item_price/test_item_price.js
deleted file mode 100644
index 49dbaa2..0000000
--- a/erpnext/stock/doctype/item_price/test_item_price.js
+++ /dev/null
@@ -1,22 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test item price", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Item Price', [
-				{price_list:'Test-Selling-USD'},
-				{item_code: 'Test Product 4'},
-				{price_list_rate: 200}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			assert.ok(cur_frm.doc.item_name == 'Test Product 4', "Item name correct");
-			assert.ok(cur_frm.doc.price_list_rate == 200, "Price list rate correct");
-		},
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/material_request/tests/test_material_request.js b/erpnext/stock/doctype/material_request/tests/test_material_request.js
deleted file mode 100644
index a2cd03b..0000000
--- a/erpnext/stock/doctype/material_request/tests/test_material_request.js
+++ /dev/null
@@ -1,39 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material request", function(assert) {
-	assert.expect(5);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Material Request', [
-				{items: [
-					[
-						{'schedule_date':  frappe.datetime.add_days(frappe.datetime.nowdate(), 5)},
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					],
-					[
-						{'schedule_date':  frappe.datetime.add_days(frappe.datetime.nowdate(), 6)},
-						{'qty': 2},
-						{'item_code': 'Test Product 2'},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			assert.ok(cur_frm.doc.schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 5), "Schedule Date correct");
-
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.items[0].schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 5), "Schedule Date correct");
-
-			assert.ok(cur_frm.doc.items[1].item_name=='Test Product 2', "Item name correct");
-			assert.ok(cur_frm.doc.items[1].schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 6), "Schedule Date correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/material_request/tests/test_material_request_from_bom.js b/erpnext/stock/doctype/material_request/tests/test_material_request_from_bom.js
deleted file mode 100644
index 6fb55ae..0000000
--- a/erpnext/stock/doctype/material_request/tests/test_material_request_from_bom.js
+++ /dev/null
@@ -1,27 +0,0 @@
-QUnit.module('manufacturing');
-
-QUnit.test("test material request get items from BOM", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.set_route('Form', 'BOM'),
-		() => frappe.timeout(3),
-		() => frappe.click_button('Get Items from BOM'),
-		() => frappe.timeout(3),
-		() => {
-			assert.ok(cur_dialog, 'dialog appeared');
-		},
-		() => cur_dialog.set_value('bom', 'Laptop'),
-		() => cur_dialog.set_value('warehouse', 'Laptop Scrap Warehouse'),
-		() => frappe.click_button('Get Items from BOM'),
-		() => frappe.timeout(3),
-		() => {
-			assert.ok(cur_frm.doc.items[0].item_code, "First row is not empty");
-			assert.ok(cur_frm.doc.items[0].item_name, "Item name is not empty");
-			assert.equal(cur_frm.doc.items[0].item_name, "Laptop", cur_frm.doc.items[0].item_name);
-		},
-		() => cur_frm.doc.items[0].schedule_date = '2017-12-12',
-		() => cur_frm.save(),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/material_request/tests/test_material_request_type_manufacture.js b/erpnext/stock/doctype/material_request/tests/test_material_request_type_manufacture.js
deleted file mode 100644
index 137079b..0000000
--- a/erpnext/stock/doctype/material_request/tests/test_material_request_type_manufacture.js
+++ /dev/null
@@ -1,29 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material request", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Material Request', [
-				{material_request_type:'Manufacture'},
-				{items: [
-					[
-						{'schedule_date':  frappe.datetime.add_days(frappe.datetime.nowdate(), 5)},
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/material_request/tests/test_material_request_type_material_issue.js b/erpnext/stock/doctype/material_request/tests/test_material_request_type_material_issue.js
deleted file mode 100644
index b03a854..0000000
--- a/erpnext/stock/doctype/material_request/tests/test_material_request_type_material_issue.js
+++ /dev/null
@@ -1,29 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material request for issue", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Material Request', [
-				{material_request_type:'Material Issue'},
-				{items: [
-					[
-						{'schedule_date':  frappe.datetime.add_days(frappe.datetime.nowdate(), 5)},
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/material_request/tests/test_material_request_type_material_transfer.js b/erpnext/stock/doctype/material_request/tests/test_material_request_type_material_transfer.js
deleted file mode 100644
index 7c62c2e..0000000
--- a/erpnext/stock/doctype/material_request/tests/test_material_request_type_material_transfer.js
+++ /dev/null
@@ -1,29 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material request for transfer", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Material Request', [
-				{material_request_type:'Manufacture'},
-				{items: [
-					[
-						{'schedule_date':  frappe.datetime.add_days(frappe.datetime.nowdate(), 5)},
-						{'qty': 5},
-						{'item_code': 'Test Product 1'},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/price_list/test_price_list_uom.js b/erpnext/stock/doctype/price_list/test_price_list_uom.js
deleted file mode 100644
index 3896c0e..0000000
--- a/erpnext/stock/doctype/price_list/test_price_list_uom.js
+++ /dev/null
@@ -1,58 +0,0 @@
-QUnit.module('Price List');
-
-QUnit.test("test price list with uom dependancy", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-
-		() => frappe.set_route('Form', 'Price List', 'Standard Buying'),
-		() => {
-			cur_frm.set_value('price_not_uom_dependent','1');
-			frappe.timeout(1);
-		},
-		() => cur_frm.save(),
-
-		() => frappe.timeout(1),
-
-		() => {
-			return frappe.tests.make('Item Price', [
-				{price_list:'Standard Buying'},
-				{item_code: 'Test Product 3'},
-				{price_list_rate: 200}
-			]);
-		},
-
-		() => cur_frm.save(),
-
-		() => {
-			return frappe.tests.make('Purchase Order', [
-				{supplier: 'Test Supplier'},
-				{currency: 'INR'},
-				{buying_price_list: 'Standard Buying'},
-				{items: [
-					[
-						{"item_code": 'Test Product 3'},
-						{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 2)},
-						{"uom": 'Nos'},
-						{"conversion_factor": 3}
-					]
-				]},
-
-			]);
-		},
-
-		() => cur_frm.save(),
-		() => frappe.timeout(0.3),
-
-		() => {
-			assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 3', "Item code correct");
-			assert.ok(cur_frm.doc.items[0].price_list_rate == 200, "Price list rate correct");
-		},
-
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(1),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.js
deleted file mode 100644
index d1f4485..0000000
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.js
+++ /dev/null
@@ -1,42 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test Purchase Receipt", function(assert) {
-	assert.expect(4);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Purchase Receipt', [
-				{supplier: 'Test Supplier'},
-				{items: [
-					[
-						{'received_qty': 5},
-						{'qty': 4},
-						{'item_code': 'Test Product 1'},
-						{'uom': 'Nos'},
-						{'warehouse':'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-						{'rejected_warehouse':'Work In Progress - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-					]
-				]},
-				{taxes_and_charges: 'TEST In State GST - FT'},
-				{tc_name: 'Test Term 1'},
-				{terms: 'This is Test'}
-			]);
-		},
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			// get tax details
-			assert.ok(cur_frm.doc.taxes_and_charges=='TEST In State GST - FT', "Tax details correct");
-			// get tax account head details
-			assert.ok(cur_frm.doc.taxes[0].account_head=='CGST - '+frappe.get_abbr(frappe.defaults.get_default('Company')), " Account Head abbr correct");
-			// grand_total Calculated
-			assert.ok(cur_frm.doc.grand_total==472, "Grad Total correct");
-
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_manufacture.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_manufacture.js
deleted file mode 100644
index e51c90c..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_manufacture.js
+++ /dev/null
@@ -1,26 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test manufacture from bom", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make("Stock Entry", [
-				{ purpose: "Manufacture" },
-				{ from_bom: 1 },
-				{ bom_no: "BOM-_Test Item - Non Whole UOM-001" },
-				{ fg_completed_qty: 2 }
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button("Update Rate and Availability"),
-		() => {
-			assert.ok(cur_frm.doc.items[1] === 0.75, " Finished Item Qty correct");
-			assert.ok(cur_frm.doc.items[2] === 0.25, " Process Loss Item Qty correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue.js
deleted file mode 100644
index a87a7fb..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue.js
+++ /dev/null
@@ -1,30 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material request", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{from_warehouse:'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 5},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.total_outgoing_value==500, " Outgoing Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue_with_serialize_item.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue_with_serialize_item.js
deleted file mode 100644
index cae318d..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_issue_with_serialize_item.js
+++ /dev/null
@@ -1,34 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material issue", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{from_warehouse:'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{items: [
-					[
-						{'item_code': 'Test Product 4'},
-						{'qty': 1},
-						{'batch_no':'TEST-BATCH-001'},
-						{'serial_no':'Test-Product-003'},
-						{'basic_rate':100},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Close'),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			assert.ok(cur_frm.doc.total_outgoing_value==100, " Outgoing Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt.js
deleted file mode 100644
index ef0286f..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt.js
+++ /dev/null
@@ -1,31 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material request", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{purpose:'Material Receipt'},
-				{to_warehouse:'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 5},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.total_incoming_value==500, " Incoming Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt_for_serialize_item.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt_for_serialize_item.js
deleted file mode 100644
index 54e1ac8..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_receipt_for_serialize_item.js
+++ /dev/null
@@ -1,34 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material receipt", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{purpose:'Material Receipt'},
-				{to_warehouse:'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{items: [
-					[
-						{'item_code': 'Test Product 4'},
-						{'qty': 5},
-						{'batch_no':'TEST-BATCH-001'},
-						{'serial_no':'Test-Product-001\nTest-Product-002\nTest-Product-003\nTest-Product-004\nTest-Product-005'},
-						{'basic_rate':100},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 4', "Item name correct");
-			assert.ok(cur_frm.doc.total_incoming_value==500, " Incoming Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer.js
deleted file mode 100644
index fac0b4b..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer.js
+++ /dev/null
@@ -1,33 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material request", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{purpose:'Material Transfer'},
-				{from_warehouse:'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{to_warehouse:'Work In Progress - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 5},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.total_outgoing_value==500, " Outgoing Value correct");
-			assert.ok(cur_frm.doc.total_incoming_value==500, " Incoming Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer_for_manufacture.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer_for_manufacture.js
deleted file mode 100644
index 9f85307..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_material_transfer_for_manufacture.js
+++ /dev/null
@@ -1,33 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material Transfer to manufacture", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{purpose:'Material Transfer for Manufacture'},
-				{from_warehouse:'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{to_warehouse:'Work In Progress - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 1},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.total_outgoing_value==100, " Outgoing Value correct");
-			assert.ok(cur_frm.doc.total_incoming_value==100, " Incoming Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_repack.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_repack.js
deleted file mode 100644
index 20f119a..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_repack.js
+++ /dev/null
@@ -1,41 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test repack", function(assert) {
-	assert.expect(2);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{purpose:'Repack'},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 1},
-						{'s_warehouse':'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-					],
-					[
-						{'item_code': 'Test Product 2'},
-						{'qty': 1},
-						{'s_warehouse':'Stores - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-					],
-					[
-						{'item_code': 'Test Product 3'},
-						{'qty': 1},
-						{'t_warehouse':'Work In Progress - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-					],
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.total_outgoing_value==250, " Outgoing Value correct");
-			assert.ok(cur_frm.doc.total_incoming_value==250, " Incoming Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js b/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js
deleted file mode 100644
index 8243426..0000000
--- a/erpnext/stock/doctype/stock_entry/tests/test_stock_entry_for_subcontract.js
+++ /dev/null
@@ -1,33 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test material Transfer to manufacture", function(assert) {
-	assert.expect(3);
-	let done = assert.async();
-	frappe.run_serially([
-		() => {
-			return frappe.tests.make('Stock Entry', [
-				{purpose:'Send to Subcontractor'},
-				{from_warehouse:'Work In Progress - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{to_warehouse:'Finished Goods - '+frappe.get_abbr(frappe.defaults.get_default('Company'))},
-				{items: [
-					[
-						{'item_code': 'Test Product 1'},
-						{'qty': 1},
-					]
-				]},
-			]);
-		},
-		() => cur_frm.save(),
-		() => frappe.click_button('Update Rate and Availability'),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
-			assert.ok(cur_frm.doc.total_outgoing_value==100, " Outgoing Value correct");
-			assert.ok(cur_frm.doc.total_incoming_value==100, " Incoming Value correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.js
deleted file mode 100644
index 666d2c7..0000000
--- a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.js
+++ /dev/null
@@ -1,31 +0,0 @@
-QUnit.module('Stock');
-
-QUnit.test("test Stock Reconciliation", function(assert) {
-	assert.expect(1);
-	let done = assert.async();
-	frappe.run_serially([
-		() => frappe.set_route('List', 'Stock Reconciliation'),
-		() => frappe.timeout(1),
-		() => frappe.click_button('New'),
-		() => cur_frm.set_value('company','For Testing'),
-		() => frappe.click_button('Items'),
-		() => {cur_dialog.set_value('warehouse','Stores - FT'); },
-		() => frappe.timeout(0.5),
-		() => frappe.click_button('Update'),
-		() => {
-			cur_frm.doc.items[0].qty = 150;
-			cur_frm.refresh_fields('items');},
-		() => frappe.timeout(0.5),
-		() => cur_frm.set_value('expense_account','Stock Adjustment - FT'),
-		() => cur_frm.set_value('cost_center','Main - FT'),
-		() => cur_frm.save(),
-		() => {
-			// get_item_details
-			assert.ok(cur_frm.doc.expense_account=='Stock Adjustment - FT', "expense_account correct");
-		},
-		() => frappe.tests.click_button('Submit'),
-		() => frappe.tests.click_button('Yes'),
-		() => frappe.timeout(0.3),
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/doctype/warehouse/test_warehouse.js b/erpnext/stock/doctype/warehouse/test_warehouse.js
deleted file mode 100644
index 850da1e..0000000
--- a/erpnext/stock/doctype/warehouse/test_warehouse.js
+++ /dev/null
@@ -1,19 +0,0 @@
-QUnit.test("test: warehouse", function (assert) {
-	assert.expect(0);
-	let done = assert.async();
-
-	frappe.run_serially([
-		// test warehouse creation
-		() => frappe.set_route("List", "Warehouse"),
-
-		// Create a Laptop Scrap Warehouse
-		() => frappe.tests.make(
-			"Warehouse", [
-				{warehouse_name: "Laptop Scrap Warehouse"},
-				{company: "For Testing"}
-			]
-		),
-
-		() => done()
-	]);
-});
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/__init__.py b/erpnext/stock/report/stock_ledger_invariant_check/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/__init__.py
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js
new file mode 100644
index 0000000..c484516
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.js
@@ -0,0 +1,43 @@
+// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+/* eslint-disable */
+
+const DIFFERNCE_FIELD_NAMES = [
+	"difference_in_qty",
+	"fifo_qty_diff",
+	"fifo_value_diff",
+	"fifo_valuation_diff",
+	"valuation_diff",
+	"fifo_difference_diff"
+];
+
+frappe.query_reports["Stock Ledger Invariant Check"] = {
+	"filters": [
+		{
+			"fieldname": "item_code",
+			"fieldtype": "Link",
+			"label": "Item",
+			"mandatory": 1,
+			"options": "Item",
+			get_query: function() {
+				return {
+					filters: {is_stock_item: 1, has_serial_no: 0}
+				}
+			}
+		},
+		{
+			"fieldname": "warehouse",
+			"fieldtype": "Link",
+			"label": "Warehouse",
+			"mandatory": 1,
+			"options": "Warehouse",
+		}
+	],
+	formatter (value, row, column, data, default_formatter) {
+		value = default_formatter(value, row, column, data);
+		if (DIFFERNCE_FIELD_NAMES.includes(column.fieldname) && Math.abs(data[column.fieldname]) > 0.001) {
+			value = "<span style='color:red'>" + value + "</span>";
+		}
+		return value;
+	},
+};
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.json b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.json
new file mode 100644
index 0000000..d28fe0f
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.json
@@ -0,0 +1,26 @@
+{
+ "add_total_row": 0,
+ "columns": [],
+ "creation": "2021-12-16 06:31:23.290916",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "filters": [],
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2021-12-16 09:55:58.341764",
+ "modified_by": "Administrator",
+ "module": "Stock",
+ "name": "Stock Ledger Invariant Check",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "ref_doctype": "Stock Ledger Entry",
+ "report_name": "Stock Ledger Invariant Check",
+ "report_type": "Script Report",
+ "roles": [
+  {
+   "role": "System Manager"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py
new file mode 100644
index 0000000..ca47a1e
--- /dev/null
+++ b/erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py
@@ -0,0 +1,236 @@
+# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
+# License: GNU GPL v3. See LICENSE
+
+import json
+
+import frappe
+
+SLE_FIELDS = (
+	"name",
+	"posting_date",
+	"posting_time",
+	"creation",
+	"voucher_type",
+	"voucher_no",
+	"actual_qty",
+	"qty_after_transaction",
+	"incoming_rate",
+	"outgoing_rate",
+	"stock_queue",
+	"batch_no",
+	"stock_value",
+	"stock_value_difference",
+	"valuation_rate",
+)
+
+
+def execute(filters=None):
+	columns = get_columns()
+	data = get_data(filters)
+	return columns, data
+
+
+def get_data(filters):
+	sles = get_stock_ledger_entries(filters)
+	return add_invariant_check_fields(sles)
+
+
+def get_stock_ledger_entries(filters):
+	return frappe.get_all(
+		"Stock Ledger Entry",
+		fields=SLE_FIELDS,
+		filters={
+			"item_code": filters.item_code,
+			"warehouse": filters.warehouse,
+			"is_cancelled": 0
+		},
+		order_by="timestamp(posting_date, posting_time), creation",
+	)
+
+
+def add_invariant_check_fields(sles):
+	balance_qty = 0.0
+	for idx, sle in enumerate(sles):
+		queue = json.loads(sle.stock_queue)
+
+		fifo_qty = 0.0
+		fifo_value = 0.0
+		for qty, rate in queue:
+			fifo_qty += qty
+			fifo_value += qty * rate
+
+		balance_qty += sle.actual_qty
+		if sle.voucher_type == "Stock Reconciliation" and not sle.batch_no:
+			balance_qty = sle.qty_after_transaction
+
+		sle.fifo_queue_qty = fifo_qty
+		sle.fifo_stock_value = fifo_value
+		sle.fifo_valuation_rate = fifo_value / fifo_qty if fifo_qty else None
+		sle.balance_value_by_qty = (
+			sle.stock_value / sle.qty_after_transaction if sle.qty_after_transaction else None
+		)
+		sle.expected_qty_after_transaction = balance_qty
+
+		# set difference fields
+		sle.difference_in_qty = sle.qty_after_transaction - sle.expected_qty_after_transaction
+		sle.fifo_qty_diff = sle.qty_after_transaction - fifo_qty
+		sle.fifo_value_diff = sle.stock_value - fifo_value
+		sle.fifo_valuation_diff = (
+			sle.valuation_rate - sle.fifo_valuation_rate if sle.fifo_valuation_rate else None
+		)
+		sle.valuation_diff = (
+			sle.valuation_rate - sle.balance_value_by_qty if sle.balance_value_by_qty else None
+		)
+
+		if idx > 0:
+			sle.fifo_stock_diff = sle.fifo_stock_value - sles[idx - 1].fifo_stock_value
+			sle.fifo_difference_diff = sle.fifo_stock_diff - sle.stock_value_difference
+
+	return sles
+
+
+def get_columns():
+	return [
+		{
+			"fieldname": "name",
+			"fieldtype": "Link",
+			"label": "Stock Ledger Entry",
+			"options": "Stock Ledger Entry",
+		},
+		{
+			"fieldname": "posting_date",
+			"fieldtype": "Date",
+			"label": "Posting Date",
+		},
+		{
+			"fieldname": "posting_time",
+			"fieldtype": "Time",
+			"label": "Posting Time",
+		},
+		{
+			"fieldname": "creation",
+			"fieldtype": "Datetime",
+			"label": "Creation",
+		},
+		{
+			"fieldname": "voucher_type",
+			"fieldtype": "Link",
+			"label": "Voucher Type",
+			"options": "DocType",
+		},
+		{
+			"fieldname": "voucher_no",
+			"fieldtype": "Dynamic Link",
+			"label": "Voucher No",
+			"options": "voucher_type",
+		},
+		{
+			"fieldname": "batch_no",
+			"fieldtype": "Link",
+			"label": "Batch",
+			"options": "Batch",
+		},
+		{
+			"fieldname": "actual_qty",
+			"fieldtype": "Float",
+			"label": "Qty Change",
+		},
+		{
+			"fieldname": "incoming_rate",
+			"fieldtype": "Float",
+			"label": "Incoming Rate",
+		},
+		{
+			"fieldname": "outgoing_rate",
+			"fieldtype": "Float",
+			"label": "Outgoing Rate",
+		},
+		{
+			"fieldname": "qty_after_transaction",
+			"fieldtype": "Float",
+			"label": "(A) Qty After Transaction",
+		},
+		{
+			"fieldname": "expected_qty_after_transaction",
+			"fieldtype": "Float",
+			"label": "(B) Expected Qty After Transaction",
+		},
+		{
+			"fieldname": "difference_in_qty",
+			"fieldtype": "Float",
+			"label": "A - B",
+		},
+		{
+			"fieldname": "stock_queue",
+			"fieldtype": "Data",
+			"label": "FIFO Queue",
+		},
+
+		{
+			"fieldname": "fifo_queue_qty",
+			"fieldtype": "Float",
+			"label": "(C) Total qty in queue",
+		},
+		{
+			"fieldname": "fifo_qty_diff",
+			"fieldtype": "Float",
+			"label": "A - C",
+		},
+		{
+			"fieldname": "stock_value",
+			"fieldtype": "Float",
+			"label": "(D) Balance Stock Value",
+		},
+		{
+			"fieldname": "fifo_stock_value",
+			"fieldtype": "Float",
+			"label": "(E) Balance Stock Value in Queue",
+		},
+		{
+			"fieldname": "fifo_value_diff",
+			"fieldtype": "Float",
+			"label": "D - E",
+		},
+
+		{
+			"fieldname": "stock_value_difference",
+			"fieldtype": "Float",
+			"label": "(F) Stock Value Difference",
+		},
+		{
+			"fieldname": "fifo_stock_diff",
+			"fieldtype": "Float",
+			"label": "(G) Stock Value difference (FIFO queue)",
+		},
+		{
+			"fieldname": "fifo_difference_diff",
+			"fieldtype": "Float",
+			"label": "F - G",
+		},
+		{
+			"fieldname": "valuation_rate",
+			"fieldtype": "Float",
+			"label": "(H) Valuation Rate",
+		},
+		{
+			"fieldname": "fifo_valuation_rate",
+			"fieldtype": "Float",
+			"label": "(I) Valuation Rate as per FIFO",
+		},
+
+		{
+			"fieldname": "fifo_valuation_diff",
+			"fieldtype": "Float",
+			"label": "H - I",
+		},
+		{
+			"fieldname": "balance_value_by_qty",
+			"fieldtype": "Float",
+			"label": "(J) Valuation = Value (D) ÷ Qty (A)",
+		},
+		{
+			"fieldname": "valuation_diff",
+			"fieldtype": "Float",
+			"label": "H - J",
+		},
+	]
diff --git a/erpnext/stock/report/test_reports.py b/erpnext/stock/report/test_reports.py
index d7fb5b2..1dcf863 100644
--- a/erpnext/stock/report/test_reports.py
+++ b/erpnext/stock/report/test_reports.py
@@ -41,6 +41,12 @@
 	("Total Stock Summary", {"group_by": "warehouse",}),
 	("Batch Item Expiry Status", {}),
 	("Stock Ageing", {"range1": 30, "range2": 60, "range3": 90, "_optional": True}),
+	("Stock Ledger Invariant Check",
+		{
+			"warehouse": "_Test Warehouse - _TC",
+			"item": "_Test Item"
+		}
+	),
 ]
 
 OPTIONAL_FILTERS = {
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index e95c0fc..f45bee1 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -16,6 +16,7 @@
 	get_or_make_bin,
 	get_valuation_method,
 )
+from erpnext.stock.valuation import FIFOValuation
 
 
 class NegativeStockError(frappe.ValidationError): pass
@@ -456,9 +457,8 @@
 					self.wh_data.qty_after_transaction += flt(sle.actual_qty)
 					self.wh_data.stock_value = flt(self.wh_data.qty_after_transaction) * flt(self.wh_data.valuation_rate)
 				else:
-					self.get_fifo_values(sle)
+					self.update_fifo_values(sle)
 					self.wh_data.qty_after_transaction += flt(sle.actual_qty)
-					self.wh_data.stock_value = sum(flt(batch[0]) * flt(batch[1]) for batch in self.wh_data.stock_queue)
 
 		# rounding as per precision
 		self.wh_data.stock_value = flt(self.wh_data.stock_value, self.precision)
@@ -696,87 +696,39 @@
 						sle.voucher_type, sle.voucher_no, self.allow_zero_rate,
 						currency=erpnext.get_company_currency(sle.company), company=sle.company)
 
-	def get_fifo_values(self, sle):
+	def update_fifo_values(self, sle):
 		incoming_rate = flt(sle.incoming_rate)
 		actual_qty = flt(sle.actual_qty)
 		outgoing_rate = flt(sle.outgoing_rate)
 
+		fifo_queue = FIFOValuation(self.wh_data.stock_queue)
 		if actual_qty > 0:
-			if not self.wh_data.stock_queue:
-				self.wh_data.stock_queue.append([0, 0])
-
-			# last row has the same rate, just updated the qty
-			if self.wh_data.stock_queue[-1][1]==incoming_rate:
-				self.wh_data.stock_queue[-1][0] += actual_qty
-			else:
-				# Item has a positive balance qty, add new entry
-				if self.wh_data.stock_queue[-1][0] > 0:
-					self.wh_data.stock_queue.append([actual_qty, incoming_rate])
-				else: # negative balance qty
-					qty = self.wh_data.stock_queue[-1][0] + actual_qty
-					if qty > 0: # new balance qty is positive
-						self.wh_data.stock_queue[-1] = [qty, incoming_rate]
-					else: # new balance qty is still negative, maintain same rate
-						self.wh_data.stock_queue[-1][0] = qty
+			fifo_queue.add_stock(qty=actual_qty, rate=incoming_rate)
 		else:
-			qty_to_pop = abs(actual_qty)
-			while qty_to_pop:
-				if not self.wh_data.stock_queue:
-					# Get valuation rate from last sle if exists or from valuation rate field in item master
-					allow_zero_valuation_rate = self.check_if_allow_zero_valuation_rate(sle.voucher_type, sle.voucher_detail_no)
-					if not allow_zero_valuation_rate:
-						_rate = get_valuation_rate(sle.item_code, sle.warehouse,
-							sle.voucher_type, sle.voucher_no, self.allow_zero_rate,
-							currency=erpnext.get_company_currency(sle.company), company=sle.company)
-					else:
-						_rate = 0
-
-					self.wh_data.stock_queue.append([0, _rate])
-
-				index = None
-				if outgoing_rate > 0:
-					# Find the entry where rate matched with outgoing rate
-					for i, v in enumerate(self.wh_data.stock_queue):
-						if v[1] == outgoing_rate:
-							index = i
-							break
-
-					# If no entry found with outgoing rate, collapse stack
-					if index is None:  # nosemgrep
-						new_stock_value = sum(d[0]*d[1] for d in self.wh_data.stock_queue) - qty_to_pop*outgoing_rate
-						new_stock_qty = sum(d[0] for d in self.wh_data.stock_queue) - qty_to_pop
-						self.wh_data.stock_queue = [[new_stock_qty, new_stock_value/new_stock_qty if new_stock_qty > 0 else outgoing_rate]]
-						break
+			def rate_generator() -> float:
+				allow_zero_valuation_rate = self.check_if_allow_zero_valuation_rate(sle.voucher_type, sle.voucher_detail_no)
+				if not allow_zero_valuation_rate:
+					return get_valuation_rate(sle.item_code, sle.warehouse,
+						sle.voucher_type, sle.voucher_no, self.allow_zero_rate,
+						currency=erpnext.get_company_currency(sle.company), company=sle.company)
 				else:
-					index = 0
+					return 0.0
 
-				# select first batch or the batch with same rate
-				batch = self.wh_data.stock_queue[index]
-				if qty_to_pop >= batch[0]:
-					# consume current batch
-					qty_to_pop = _round_off_if_near_zero(qty_to_pop - batch[0])
-					self.wh_data.stock_queue.pop(index)
-					if not self.wh_data.stock_queue and qty_to_pop:
-						# stock finished, qty still remains to be withdrawn
-						# negative stock, keep in as a negative batch
-						self.wh_data.stock_queue.append([-qty_to_pop, outgoing_rate or batch[1]])
-						break
+			fifo_queue.remove_stock(qty=abs(actual_qty), outgoing_rate=outgoing_rate, rate_generator=rate_generator)
 
-				else:
-					# qty found in current batch
-					# consume it and exit
-					batch[0] = batch[0] - qty_to_pop
-					qty_to_pop = 0
+		stock_qty, stock_value = fifo_queue.get_total_stock_and_value()
 
-		stock_value = _round_off_if_near_zero(sum(flt(batch[0]) * flt(batch[1]) for batch in self.wh_data.stock_queue))
-		stock_qty = _round_off_if_near_zero(sum(flt(batch[0]) for batch in self.wh_data.stock_queue))
-
+		self.wh_data.stock_queue = fifo_queue.get_state()
+		self.wh_data.stock_value = stock_value
 		if stock_qty:
-			self.wh_data.valuation_rate = stock_value / flt(stock_qty)
+			self.wh_data.valuation_rate = stock_value / stock_qty
+
 
 		if not self.wh_data.stock_queue:
 			self.wh_data.stock_queue.append([0, sle.incoming_rate or sle.outgoing_rate or self.wh_data.valuation_rate])
 
+
+
 	def check_if_allow_zero_valuation_rate(self, voucher_type, voucher_detail_no):
 		ref_item_dt = ""
 
@@ -1158,13 +1110,3 @@
 			and timestamp(posting_date, posting_time) >= timestamp(%(posting_date)s, %(posting_time)s)
 		limit 1
 	""", args, as_dict=1)
-
-
-def _round_off_if_near_zero(number: float, precision: int = 6) -> float:
-	""" Rounds off the number to zero only if number is close to zero for decimal
-		specified in precision. Precision defaults to 6.
-	"""
-	if flt(number) < (1.0 / (10**precision)):
-		return 0
-
-	return flt(number)
diff --git a/erpnext/stock/tests/test_valuation.py b/erpnext/stock/tests/test_valuation.py
new file mode 100644
index 0000000..85788ba
--- /dev/null
+++ b/erpnext/stock/tests/test_valuation.py
@@ -0,0 +1,166 @@
+import unittest
+
+from hypothesis import given
+from hypothesis import strategies as st
+
+from erpnext.stock.valuation import FIFOValuation, _round_off_if_near_zero
+
+qty_gen = st.floats(min_value=-1e6, max_value=1e6)
+value_gen = st.floats(min_value=1, max_value=1e6)
+stock_queue_generator = st.lists(st.tuples(qty_gen, value_gen), min_size=10)
+
+
+class TestFifoValuation(unittest.TestCase):
+
+	def setUp(self):
+		self.queue = FIFOValuation([])
+
+	def tearDown(self):
+		qty, value = self.queue.get_total_stock_and_value()
+		self.assertTotalQty(qty)
+		self.assertTotalValue(value)
+
+	def assertTotalQty(self, qty):
+		self.assertAlmostEqual(sum(q for q, _ in self.queue), qty, msg=f"queue: {self.queue}", places=4)
+
+	def assertTotalValue(self, value):
+		self.assertAlmostEqual(sum(q * r for q, r in self.queue), value, msg=f"queue: {self.queue}", places=2)
+
+	def test_simple_addition(self):
+		self.queue.add_stock(1, 10)
+		self.assertTotalQty(1)
+
+	def test_simple_removal(self):
+		self.queue.add_stock(1, 10)
+		self.queue.remove_stock(1)
+		self.assertTotalQty(0)
+
+	def test_merge_new_stock(self):
+		self.queue.add_stock(1, 10)
+		self.queue.add_stock(1, 10)
+		self.assertEqual(self.queue, [[2, 10]])
+
+	def test_adding_negative_stock_keeps_rate(self):
+		self.queue = FIFOValuation([[-5.0, 100]])
+		self.queue.add_stock(1, 10)
+		self.assertEqual(self.queue, [[-4, 100]])
+
+	def test_adding_negative_stock_updates_rate(self):
+		self.queue = FIFOValuation([[-5.0, 100]])
+		self.queue.add_stock(6, 10)
+		self.assertEqual(self.queue, [[1, 10]])
+
+
+	def test_negative_stock(self):
+		self.queue.remove_stock(1, 5)
+		self.assertEqual(self.queue, [[-1, 5]])
+
+		# XXX
+		self.queue.remove_stock(1, 10)
+		self.assertTotalQty(-2)
+
+		self.queue.add_stock(2, 10)
+		self.assertTotalQty(0)
+		self.assertTotalValue(0)
+
+	def test_removing_specified_rate(self):
+		self.queue.add_stock(1, 10)
+		self.queue.add_stock(1, 20)
+
+		self.queue.remove_stock(1, 20)
+		self.assertEqual(self.queue, [[1, 10]])
+
+
+	def test_remove_multiple_bins(self):
+		self.queue.add_stock(1, 10)
+		self.queue.add_stock(2, 20)
+		self.queue.add_stock(1, 20)
+		self.queue.add_stock(5, 20)
+
+		self.queue.remove_stock(4)
+		self.assertEqual(self.queue, [[5, 20]])
+
+
+	def test_remove_multiple_bins_with_rate(self):
+		self.queue.add_stock(1, 10)
+		self.queue.add_stock(2, 20)
+		self.queue.add_stock(1, 20)
+		self.queue.add_stock(5, 20)
+
+		self.queue.remove_stock(3, 20)
+		self.assertEqual(self.queue, [[1, 10], [5, 20]])
+
+	def test_collapsing_of_queue(self):
+		self.queue.add_stock(1, 1)
+		self.queue.add_stock(1, 2)
+		self.queue.add_stock(1, 3)
+		self.queue.add_stock(1, 4)
+
+		self.assertTotalValue(10)
+
+		self.queue.remove_stock(3, 1)
+		# XXX
+		self.assertEqual(self.queue, [[1, 7]])
+
+	def test_rounding_off(self):
+		self.queue.add_stock(1.0, 1.0)
+		self.queue.remove_stock(1.0 - 1e-9)
+		self.assertTotalQty(0)
+
+	def test_rounding_off_near_zero(self):
+		self.assertEqual(_round_off_if_near_zero(0), 0)
+		self.assertEqual(_round_off_if_near_zero(1), 1)
+		self.assertEqual(_round_off_if_near_zero(-1), -1)
+		self.assertEqual(_round_off_if_near_zero(-1e-8), 0)
+		self.assertEqual(_round_off_if_near_zero(1e-8), 0)
+
+	def test_totals(self):
+		self.queue.add_stock(1, 10)
+		self.queue.add_stock(2, 13)
+		self.queue.add_stock(1, 17)
+		self.queue.remove_stock(1)
+		self.queue.remove_stock(1)
+		self.queue.remove_stock(1)
+		self.queue.add_stock(5, 17)
+		self.queue.add_stock(8, 11)
+
+	@given(stock_queue_generator)
+	def test_fifo_qty_hypothesis(self, stock_queue):
+		self.queue = FIFOValuation([])
+		total_qty = 0
+
+		for qty, rate in stock_queue:
+			if qty == 0:
+				continue
+			if qty > 0:
+				self.queue.add_stock(qty, rate)
+				total_qty += qty
+			else:
+				qty = abs(qty)
+				consumed = self.queue.remove_stock(qty)
+				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				total_qty -= qty
+			self.assertTotalQty(total_qty)
+
+	@given(stock_queue_generator)
+	def test_fifo_qty_value_nonneg_hypothesis(self, stock_queue):
+		self.queue = FIFOValuation([])
+		total_qty = 0.0
+		total_value = 0.0
+
+		for qty, rate in stock_queue:
+			# don't allow negative stock
+			if qty == 0 or total_qty + qty < 0 or abs(qty) < 0.1:
+				continue
+			if qty > 0:
+				self.queue.add_stock(qty, rate)
+				total_qty += qty
+				total_value += qty * rate
+			else:
+				qty = abs(qty)
+				consumed = self.queue.remove_stock(qty)
+				self.assertAlmostEqual(qty, sum(q for q, _ in consumed), msg=f"incorrect consumption {consumed}")
+				total_qty -= qty
+				total_value -= sum(q * r for q, r in consumed)
+			self.assertTotalQty(total_qty)
+			self.assertTotalValue(total_value)
diff --git a/erpnext/stock/valuation.py b/erpnext/stock/valuation.py
new file mode 100644
index 0000000..45c5083
--- /dev/null
+++ b/erpnext/stock/valuation.py
@@ -0,0 +1,146 @@
+from typing import Callable, List, NewType, Optional, Tuple
+
+from frappe.utils import flt
+
+FifoBin = NewType("FifoBin", List[float])
+
+# Indexes of values inside FIFO bin 2-tuple
+QTY = 0
+RATE = 1
+
+
+class FIFOValuation:
+	"""Valuation method where a queue of all the incoming stock is maintained.
+
+	New stock is added at end of the queue.
+	Qty consumption happens on First In First Out basis.
+
+	Queue is implemented using "bins" of [qty, rate].
+
+	ref: https://en.wikipedia.org/wiki/FIFO_and_LIFO_accounting
+	"""
+
+	# specifying the attributes to save resources
+	# ref: https://docs.python.org/3/reference/datamodel.html#slots
+	__slots__ = ["queue",]
+
+	def __init__(self, state: Optional[List[FifoBin]]):
+		self.queue: List[FifoBin] = state if state is not None else []
+
+	def __repr__(self):
+		return str(self.queue)
+
+	def __iter__(self):
+		return iter(self.queue)
+
+	def __eq__(self, other):
+		if isinstance(other, list):
+			return self.queue == other
+		return self.queue == other.queue
+
+	def get_state(self) -> List[FifoBin]:
+		"""Get current state of queue."""
+		return self.queue
+
+	def get_total_stock_and_value(self) -> Tuple[float, float]:
+		total_qty = 0.0
+		total_value = 0.0
+
+		for qty, rate in self.queue:
+			total_qty += flt(qty)
+			total_value += flt(qty) * flt(rate)
+
+		return _round_off_if_near_zero(total_qty), _round_off_if_near_zero(total_value)
+
+	def add_stock(self, qty: float, rate: float) -> None:
+		"""Update fifo queue with new stock.
+
+			args:
+				qty: new quantity to add
+				rate: incoming rate of new quantity"""
+
+		if not len(self.queue):
+			self.queue.append([0, 0])
+
+		# last row has the same rate, merge new bin.
+		if self.queue[-1][RATE] == rate:
+			self.queue[-1][QTY] += qty
+		else:
+			# Item has a positive balance qty, add new entry
+			if self.queue[-1][QTY] > 0:
+				self.queue.append([qty, rate])
+			else:  # negative balance qty
+				qty = self.queue[-1][QTY] + qty
+				if qty > 0:  # new balance qty is positive
+					self.queue[-1] = [qty, rate]
+				else:  # new balance qty is still negative, maintain same rate
+					self.queue[-1][QTY] = qty
+
+	def remove_stock(
+		self, qty: float, outgoing_rate: float = 0.0, rate_generator: Callable[[], float] = None
+	) -> List[FifoBin]:
+		"""Remove stock from the queue and return popped bins.
+
+		args:
+			qty: quantity to remove
+			rate: outgoing rate
+			rate_generator: function to be called if queue is not found and rate is required.
+		"""
+		if not rate_generator:
+			rate_generator = lambda : 0.0  # noqa
+
+		consumed_bins = []
+		while qty:
+			if not len(self.queue):
+				# rely on rate generator.
+				self.queue.append([0, rate_generator()])
+
+			index = None
+			if outgoing_rate > 0:
+				# Find the entry where rate matched with outgoing rate
+				for idx, fifo_bin in enumerate(self.queue):
+					if fifo_bin[RATE] == outgoing_rate:
+						index = idx
+						break
+
+				# If no entry found with outgoing rate, collapse queue
+				if index is None:  # nosemgrep
+					new_stock_value = sum(d[QTY] * d[RATE] for d in self.queue) - qty * outgoing_rate
+					new_stock_qty = sum(d[QTY] for d in self.queue) - qty
+					self.queue = [[new_stock_qty, new_stock_value / new_stock_qty if new_stock_qty > 0 else outgoing_rate]]
+					consumed_bins.append([qty, outgoing_rate])
+					break
+			else:
+				index = 0
+
+			# select first bin or the bin with same rate
+			fifo_bin = self.queue[index]
+			if qty >= fifo_bin[QTY]:
+				# consume current bin
+				qty = _round_off_if_near_zero(qty - fifo_bin[QTY])
+				to_consume = self.queue.pop(index)
+				consumed_bins.append(list(to_consume))
+
+				if not self.queue and qty:
+					# stock finished, qty still remains to be withdrawn
+					# negative stock, keep in as a negative bin
+					self.queue.append([-qty, outgoing_rate or fifo_bin[RATE]])
+					consumed_bins.append([qty, outgoing_rate or fifo_bin[RATE]])
+					break
+			else:
+				# qty found in current bin consume it and exit
+				fifo_bin[QTY] = _round_off_if_near_zero(fifo_bin[QTY] - qty)
+				consumed_bins.append([qty, fifo_bin[RATE]])
+				qty = 0
+
+		return consumed_bins
+
+
+def _round_off_if_near_zero(number: float, precision: int = 7) -> float:
+	"""Rounds off the number to zero only if number is close to zero for decimal
+	specified in precision. Precision defaults to 7.
+	"""
+	if abs(0.0 - flt(number)) < (1.0 / (10 ** precision)):
+		return 0.0
+
+	return flt(number)