fix: update get_exchange_rate for test mode (#26847)

* fix: no api calls on test mode

* fix: make api call, but return 1.0 incase of invalid currency

* feat: patch request.get

* fix: clear cache after test

* fix: add missing test_exchange_value

* fix: avoid api call in implicit function call during test

* fix: returning 1 while in test causes failure

Returning 1.00 causes failure of exchange rate tests.

* chore: retab

* chore: style
diff --git a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py
index 4ff2dd7..0eb7e7b 100644
--- a/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py
+++ b/erpnext/setup/doctype/currency_exchange/test_currency_exchange.py
@@ -1,14 +1,14 @@
 # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 # License: GNU General Public License v3. See license.txt
-from __future__ import unicode_literals
+
 import frappe, unittest
+from unittest import mock
 from frappe.utils import flt
 from erpnext.setup.utils import get_exchange_rate
 from frappe.utils import cint
 
 test_records = frappe.get_test_records('Currency Exchange')
 
-
 def save_new_records(test_records):
 	for record in test_records:
 		# If both selling and buying enabled
@@ -37,18 +37,45 @@
 			curr_exchange.for_selling = record["for_selling"]
 			curr_exchange.insert()
 
+test_exchange_values = {
+	'2015-12-15': '66.999',
+	'2016-01-15': '65.1'
+}
 
+# Removing API call from get_exchange_rate
+def patched_requests_get(*args, **kwargs):
+	class PatchResponse:
+		def __init__(self, json_data, status_code):
+			self.json_data = json_data
+			self.status_code = status_code
+
+		def raise_for_status(self):
+			if self.status_code != 200:
+				raise frappe.DoesNotExistError
+
+		def json(self):
+			return self.json_data
+
+	if args[0] == "https://api.exchangerate.host/convert" and kwargs.get('params'):
+		if kwargs['params'].get('date') and kwargs['params'].get('from') and kwargs['params'].get('to'):
+			if test_exchange_values.get(kwargs['params']['date']):
+				return PatchResponse({'result': test_exchange_values[kwargs['params']['date']]}, 200)
+
+	return PatchResponse({'result': None}, 404)
+
+@mock.patch('requests.get', side_effect=patched_requests_get)
 class TestCurrencyExchange(unittest.TestCase):
 	def clear_cache(self):
 		cache = frappe.cache()
-		key = "currency_exchange_rate:{0}:{1}".format("USD", "INR")
-		cache.delete(key)
+		for date in test_exchange_values.keys():
+			key = "currency_exchange_rate_{0}:{1}:{2}".format(date, "USD", "INR")
+			cache.delete(key)
 
 	def tearDown(self):
 		frappe.db.set_value("Accounts Settings", None, "allow_stale", 1)
 		self.clear_cache()
 
-	def test_exchange_rate(self):
+	def test_exchange_rate(self, mock_get):
 		save_new_records(test_records)
 
 		frappe.db.set_value("Accounts Settings", None, "allow_stale", 1)
@@ -69,7 +96,11 @@
 		self.assertFalse(exchange_rate == 60)
 		self.assertEqual(flt(exchange_rate, 3), 66.999)
 
-	def test_exchange_rate_strict(self):
+		exchange_rate = get_exchange_rate("USD", "INR", "2016-01-20", "for_buying")
+		self.assertFalse(exchange_rate == 60)
+		self.assertEqual(flt(exchange_rate, 3), 65.1)
+
+	def test_exchange_rate_strict(self, mock_get):
 		# strict currency settings
 		frappe.db.set_value("Accounts Settings", None, "allow_stale", 0)
 		frappe.db.set_value("Accounts Settings", None, "stale_days", 1)
@@ -79,7 +110,7 @@
 
 		self.clear_cache()
 		exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying")
-		self.assertEqual(flt(exchange_rate, 3), 67.235)
+		self.assertEqual(flt(exchange_rate, 3), 65.100)
 
 		exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_selling")
 		self.assertEqual(exchange_rate, 62.9)
@@ -89,7 +120,7 @@
 		exchange_rate = get_exchange_rate("USD", "INR", "2015-12-15", "for_buying")
 		self.assertEqual(flt(exchange_rate, 3), 66.999)
 
-	def test_exchange_rate_strict_switched(self):
+	def test_exchange_rate_strict_switched(self, mock_get):
 		# Start with allow_stale is True
 		exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying")
 		self.assertEqual(exchange_rate, 65.1)
@@ -97,7 +128,7 @@
 		frappe.db.set_value("Accounts Settings", None, "allow_stale", 0)
 		frappe.db.set_value("Accounts Settings", None, "stale_days", 1)
 
-		# Will fetch from fixer.io
 		self.clear_cache()
-		exchange_rate = get_exchange_rate("USD", "INR", "2016-01-15", "for_buying")
-		self.assertEqual(flt(exchange_rate, 3), 67.235)
+		exchange_rate = get_exchange_rate("USD", "INR", "2016-01-30", "for_buying")
+		self.assertFalse(exchange_rate == 65)
+		self.assertEqual(flt(exchange_rate, 3), 62.9)