From 3c8ba15bf63d0e93f6692ec691b75d824480b7b9 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 10 Jun 2020 21:23:55 +0530 Subject: [PATCH 1/6] test: Simplify Event Producer test --- .../event_producer/test_event_producer.py | 111 +++++++++--------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/frappe/event_streaming/doctype/event_producer/test_event_producer.py b/frappe/event_streaming/doctype/event_producer/test_event_producer.py index 90f450bfcc..edb0845608 100644 --- a/frappe/event_streaming/doctype/event_producer/test_event_producer.py +++ b/frappe/event_streaming/doctype/event_producer/test_event_producer.py @@ -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 = 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 = 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,7 +76,7 @@ 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 = get_remote_site() producer_user = frappe.get_doc(dict(doctype='User', email='test_user@sync.com', first_name='Test Sync User')) delete_on_remote_if_exists(producer, 'User', {'email': producer_user.email}) frappe.db.delete('User', {'email':producer_user.email}) @@ -122,16 +100,15 @@ class TestEventProducer(unittest.TestCase): def test_dynamic_link_dependencies_synced(self): #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 = get_remote_site() producer_link_doc = frappe.get_doc(dict(doctype='Note', title='Test Dynamic Link 1')) delete_on_remote_if_exists(producer, 'Note', {'title': producer_link_doc.title}) @@ -149,37 +126,36 @@ class TestEventProducer(unittest.TestCase): def test_naming_configuration(self): #test with use_same_name = 0 - 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': 0 }) event_producer.save() - event_producer.reload() - producer = self.get_remote_site() + producer = 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})) 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 +165,7 @@ class TestEventProducer(unittest.TestCase): return producer_site def test_mapping(self): - event_producer = frappe.get_doc('Event Producer', self.producer_url) + event_producer = frappe.get_doc('Event Producer', producer_url) event_producer.producer_doctypes = [] mapping = [{ 'local_fieldname': 'description', @@ -202,9 +178,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 = get_remote_site() producer_note = frappe.get_doc(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) @@ -226,7 +201,7 @@ class TestEventProducer(unittest.TestCase): self.assertFalse(frappe.db.exists('ToDo', {'description': producer_note.content})) def test_inner_mapping(self): - event_producer = frappe.get_doc('Event Producer', self.producer_url) + event_producer = frappe.get_doc('Event Producer', producer_url) event_producer.producer_doctypes = [] inner_mapping = [ { @@ -255,9 +230,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 = get_remote_site() producer_note = frappe.get_doc(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) @@ -271,7 +245,7 @@ class TestEventProducer(unittest.TestCase): 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')) + todo = dict(doctype='ToDo', description=description, assigned_by='Administrator') return producer.insert(todo) def delete_on_remote_if_exists(producer, doctype, filters): @@ -292,4 +266,33 @@ def get_mapping(mapping_name, local, remote, field_map): for entry in field_map: doc.append('field_mapping', entry) doc.save() - return doc.name \ No newline at end of file + 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 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 From 5f6a24b0af93d283562be1d8c3c33e3a11d5bdbc Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 11 Jun 2020 04:45:47 +0000 Subject: [PATCH 2/6] fix: set default template for list (#10648) --- frappe/www/list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/www/list.py b/frappe/www/list.py index 03171a74bd..fc4dc602c3 100644 --- a/frappe/www/list.py +++ b/frappe/www/list.py @@ -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 From 34704a23628926f52c478caf85e83f5223ab3f78 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 11 Jun 2020 14:07:29 +0530 Subject: [PATCH 3/6] fix: reset configurations in Event Producer tests --- .../event_producer/test_event_producer.py | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/frappe/event_streaming/doctype/event_producer/test_event_producer.py b/frappe/event_streaming/doctype/event_producer/test_event_producer.py index edb0845608..e9120b58c8 100644 --- a/frappe/event_streaming/doctype/event_producer/test_event_producer.py +++ b/frappe/event_streaming/doctype/event_producer/test_event_producer.py @@ -9,7 +9,7 @@ import json from frappe.frappeclient import FrappeClient from frappe.event_streaming.doctype.event_producer.event_producer import pull_from_node -producer_url = 'http://test_site_producer:8000' +producer_url = 'http://test2:8010' class TestEventProducer(unittest.TestCase): def setUp(self): @@ -44,11 +44,11 @@ class TestEventProducer(unittest.TestCase): #insert todo and note in producer producer_todo = insert_into_producer(producer, 'test multiple doc sync') - producer_note1 = dict(doctype='Note', title='test multiple doc sync 1') + 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 = dict(doctype='Note', title='test multiple doc sync 2') + 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) @@ -77,21 +77,18 @@ class TestEventProducer(unittest.TestCase): def test_child_table_sync_with_dependencies(self): producer = get_remote_site() - producer_user = frappe.get_doc(dict(doctype='User', email='test_user@sync.com', first_name='Test Sync User')) + producer_user = frappe._dict(doctype='User', email='test_user@sync.com', + 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)): @@ -109,13 +106,13 @@ class TestEventProducer(unittest.TestCase): event_producer.save() producer = 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() @@ -124,6 +121,8 @@ 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', producer_url) @@ -139,6 +138,8 @@ class TestEventProducer(unittest.TestCase): self.pull_producer_data() 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 = get_remote_site() producer_doc = insert_into_producer(producer, 'test update log') @@ -180,7 +181,7 @@ class TestEventProducer(unittest.TestCase): event_producer.save() producer = 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() @@ -200,6 +201,8 @@ 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', producer_url) event_producer.producer_doctypes = [] @@ -232,7 +235,7 @@ class TestEventProducer(unittest.TestCase): event_producer.save() producer = 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() @@ -242,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 = 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) @@ -286,6 +291,20 @@ def create_event_producer(producer_url): 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) From 60dbf657f7e2f0e8ab556e0ee59d45eb04d23835 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 11 Jun 2020 14:11:03 +0530 Subject: [PATCH 4/6] test: producer url --- .../doctype/event_producer/test_event_producer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/event_streaming/doctype/event_producer/test_event_producer.py b/frappe/event_streaming/doctype/event_producer/test_event_producer.py index e9120b58c8..871921cc05 100644 --- a/frappe/event_streaming/doctype/event_producer/test_event_producer.py +++ b/frappe/event_streaming/doctype/event_producer/test_event_producer.py @@ -9,7 +9,7 @@ import json from frappe.frappeclient import FrappeClient from frappe.event_streaming.doctype.event_producer.event_producer import pull_from_node -producer_url = 'http://test2:8010' +producer_url = 'http://test_site_producer:8000' class TestEventProducer(unittest.TestCase): def setUp(self): From 5c7a9d28b8c8279bb1671df3d24b7a26fae02d6f Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 11 Jun 2020 15:29:23 +0530 Subject: [PATCH 5/6] fix: set send_welcome_email as 0 for user creation --- .../doctype/event_producer/test_event_producer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frappe/event_streaming/doctype/event_producer/test_event_producer.py b/frappe/event_streaming/doctype/event_producer/test_event_producer.py index 871921cc05..0d414f5d63 100644 --- a/frappe/event_streaming/doctype/event_producer/test_event_producer.py +++ b/frappe/event_streaming/doctype/event_producer/test_event_producer.py @@ -77,7 +77,7 @@ class TestEventProducer(unittest.TestCase): def test_child_table_sync_with_dependencies(self): producer = get_remote_site() - producer_user = frappe._dict(doctype='User', email='test_user@sync.com', + 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}) @@ -96,6 +96,7 @@ 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', producer_url) event_producer.producer_doctypes = [] @@ -105,7 +106,6 @@ class TestEventProducer(unittest.TestCase): }) event_producer.save() - producer = get_remote_site() producer_link_doc = frappe._dict(doctype='Note', title='Test Dynamic Link 1') delete_on_remote_if_exists(producer, 'Note', {'title': producer_link_doc.title}) @@ -125,6 +125,7 @@ class TestEventProducer(unittest.TestCase): def test_naming_configuration(self): #test with use_same_name = 0 + producer = get_remote_site() event_producer = frappe.get_doc('Event Producer', producer_url) event_producer.producer_doctypes = [] event_producer.append('producer_doctypes', { @@ -133,7 +134,6 @@ class TestEventProducer(unittest.TestCase): }) event_producer.save() - producer = 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': producer_url})) @@ -166,6 +166,7 @@ class TestEventProducer(unittest.TestCase): return producer_site def test_mapping(self): + producer = get_remote_site() event_producer = frappe.get_doc('Event Producer', producer_url) event_producer.producer_doctypes = [] mapping = [{ @@ -180,7 +181,6 @@ class TestEventProducer(unittest.TestCase): }) event_producer.save() - producer = get_remote_site() 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) @@ -204,6 +204,7 @@ class TestEventProducer(unittest.TestCase): reset_configuration(producer_url) def test_inner_mapping(self): + producer = get_remote_site() event_producer = frappe.get_doc('Event Producer', producer_url) event_producer.producer_doctypes = [] inner_mapping = [ @@ -234,7 +235,6 @@ class TestEventProducer(unittest.TestCase): }) event_producer.save() - producer = get_remote_site() 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) From 4135791e517039534aecd6606a538d33dd41e055 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Thu, 11 Jun 2020 15:30:00 +0530 Subject: [PATCH 6/6] fix: reload doc after incoming change from consumer --- .../event_streaming/doctype/event_producer/event_producer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/event_streaming/doctype/event_producer/event_producer.py b/frappe/event_streaming/doctype/event_producer/event_producer.py index 62f78ca56a..d4aa0914d8 100644 --- a/frappe/event_streaming/doctype/event_producer/event_producer.py +++ b/frappe/event_streaming/doctype/event_producer/event_producer.py @@ -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):