Merge branch 'develop' into dib-fixes-2020-05-18

This commit is contained in:
Suraj Shetty 2020-06-11 15:59:41 +05:30 committed by GitHub
commit 6397af4e3c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 95 additions and 72 deletions

View file

@ -35,7 +35,8 @@ class EventProducer(Document):
self.create_custom_fields()
else:
# when producer doc is updated it updates the consumer doc, set flag to avoid deadlock
frappe.db.set_value(self.doctype, self.name, 'incoming_change', 0)
self.db_set('incoming_change', 0)
self.reload()
def check_url(self):
if not validate_url(self.producer_url):

View file

@ -9,42 +9,20 @@ import json
from frappe.frappeclient import FrappeClient
from frappe.event_streaming.doctype.event_producer.event_producer import pull_from_node
def create_event_producer(producer_url):
producer = frappe.db.exists('Event Producer', producer_url)
if producer:
event_producer = frappe.get_doc('Event Producer', producer)
else:
event_producer = frappe.new_doc('Event Producer')
event_producer.producer_doctypes = []
event_producer.producer_url = producer_url
event_producer.append('producer_doctypes', {
'ref_doctype': 'ToDo',
'use_same_name': 1
})
event_producer.append('producer_doctypes', {
'ref_doctype': 'Note',
'use_same_name': 1
})
event_producer.user = 'Administrator'
event_producer.save()
event_producer.reload()
producer_url = 'http://test_site_producer:8000'
class TestEventProducer(unittest.TestCase):
def setUp(self):
self.producer_url = 'http://test_site_producer:8000'
create_event_producer(self.producer_url)
frappe.db.sql('delete from tabToDo')
frappe.db.sql('delete from tabNote')
create_event_producer(producer_url)
def test_insert(self):
producer = self.get_remote_site()
producer = get_remote_site()
producer_doc = insert_into_producer(producer, 'test creation 1 sync')
self.pull_producer_data()
self.assertTrue(frappe.db.exists('ToDo', producer_doc.name))
def test_update(self):
producer = self.get_remote_site()
producer = get_remote_site()
producer_doc = insert_into_producer(producer, 'test update 1')
producer_doc['description'] = 'test update 2'
producer_doc = producer.update(producer_doc)
@ -53,7 +31,7 @@ class TestEventProducer(unittest.TestCase):
self.assertEqual(local_doc.description, producer_doc.description)
def test_delete(self):
producer = self.get_remote_site()
producer = get_remote_site()
producer_doc = insert_into_producer(producer, 'test delete sync')
self.pull_producer_data()
self.assertTrue(frappe.db.exists('ToDo', producer_doc.name))
@ -62,17 +40,17 @@ class TestEventProducer(unittest.TestCase):
self.assertFalse(frappe.db.exists('ToDo', producer_doc.name))
def test_multiple_doctypes_sync(self):
producer = self.get_remote_site()
producer = get_remote_site()
#insert todo and note in producer
producer_todo = insert_into_producer(producer, 'test multiple doc sync')
producer_note1 = frappe.get_doc(dict(doctype='Note', title='test multiple doc sync 1'))
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note1.title})
frappe.db.delete('Note', {'title': producer_note1.title})
producer_note1 = frappe._dict(doctype='Note', title='test multiple doc sync 1')
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note1['title']})
frappe.db.delete('Note', {'title': producer_note1['title']})
producer_note1 = producer.insert(producer_note1)
producer_note2 = frappe.get_doc(dict(doctype='Note', title='test multiple doc sync 2'))
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note2.title})
frappe.db.delete('Note', {'title': producer_note2.title})
producer_note2 = frappe._dict(doctype='Note', title='test multiple doc sync 2')
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note2['title']})
frappe.db.delete('Note', {'title': producer_note2['title']})
producer_note2 = producer.insert(producer_note2)
#update in producer
@ -98,22 +76,19 @@ class TestEventProducer(unittest.TestCase):
self.assertFalse(frappe.db.exists('Note', producer_note2.name))
def test_child_table_sync_with_dependencies(self):
producer = self.get_remote_site()
producer_user = frappe.get_doc(dict(doctype='User', email='test_user@sync.com', first_name='Test Sync User'))
producer = get_remote_site()
producer_user = frappe._dict(doctype='User', email='test_user@sync.com', send_welcome_email=0,
first_name='Test Sync User', enabled=1, roles=[{'role': 'System Manager'}])
delete_on_remote_if_exists(producer, 'User', {'email': producer_user.email})
frappe.db.delete('User', {'email':producer_user.email})
producer_user.enabled = 1
producer_user.append('roles', {
'role': 'System Manager'
})
producer_user = producer.insert(producer_user)
producer_note = frappe.get_doc(dict(doctype='Note', title='test child table dependency sync'))
producer_note.append('seen_by', {
'user': producer_user.name
})
producer_note = frappe._dict(doctype='Note', title='test child table dependency sync',
seen_by=[{'user': producer_user.name}])
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note.title})
frappe.db.delete('Note', {'title': producer_note.title})
producer_note = producer.insert(producer_note)
self.pull_producer_data()
self.assertTrue(frappe.db.exists('User', producer_user.name))
if self.assertTrue(frappe.db.exists('Note', producer_note.name)):
@ -121,24 +96,23 @@ class TestEventProducer(unittest.TestCase):
self.assertEqual(len(local_note.seen_by), 1)
def test_dynamic_link_dependencies_synced(self):
producer = get_remote_site()
#unsubscribe for Note to check whether dependency is fulfilled
event_producer = frappe.get_doc('Event Producer', self.producer_url)
event_producer = frappe.get_doc('Event Producer', producer_url)
event_producer.producer_doctypes = []
event_producer.append('producer_doctypes', {
'ref_doctype': 'ToDo',
'use_same_name': 1
})
event_producer.save()
event_producer.reload()
producer = self.get_remote_site()
producer_link_doc = frappe.get_doc(dict(doctype='Note', title='Test Dynamic Link 1'))
producer_link_doc = frappe._dict(doctype='Note', title='Test Dynamic Link 1')
delete_on_remote_if_exists(producer, 'Note', {'title': producer_link_doc.title})
frappe.db.delete('Note', {'title': producer_link_doc.title})
producer_link_doc = producer.insert(producer_link_doc)
producer_doc = frappe.get_doc(dict(doctype='ToDo', description='Test Dynamic Link 2', assigned_by='Administrator',
reference_type='Note', reference_name=producer_link_doc.name))
producer_doc = frappe._dict(doctype='ToDo', description='Test Dynamic Link 2', assigned_by='Administrator',
reference_type='Note', reference_name=producer_link_doc.name)
producer_doc = producer.insert(producer_doc)
self.pull_producer_data()
@ -147,39 +121,42 @@ class TestEventProducer(unittest.TestCase):
self.assertTrue(frappe.db.exists('Note', producer_link_doc.name))
self.assertEqual(producer_link_doc.name, frappe.db.get_value('ToDo', producer_doc.name, 'reference_name'))
reset_configuration(producer_url)
def test_naming_configuration(self):
#test with use_same_name = 0
event_producer = frappe.get_doc('Event Producer', self.producer_url)
producer = get_remote_site()
event_producer = frappe.get_doc('Event Producer', producer_url)
event_producer.producer_doctypes = []
event_producer.append('producer_doctypes', {
'ref_doctype': 'ToDo',
'use_same_name': 0
})
event_producer.save()
event_producer.reload()
producer = self.get_remote_site()
producer_doc = insert_into_producer(producer, 'test different name sync')
self.pull_producer_data()
self.assertTrue(frappe.db.exists('ToDo', {'remote_docname': producer_doc.name, 'remote_site_name': self.producer_url}))
self.assertTrue(frappe.db.exists('ToDo', {'remote_docname': producer_doc.name, 'remote_site_name': producer_url}))
reset_configuration(producer_url)
def test_update_log(self):
producer = self.get_remote_site()
producer = get_remote_site()
producer_doc = insert_into_producer(producer, 'test update log')
update_log_doc = producer.get_value('Event Update Log', 'docname', {'docname': producer_doc.get('name')})
self.assertEqual(update_log_doc.get('docname'), producer_doc.get('name'))
def test_event_sync_log(self):
producer = self.get_remote_site()
producer = get_remote_site()
producer_doc = insert_into_producer(producer, 'test event sync log')
self.pull_producer_data()
self.assertTrue(frappe.db.exists('Event Sync Log', {'docname': producer_doc.name}))
def pull_producer_data(self):
pull_from_node(self.producer_url)
pull_from_node(producer_url)
def get_remote_site(self):
producer_doc = frappe.get_doc('Event Producer', self.producer_url)
producer_doc = frappe.get_doc('Event Producer', producer_url)
producer_site = FrappeClient(
url=producer_doc.producer_url,
api_key=producer_doc.api_key,
@ -189,7 +166,8 @@ class TestEventProducer(unittest.TestCase):
return producer_site
def test_mapping(self):
event_producer = frappe.get_doc('Event Producer', self.producer_url)
producer = get_remote_site()
event_producer = frappe.get_doc('Event Producer', producer_url)
event_producer.producer_doctypes = []
mapping = [{
'local_fieldname': 'description',
@ -202,10 +180,8 @@ class TestEventProducer(unittest.TestCase):
'mapping': get_mapping('ToDo to Note', 'ToDo', 'Note', mapping)
})
event_producer.save()
event_producer.reload()
producer = self.get_remote_site()
producer_note = frappe.get_doc(dict(doctype='Note', title='Test Mapping', content='Test Mapping'))
producer_note = frappe._dict(doctype='Note', title='Test Mapping', content='Test Mapping')
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note.title})
producer_note = producer.insert(producer_note)
self.pull_producer_data()
@ -225,8 +201,11 @@ class TestEventProducer(unittest.TestCase):
#check delete
self.assertFalse(frappe.db.exists('ToDo', {'description': producer_note.content}))
reset_configuration(producer_url)
def test_inner_mapping(self):
event_producer = frappe.get_doc('Event Producer', self.producer_url)
producer = get_remote_site()
event_producer = frappe.get_doc('Event Producer', producer_url)
event_producer.producer_doctypes = []
inner_mapping = [
{
@ -255,10 +234,8 @@ class TestEventProducer(unittest.TestCase):
'mapping': get_mapping('ToDo to Note Mapping', 'ToDo', 'Note', mapping)
})
event_producer.save()
event_producer.reload()
producer = self.get_remote_site()
producer_note = frappe.get_doc(dict(doctype='Note', title='Inner Mapping Tester', content='Test Inner Mapping'))
producer_note = frappe._dict(doctype='Note', title='Inner Mapping Tester', content='Test Inner Mapping')
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note.title})
producer_note = producer.insert(producer_note)
self.pull_producer_data()
@ -268,11 +245,13 @@ class TestEventProducer(unittest.TestCase):
#check doc inserted
self.assertTrue(frappe.db.exists('ToDo', {'description': producer_note.content}))
reset_configuration(producer_url)
def insert_into_producer(producer, description):
#create and insert todo on remote site
todo = frappe.get_doc(dict(doctype='ToDo', description=description, assigned_by='Administrator'))
return producer.insert(todo)
#create and insert todo on remote site
todo = dict(doctype='ToDo', description=description, assigned_by='Administrator')
return producer.insert(todo)
def delete_on_remote_if_exists(producer, doctype, filters):
remote_doc = producer.get_value(doctype, 'name', filters)
@ -292,4 +271,47 @@ def get_mapping(mapping_name, local, remote, field_map):
for entry in field_map:
doc.append('field_mapping', entry)
doc.save()
return doc.name
return doc.name
def create_event_producer(producer_url):
if frappe.db.exists('Event Producer', producer_url):
return
event_producer = frappe.new_doc('Event Producer')
event_producer.producer_doctypes = []
event_producer.producer_url = producer_url
event_producer.append('producer_doctypes', {
'ref_doctype': 'ToDo',
'use_same_name': 1
})
event_producer.append('producer_doctypes', {
'ref_doctype': 'Note',
'use_same_name': 1
})
event_producer.user = 'Administrator'
event_producer.save()
def reset_configuration(producer_url):
event_producer = frappe.get_doc('Event Producer', producer_url)
event_producer.producer_doctypes = []
event_producer.producer_url = producer_url
event_producer.append('producer_doctypes', {
'ref_doctype': 'ToDo',
'use_same_name': 1
})
event_producer.append('producer_doctypes', {
'ref_doctype': 'Note',
'use_same_name': 1
})
event_producer.user = 'Administrator'
event_producer.save()
def get_remote_site():
producer_doc = frappe.get_doc('Event Producer', producer_url)
producer_site = FrappeClient(
url=producer_doc.producer_url,
api_key=producer_doc.api_key,
api_secret=producer_doc.get_password('api_secret'),
frappe_authorization_source='Event Consumer'
)
return producer_site

View file

@ -172,7 +172,7 @@ def get_list_context(context, doctype, web_form_name=None):
list_context.row_template = meta.get_row_template()
if not meta.custom and not list_context.list_template:
list_context.template = meta.get_list_template()
list_context.template = meta.get_list_template() or "www/list.html"
return list_context