80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
 | |
| # License: GNU General Public License v3. See license.txt
 | |
| 
 | |
| import copy
 | |
| from contextlib import contextmanager
 | |
| 
 | |
| import frappe
 | |
| 
 | |
| def create_test_contact_and_address():
 | |
| 	frappe.db.sql('delete from tabContact')
 | |
| 	frappe.db.sql('delete from `tabContact Email`')
 | |
| 	frappe.db.sql('delete from `tabContact Phone`')
 | |
| 	frappe.db.sql('delete from tabAddress')
 | |
| 	frappe.db.sql('delete from `tabDynamic Link`')
 | |
| 
 | |
| 	frappe.get_doc({
 | |
| 		"doctype": "Address",
 | |
| 		"address_title": "_Test Address for Customer",
 | |
| 		"address_type": "Office",
 | |
| 		"address_line1": "Station Road",
 | |
| 		"city": "_Test City",
 | |
| 		"state": "Test State",
 | |
| 		"country": "India",
 | |
| 		"links": [
 | |
| 			{
 | |
| 				"link_doctype": "Customer",
 | |
| 				"link_name": "_Test Customer"
 | |
| 			}
 | |
| 		]
 | |
| 	}).insert()
 | |
| 
 | |
| 	contact = frappe.get_doc({
 | |
| 		"doctype": 'Contact',
 | |
| 		"first_name": "_Test Contact for _Test Customer",
 | |
| 		"links": [
 | |
| 			{
 | |
| 				"link_doctype": "Customer",
 | |
| 				"link_name": "_Test Customer"
 | |
| 			}
 | |
| 		]
 | |
| 	})
 | |
| 	contact.add_email("test_contact_customer@example.com", is_primary=True)
 | |
| 	contact.add_phone("+91 0000000000", is_primary_phone=True)
 | |
| 	contact.insert()
 | |
| 
 | |
| 
 | |
| @contextmanager
 | |
| def change_settings(doctype, settings_dict):
 | |
| 	""" A context manager to ensure that settings are changed before running
 | |
| 	function and restored after running it regardless of exceptions occured.
 | |
| 	This is useful in tests where you want to make changes in a function but
 | |
| 	don't retain those changes.
 | |
| 	import and use as decorator to cover full function or using `with` statement.
 | |
| 
 | |
| 	example:
 | |
| 	@change_settings("Stock Settings", {"item_naming_by": "Naming Series"})
 | |
| 	def test_case(self):
 | |
| 		...
 | |
| 	"""
 | |
| 
 | |
| 	try:
 | |
| 		settings = frappe.get_doc(doctype)
 | |
| 		# remember setting
 | |
| 		previous_settings = copy.deepcopy(settings_dict)
 | |
| 		for key in previous_settings:
 | |
| 			previous_settings[key] = getattr(settings, key)
 | |
| 
 | |
| 		# change setting
 | |
| 		for key, value in settings_dict.items():
 | |
| 			setattr(settings, key, value)
 | |
| 		settings.save()
 | |
| 		yield # yield control to calling function
 | |
| 
 | |
| 	finally:
 | |
| 		# restore settings
 | |
| 		settings = frappe.get_doc(doctype)
 | |
| 		for key, value in previous_settings.items():
 | |
| 			setattr(settings, key, value)
 | |
| 		settings.save()
 |