public inbox for [email protected]  
help / color / mirror / Atom feed
pgAdmin IV API test cases patch
27+ messages / 3 participants
[nested] [flat]

* pgAdmin IV API test cases patch
@ 2016-06-05 17:56 Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-05 17:56 UTC (permalink / raw)
  To: pgadmin-hackers; +Cc: Kanchan Mohitey <[email protected]>

Hi,

PFA patch for API test cases for tree nodes/modules. This patch does not
include
api tests for following modules:

1. Type
2. Table child nodes
3. FTS modules

Kindly, review the same and let me know for any modification.

-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [text/x-patch] pgAdmin_api_tests.patch (274.2K, 3-pgAdmin_api_tests.patch)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py
new file mode 100644
index 0000000..bfb0263
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class CastTestGenerator(BaseTestGenerator):
+
+    def runTest(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py
new file mode 100644
index 0000000..3c793cd
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, os
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsAddTestCase(LoginTestCase):
+    """This class will add cast under database node. """
+
+    priority = 19
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data =\
+                {
+                    "castcontext": config_data['test_casts_credentials']
+                                              ['test_cast_context'],
+                    "encoding": config_data['test_casts_credentials']
+                                           ['test_encoding'],
+                    "name": config_data['test_casts_credentials']
+                                       ['test_name'],
+                    "srctyp": config_data['test_casts_credentials']
+                                         ['test_source_type'],
+                    "trgtyp": config_data['test_casts_credentials']
+                                         ['test_target_type']
+
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            cast_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["cid"].append(cast_id)
+
+            cast_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                               'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, cast_output)
+            cast_output.close()
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py
new file mode 100644
index 0000000..be76529
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py
@@ -0,0 +1,60 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsDeleteTestCase(LoginTestCase):
+    """
+    This class will delete cast node present on the object browser's
+    tree node by response code.
+    """
+    priority = 22
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        cast_id = all_id["cid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(cast_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No roles(s) to delete!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' + str(cast_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py
new file mode 100644
index 0000000..5603707
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py
@@ -0,0 +1,46 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsGetTestCase(LoginTestCase):
+    """ This class will fetch the cast node added under database. """
+
+    priority = 20
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will get cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        cast_id = all_id["cid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(cast_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py
new file mode 100644
index 0000000..ff6735c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py
@@ -0,0 +1,66 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsUpdateTestCase(LoginTestCase):
+    """
+    This class will update cast node present on the object browser's
+    tree node by response code.
+    """
+    priority = 21
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        cast_id = all_id["cid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(cast_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No roles(s) to update!!!")
+
+            data = {
+                "description": config_data["test_cast_update_data"]
+                                   ["test_comment"],
+                "id": cast_id
+               }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(cast_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py
new file mode 100644
index 0000000..4b8df06
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class EventTriggerGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py
new file mode 100644
index 0000000..a8ff5ee
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class EventTriggerAddTestCase(LoginTestCase):
+    """ This class will add new event trigger under schema node. """
+
+    priority = 39
+
+    scenarios = [
+        # Fetching default URL for event trigger node.
+        ('Fetch Event Trigger Node URL',
+         dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will add event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = \
+                {
+                    "enabled": config_data['test_event_trigger_credentials']
+                                          ['test_enable'],
+                    "eventfunname": config_data['test_event_trigger_credentials']
+                                               ['test_event_func'],
+                    "eventname": config_data['test_event_trigger_credentials']
+                                            ['test_event_name'],
+                    "eventowner": config_data['test_event_trigger_credentials']
+                                             ['test_event_owner'],
+                    "name": config_data['test_event_trigger_credentials']
+                                       ['test_name'],
+                    "providers": config_data['test_event_trigger_credentials']
+                                            ['test_provider']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/', data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            event_trigger_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["etid"].append(event_trigger_id)
+
+            event_trigger_output = open('/home/edb/Downloads/pgadmin4/web/'
+                                        'regression/parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, event_trigger_output)
+            event_trigger_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py
new file mode 100644
index 0000000..bbcb19c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class EventTriggerDeleteTestCase(LoginTestCase):
+    """ This class will delete added event trigger under schema node. """
+
+    priority = 42
+
+    scenarios = [
+        # Fetching default URL for event trigger  node.
+        ('Fetch Event Trigger Node URL', dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will delete event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        event_trigger_id = all_id["etid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(event_trigger_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No event trigger(s) to update!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(event_trigger_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py
new file mode 100644
index 0000000..92b417b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py
@@ -0,0 +1,47 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class EventTriggerGetTestCase(LoginTestCase):
+    """ This class will fetch added event trigger under schema node. """
+
+    priority = 40
+
+    scenarios = [
+        # Fetching default URL for event trigger  node.
+        ('Fetch Event Trigger Node URL',
+         dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will fetch event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        event_trigger_id = all_id["etid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(event_trigger_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py
new file mode 100644
index 0000000..b8ab8de
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py
@@ -0,0 +1,65 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class EventTriggerPutTestCase(LoginTestCase):
+    """ This class will update added event trigger under schema node. """
+
+    priority = 41
+
+    scenarios = [
+        # Fetching default URL for event trigger  node.
+        ('Fetch Event Trigger Node URL',
+         dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will update event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        event_trigger_id = all_id["etid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(event_trigger_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No event trigger(s) to update!!!")
+
+            data = \
+                {
+                    "comment": config_data['test_event_trigger_update_data']
+                                          ['test_comment'],
+                    "id": event_trigger_id
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(event_trigger_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py
new file mode 100644
index 0000000..025b57e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class ExtensionGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py
new file mode 100644
index 0000000..af02be8
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py
@@ -0,0 +1,77 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import os
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionsAddTestCase(LoginTestCase):
+    """ This class will add new extension under extension node. """
+    priority = 33
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Extension Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add extension under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data =\
+                {
+                    "name": config_data['test_extension_credentials']
+                                              ['test_name'],
+                    "relocatable": config_data['test_extension_credentials']
+                                           ['test_relocate'],
+                    "schema": config_data['test_extension_credentials']
+                                       ['test_schema'],
+                    "version": config_data['test_extension_credentials']
+                                         ['test_version']
+
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            extension_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["eid"].append(extension_id)
+
+            extension_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                          'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, extension_output)
+            extension_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py
new file mode 100644
index 0000000..33fc9bc
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionDeleteTestCase(LoginTestCase):
+    """ This class will delete extension node added under database node. """
+
+    priority = 96
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Cast Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete added extension under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        extension_id = all_id["eid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' +
+                                       str(db_id) + '/' + str(extension_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No extension(s) to delete!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(extension_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py
new file mode 100644
index 0000000..8778651
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py
@@ -0,0 +1,45 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionGetTestCase(LoginTestCase):
+    """ This class will fetch the extension node added under database. """
+
+    priority = 24
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Cast Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        extension_id = all_id["eid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(extension_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py
new file mode 100644
index 0000000..caa68de
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py
@@ -0,0 +1,66 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionDeleteTestCase(LoginTestCase):
+    """
+    This class will update extension node present on the object browser's
+    tree node by response code.
+    """
+    priority = 25
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Cast Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update extension node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        extension_id = all_id["eid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/'
+                                       + str(server_id) + '/' + str(db_id) + '/'
+                                       + str(extension_id),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No extension(s) to update!!!")
+
+            data = \
+                {
+                    "id": extension_id,
+                    "schema": config_data["test_extension_update_data"]
+                                   ["test_schema"]
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(extension_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/__init__.py
new file mode 100644
index 0000000..8fd1422
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class ForeignServersGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_add.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_add.py
new file mode 100644
index 0000000..a3e69f0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_add.py
@@ -0,0 +1,92 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import os
+import pickle
+
+
+class ForeignServerAddTestCase(LoginTestCase):
+    """
+    This class will add foreign server under database node.
+    """
+    priority = 71
+
+    scenarios = [
+        # Fetching default URL for foreign server node.
+        ('Check FDW Node', dict(url='/browser/foreign_server/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add foreign server under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) to update!")
+
+            data = \
+                {
+                    "fsrvacl": config_data['test_foreign_server_credentials']
+                                          ['test_fsr_acl'],
+                    "fsrvoptions": config_data['test_foreign_server_credentials']
+                                              ['test_fsr_optns'],
+                    "fsrvowner": config_data['test_foreign_server_credentials']
+                                            ['test_fsr_owner'],
+                    "name": config_data['test_foreign_server_credentials']
+                                       ['test_name']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(fdw_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            frs_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                       '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["fsid"].append(frs_id)
+
+            frs_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                          'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, frs_output)
+            frs_output.close()
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete.py
new file mode 100644
index 0000000..84b8e2d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_delete.py
@@ -0,0 +1,73 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class ForeignServerDeleteTestCase(LoginTestCase):
+    """ This class will delete foreign server under database node. """
+
+    priority = 94
+
+    scenarios = [
+        # Fetching default URL for foreign server node.
+        ('Check FDW Node', dict(url='/browser/foreign_server/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete foreign server under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        frs_id = all_id['fsid'][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) to available!")
+
+            frs_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(fdw_id) + '/' +
+                                           str(frs_id),
+                                           content_type='html/json')
+
+            frs_respdata = json.loads(frs_response.data.decode())
+
+            if len(frs_respdata) == 0:
+                raise Exception("No FRS(s) to update!")
+
+            delete_response = self.tester.delete(self.url + str(srv_grp) +
+                                                 '/' + str(server_id) + '/' +
+                                                 str(db_id) + '/' +
+                                                 str(fdw_id) + '/' +
+                                                 str(frs_id),
+                                                 follow_redirects=True)
+
+            del_respdata = json.loads(delete_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_get.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_get.py
new file mode 100644
index 0000000..5bdf35a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_get.py
@@ -0,0 +1,61 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class ForeignServerGetTestCase(LoginTestCase):
+    """
+    This class will add foreign server under FDW node.
+    """
+    priority = 72
+
+    scenarios = [
+        # Fetching default URL for foreign server node.
+        ('Check FDW Node', dict(url='/browser/foreign_server/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add foreign server under FDW node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        frs_id = all_id['fsid'][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) to available!")
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(fdw_id) + '/' + str(frs_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_put.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_put.py
new file mode 100644
index 0000000..2d170b3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/test_foreign_servers_put.py
@@ -0,0 +1,79 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class ForeignServerPutTestCase(LoginTestCase):
+    """
+    This class will update foreign server under database node.
+    """
+    priority = 73
+
+    scenarios = [
+        # Fetching default URL for foreign server node.
+        ('Check FDW Node', dict(url='/browser/foreign_server/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add foreign server under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        frs_id = all_id['fsid'][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) to available!")
+
+            # Get FRS
+            frs_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(fdw_id) + '/' +
+                                           str(frs_id),
+                                           content_type='html/json')
+
+            frs_respdata = json.loads(frs_response.data.decode())
+
+            if len(frs_respdata) == 0:
+                raise Exception("No FRS(s) to update!")
+
+            data = \
+                {
+                    "description": config_data['test_FRS_update_data']
+                                          ['test_comment'],
+                    "id": frs_id
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(fdw_id) + '/' +
+                                           str(frs_id), data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/__init__.py
new file mode 100644
index 0000000..0b87db2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class UserMappingGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_add.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_add.py
new file mode 100644
index 0000000..395ff06
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_add.py
@@ -0,0 +1,104 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import os
+import pickle
+
+
+class UserMappingAddTestCase(LoginTestCase):
+    """
+    This class will add user mapping under foreign server node.
+    """
+    priority = 74
+
+    scenarios = [
+        # Fetching default URL for user mapping node.
+        ('Check user mapping Node', dict(url='/browser/user_mapping/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add user mapping under foreign server node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        frs_id = all_id['fsid'][0]
+        srv_grp = config_data['test_server_group']
+
+        #print("in fs:::::", fdw_id)
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) available!")
+
+            # Get FRS
+            frs_response = self.tester.get('/browser/foreign_server/obj/'
+                                           '{0}/{1}/{2}/{3}/{4}'.format
+                                           (srv_grp, server_id, db_id, fdw_id,
+                                            frs_id), content_type='html/json')
+
+            frs_respdata = json.loads(frs_response.data.decode())
+
+            if len(frs_respdata) == 0:
+                raise Exception("No FRS(s) available!")
+
+            data = \
+                {
+                    "name": config_data['test_user_mapping_credentials']
+                                       ['test_name'],
+                    "um_options": config_data['test_user_mapping_credentials']
+                                             ['test_option'],
+                    "umoptions": config_data['test_user_mapping_credentials']
+                                            ['test_options']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(fdw_id) + '/' +
+                                        str(frs_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            um_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["umid"].append(um_id)
+
+            um_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                             'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, um_output)
+            um_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_delete.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_delete.py
new file mode 100644
index 0000000..0bd644a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_delete.py
@@ -0,0 +1,84 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class UserMappingDeleteTestCase(LoginTestCase):
+    """
+    This class will delete user mapping under foreign server node.
+    """
+    priority = 77
+
+    scenarios = [
+        # Fetching default URL for user mapping node.
+        ('Check user mapping Node', dict(url='/browser/user_mapping/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function delete user mapping under foreign server node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        frs_id = all_id['fsid'][0]
+        um_id = all_id['umid'][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) available!")
+
+            # Get FRS
+            frs_response = self.tester.get('/browser/foreign_server/obj/'
+                                           '{0}/{1}/{2}/{3}/{4}'.format
+                                           (srv_grp, server_id, db_id, fdw_id,
+                                            frs_id), content_type='html/json')
+
+            frs_respdata = json.loads(frs_response.data.decode())
+
+            if len(frs_respdata) == 0:
+                raise Exception("No FRS(s) available!")
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(fdw_id) + '/' + str(frs_id) +
+                                       '/' + str(um_id),
+                                       content_type='html/json')
+
+            um_respdata = json.loads(fdw_response.data.decode())
+
+            if len(um_respdata) == 0:
+                raise Exception("No user mapping(s) to delete!")
+
+            put_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' + str(fdw_id) +
+                                              '/' + str(frs_id) + '/' +
+                                              str(um_id), follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_get.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_get.py
new file mode 100644
index 0000000..541f371
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_get.py
@@ -0,0 +1,72 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class UserMappingGetTestCase(LoginTestCase):
+    """
+    This class will add user mapping under foreign server node.
+    """
+    priority = 75
+
+    scenarios = [
+        # Fetching default URL for user mapping node.
+        ('Check user mapping Node', dict(url='/browser/user_mapping/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch user mapping under foreign server node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        frs_id = all_id['fsid'][0]
+        um_id = all_id['umid'][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) available!")
+
+            # Get FRS
+            frs_response = self.tester.get('/browser/foreign_server/obj/'
+                                           '{0}/{1}/{2}/{3}/{4}'.format
+                                           (srv_grp, server_id, db_id, fdw_id,
+                                            frs_id), content_type='html/json')
+
+            frs_respdata = json.loads(frs_response.data.decode())
+
+            if len(frs_respdata) == 0:
+                raise Exception("No FRS(s) available!")
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(fdw_id) + '/' + str(frs_id) +
+                                       '/' + str(um_id),
+                                       content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_put.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_put.py
new file mode 100644
index 0000000..f5e5dbb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/test_user_mapping_put.py
@@ -0,0 +1,92 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class UserMappingPutTestCase(LoginTestCase):
+    """
+    This class will update user mapping under foreign server node.
+    """
+    priority = 76
+
+    scenarios = [
+        # Fetching default URL for user mapping node.
+        ('Check user mapping Node', dict(url='/browser/user_mapping/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function update user mapping under foreign server node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        frs_id = all_id['fsid'][0]
+        um_id = all_id['umid'][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get FDW
+            fdw_response = self.tester.get('/browser/foreign_data_wrapper/obj/'
+                                           '{0}/{1}/{2}/{3}'.format
+                                           (srv_grp, server_id, db_id, fdw_id),
+                                           content_type='html/json')
+
+            fdw_respdata = json.loads(fdw_response.data.decode())
+
+            if len(fdw_respdata) == 0:
+                raise Exception("No FDW(s) available!")
+
+            # Get FRS
+            frs_response = self.tester.get('/browser/foreign_server/obj/'
+                                           '{0}/{1}/{2}/{3}/{4}'.format
+                                           (srv_grp, server_id, db_id, fdw_id,
+                                            frs_id), content_type='html/json')
+
+            frs_respdata = json.loads(frs_response.data.decode())
+
+            if len(frs_respdata) == 0:
+                raise Exception("No FRS(s) available!")
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(fdw_id) + '/' + str(frs_id) +
+                                       '/' + str(um_id),
+                                       content_type='html/json')
+
+            um_respdata = json.loads(fdw_response.data.decode())
+
+            if len(um_respdata) == 0:
+                raise Exception("No user mapping(s) to update!")
+
+            data = \
+                {
+                    "id": um_id,
+                    "umoptions": config_data['test_user_mapping_update_data']
+                                            ['test_options']
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(fdw_id) + '/' +
+                                           str(frs_id) + '/' + str(um_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/__init__.py
new file mode 100644
index 0000000..6f9f064
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class FDWGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_add.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_add.py
new file mode 100644
index 0000000..cf68fcd
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_add.py
@@ -0,0 +1,81 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, os, pickle
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class FDWDAddTestCase(LoginTestCase):
+    """
+    This class will add foreign data wrappers under database node.
+    """
+    priority = 44
+
+    scenarios = [
+        # Fetching default URL for foreign data wrapper node.
+        ('Check FDW Node', dict(url='/browser/foreign_data_wrapper/obj/'))
+
+    ]
+
+    def runTest(self):
+        """ This function will add foreign data wrapper under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = \
+                {
+                    "fdwacl": config_data['test_FDW_credentials']
+                                         ['test_acl'],
+                    "fdwhan": config_data['test_FDW_credentials']
+                                         ['test_handler'],
+                    "fdwoptions": config_data['test_FDW_credentials']
+                                             ['test_options'],
+                    "fdwowner": config_data['test_FDW_credentials']
+                                           ['test_owner'],
+                    "fdwvalue": config_data['test_FDW_credentials']
+                                           ['test_validator'],
+                    "name": config_data['test_FDW_credentials']
+                                       ['test_name']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            fdw_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                       '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["fid"].append(fdw_id)
+
+            fdw_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                          'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, fdw_output)
+            fdw_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_delete.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_delete.py
new file mode 100644
index 0000000..f30004d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_delete.py
@@ -0,0 +1,60 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class FDWDeleteTestCase(LoginTestCase):
+    """ This class will delete foreign data wrappers under database node. """
+
+    priority = 95
+
+    scenarios = [
+        # Fetching default URL for foreign data wrapper node.
+        ('Check FDW Node', dict(url='/browser/foreign_data_wrapper/obj/'))
+    ]
+
+    def runTest(self):
+        """
+        This function will delete foreign data wrapper under database node.
+        """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(fdw_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No FDW(s) to delete!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' + str(fdw_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_get.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_get.py
new file mode 100644
index 0000000..588c0fb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_get.py
@@ -0,0 +1,48 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class FDWDGetTestCase(LoginTestCase):
+    """ This class will fetch foreign data wrappers under database node. """
+
+    priority = 45
+
+    scenarios = [
+        # Fetching default URL for foreign data wrapper node.
+        ('Check FDW Node', dict(url='/browser/foreign_data_wrapper/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch foreign data wrapper added
+            under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(fdw_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_put.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_put.py
new file mode 100644
index 0000000..f8914f5
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/test_FDW_put.py
@@ -0,0 +1,68 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class FDWDPutTestCase(LoginTestCase):
+    """
+    This class will update foreign data wrappers under database node.
+    """
+    priority = 46
+
+    scenarios = [
+        # Fetching default URL for foreign data wrapper node.
+        ('Check FDW Node', dict(url='/browser/foreign_data_wrapper/obj/'))
+
+    ]
+
+    def runTest(self):
+        """ This function will update foreign data wrapper under
+            database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        fdw_id = all_id["fid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(fdw_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No FDW(s) to update!!!")
+
+            data = \
+                {
+                    "description": config_data['test_FDW_update_data']
+                                          ['test_comment'],
+                    "id": fdw_id
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' +
+                                           str(db_id) + '/' + str(fdw_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py
new file mode 100644
index 0000000..f5a240e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class LanguageTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py
new file mode 100644
index 0000000..2fc54a8
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py
@@ -0,0 +1,46 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class LanguageGetTestCase(LoginTestCase):
+    """
+    This class will fetch language node available under database node.
+    """
+    priority = 31
+
+    scenarios = [
+        # Fetching default URL for language node.
+        ('Check Cast Node', dict(url='/browser/language/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch language under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        lang_id = all_id["lid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' +
+                                       str(db_id) + '/' + str(lang_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py
new file mode 100644
index 0000000..df0a2e2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py
@@ -0,0 +1,63 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class LanguageUpdateTestCase(LoginTestCase):
+    """ This class will update available language node under database node. """
+
+    priority = 32
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Language Node URL', dict(url='/browser/language/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update language node's comments field. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        lang_id = all_id["lid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(lang_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No language(s) to update!!!")
+
+            data = {
+                "description": config_data["test_language_update_data"]
+                                   ["test_comment"],
+                "id": lang_id
+               }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(lang_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py
new file mode 100644
index 0000000..ba78cb1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class CollationTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py
new file mode 100644
index 0000000..49ca0ef
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py
@@ -0,0 +1,82 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class CollationAddTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 48
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Default Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get('/browser/schema/obj/' + str(srv_grp) + '/'
+                                       + str(server_id) + '/' + str(db_id) + '/'
+                                       + str(schema_id),
+                                        content_type='html/json')
+
+            data = \
+                {
+                    "copy_collation": config_data['test_collation_credentials']
+                                                 ['test_copy_collation'],
+                    "name": config_data['test_collation_credentials']
+                                       ['test_name'],
+                    "owner": config_data['test_collation_credentials']
+                                        ['test_owner'],
+                    "schema": config_data['test_collation_credentials']
+                                         ['test_schema']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            collation_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["coid"].append(collation_id)
+
+            collation_output = open('/home/edb/Downloads/pgadmin4/web/'
+                                    'regression/parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, collation_output)
+            collation_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py
new file mode 100644
index 0000000..96d95fe
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py
@@ -0,0 +1,62 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class CollationDeleteTestCase(LoginTestCase):
+    """ This class will delete added collation under schema node. """
+
+    priority = 51
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Fetch collation Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        collation_id = all_id["coid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+              # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                  raise Exception("No schema(s) to delete!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(schema_id) + '/' +
+                                              str(collation_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py
new file mode 100644
index 0000000..c411d70
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class CollationGetTestCase(LoginTestCase):
+    """ This class will fetch new collation under schema node. """
+
+    priority = 49
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Fecth collation Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        collation_id = all_id["coid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(collation_id),
+                                               content_type='html/json')
+
+                self.assertEquals(get_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py
new file mode 100644
index 0000000..b17cdd7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py
@@ -0,0 +1,68 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class CollationPutTestCase(LoginTestCase):
+    """ This class will update added collation under schema node. """
+
+    priority = 50
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Fetch collation Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        collation_id = all_id["coid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) available!!!")
+
+            data = \
+              {
+                  "description": config_data['test_collation_update_data']
+                                            ['test_comment'],
+                  "id": collation_id,
+              }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' +
+                                           str(db_id) + '/' +
+                                           str(schema_id) + '/' +
+                                           str(collation_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py
new file mode 100644
index 0000000..7dca204
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DomainTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py
new file mode 100644
index 0000000..6b09c42
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py
@@ -0,0 +1,99 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class DomainAddTestCase(LoginTestCase):
+    """ This class will add new domain under schema node. """
+
+    priority = 52
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fecth domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "basensp": config_data['test_domain_data']
+                                          ['test_schema'],
+                    "basetype": config_data['test_domain_data']
+                                           ['test_basetype'],
+                    "collname": config_data['test_domain_data']
+                                           ['test_collation'],
+                    "constraints": config_data['test_domain_data']
+                                              ['test_constraints'],
+                    "is_tlength": config_data['test_domain_data']
+                                             ['test_lenght'],
+                    "max_val": config_data['test_domain_data']
+                                          ['test_max_value'],
+                    "min_val": config_data['test_domain_data']
+                                          ['test_min_value'],
+                    "name": config_data['test_domain_data']
+                                       ['test_name'],
+                    "owner": config_data['test_domain_data']
+                                        ['test_owner'],
+                    "seclabels": config_data['test_domain_data']
+                                            ['test_security'],
+                    "typdefault": config_data['test_domain_data']
+                                             ['test_defalt_type'],
+                    "typlen": config_data['test_domain_data']
+                                         ['test_type_len'],
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            domain_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web/'
+                                      'regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["doid"].append(domain_id)
+
+            domain_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                                 'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, domain_output)
+            domain_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py
new file mode 100644
index 0000000..f19a270
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py
@@ -0,0 +1,62 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class DomainDeleteTestCase(LoginTestCase):
+    """ This class will delete new domain under schema node. """
+
+    priority = 55
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fecth domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        domain_id= all_id["doid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                  raise Exception("No schema(s) to delete!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(schema_id) + '/' +
+                                              str(domain_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py
new file mode 100644
index 0000000..82b55d0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class DomainGetTestCase(LoginTestCase):
+    """ This class will fetch new collation under schema node. """
+
+    priority = 53
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fecth domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        domain_id= all_id["doid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(domain_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py
new file mode 100644
index 0000000..0d7deea
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py
@@ -0,0 +1,66 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class DomainPutTestCase(LoginTestCase):
+    """ This class will fetch new collation under schema node. """
+
+    priority = 54
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fecth domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        domain_id= all_id["doid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+                data = \
+                      {
+                          "description": config_data['test_domain_update_data']
+                                                    ['test_comment'],
+                          "id": domain_id,
+                      }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' +
+                                           str(db_id) + '/' +
+                                           str(schema_id) + '/' +
+                                           str(domain_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/__init__.py
new file mode 100644
index 0000000..22a4063
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class ForeignTableTestGenerator(BaseTestGenerator):
+
+    def generate_tests(self):
+        return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_add.py
new file mode 100644
index 0000000..fff47ab
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_add.py
@@ -0,0 +1,102 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ForeignTableAddTestCase(LoginTestCase):
+    """ This class will add new foreign table under schema node. """
+
+    priority = 78
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema
+            response = self.tester.get('/browser/schema/obj/{0}/{1}/{2}/'
+                                       '{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) available!!!")
+
+            data = \
+                {
+                    "acl": config_data['test_foreign_table_credentials']
+                                      ['test_acl'],
+                    "basensp": config_data['test_foreign_table_credentials']
+                                          ['test_schema_name'],
+                    "columns": config_data['test_foreign_table_credentials']
+                                          ['test_column'],
+                    "constraints": config_data['test_foreign_table_credentials']
+                                              ['test_constraints'],
+                    "ftoptions": config_data['test_foreign_table_credentials']
+                                            ['test_options'],
+                    "ftsrvname": config_data['test_foreign_table_credentials']
+                                            ['test_frs_name'],
+                    "name": config_data['test_foreign_table_credentials']
+                                       ['test_name'],
+                    "owner": config_data['test_foreign_table_credentials']
+                                        ['test_owner'],
+                    "relacl": config_data['test_foreign_table_credentials']
+                                         ['test_rel_acl'],
+                    "seclabels": config_data['test_foreign_table_credentials']
+                                            ['test_sec_lable'],
+                    "stracl": config_data['test_foreign_table_credentials']
+                                         ['test_str_acl']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            ft_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["foid"].append(ft_id)
+
+            ft_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                             'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, ft_output)
+            ft_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.py
new file mode 100644
index 0000000..c9f28e9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.py
@@ -0,0 +1,76 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ForeignTableDeleteTestCase(LoginTestCase):
+    """ This class will delete the added foreign table under schema node. """
+
+    priority = 81
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        ft_id = all_id["foid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) available!!!")
+
+            get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(schema_id) + '/' +
+                                           str(ft_id),
+                                           content_type='html/json')
+
+            respdata = json.loads(get_response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No foreign table(s) available!!!")
+
+            delete_response = self.tester.delete(self.url + str(srv_grp) +
+                                                 '/' + str(server_id) + '/' +
+                                                 str(db_id) + '/' +
+                                                 str(schema_id) + '/' +
+                                                 str(ft_id),
+                                                 follow_redirects=True)
+
+            self.assertEquals(delete_response.status_code, 200)
+
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py
new file mode 100644
index 0000000..2fe269e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py
@@ -0,0 +1,61 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ForeignTableGetTestCase(LoginTestCase):
+    """ This class will add new foreign table under schema node. """
+
+    priority = 79
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        ft_id = all_id["foid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) available!!!")
+
+            get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(schema_id) + '/' +
+                                           str(ft_id), content_type='html/json')
+
+            self.assertEquals(get_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py
new file mode 100644
index 0000000..77df464
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py
@@ -0,0 +1,81 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class ForeignTablePutTestCase(LoginTestCase):
+    """ This class will update added foreign table under schema node. """
+
+    priority = 80
+
+    scenarios = [
+        # Fetching default URL for foreign table node.
+        ('Fecth table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update foreign  under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        ft_id = all_id["foid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) available!!!")
+
+            get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(schema_id) + '/' +
+                                           str(ft_id), content_type='html/json')
+
+            respdata = json.loads(get_response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No foreign table(s) available!!!")
+
+            data = \
+                {
+                    "description": config_data['test_FT_update_data']
+                                    ['test_comment'],
+                    "id": ft_id,
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' +
+                                           str(db_id) + '/' +
+                                           str(schema_id) + '/' +
+                                           str(ft_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py
new file mode 100644
index 0000000..03bf3f6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class TriggerFunctionTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py
new file mode 100644
index 0000000..713bd23
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py
@@ -0,0 +1,112 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class TriggerFuncAddTestCase(LoginTestCase):
+    """ This class will add new trigger function under schema node. """
+
+    priority = 36
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fecth Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add trigger function under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get('/browser/schema/obj/' + str(srv_grp) +
+                                       '/' + str(server_id) + '/' +
+                                       str(db_id) + '/' + str(schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "acl": config_data
+                    ['test_trigger_function_credentials']['test_acl'],
+                    "arguments": config_data
+                    ['test_trigger_function_credentials']['test_args'],
+                    "funcowner": config_data
+                    ['test_trigger_function_credentials']['test_fun_owner'],
+                    "lanname": config_data
+                    ['test_trigger_function_credentials']['test_language'],
+                    "name": config_data
+                    ['test_trigger_function_credentials']['test_name'],
+                    "options": config_data
+                    ['test_trigger_function_credentials']['test_options'],
+                    "probin": config_data
+                    ['test_trigger_function_credentials']['test_probe'],
+                    "proleakproof": config_data
+                    ['test_trigger_function_credentials']['test_leak_proof'],
+                    "pronamespace": config_data
+                    ['test_trigger_function_credentials']['test_namespace'],
+                    "prorettypename": config_data
+                    ['test_trigger_function_credentials']['test_type'],
+                    "prosecdef": config_data
+                    ['test_trigger_function_credentials']['test_sec_def'],
+                    "prosrc": config_data
+                    ['test_trigger_function_credentials']['test_code'],
+                    "provolatile": config_data
+                    ['test_trigger_function_credentials']['test_volitile'],
+                    "seclabels": config_data
+                    ['test_trigger_function_credentials']['test_sec_label'],
+                    "variables": config_data
+                    ['test_trigger_function_credentials']['test_Variable']
+                }
+
+            if schema_id:
+                data['pronamespace'] = schema_id
+            else:
+                schema_id = data['pronamespace']
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            trg_func__id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/'
+                              'regression/parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["tfnid"].append(trg_func__id)
+
+            extension_output = open('/home/edb/Downloads/pgadmin4/web/'
+                                    'regression/parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, extension_output)
+            extension_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py
new file mode 100644
index 0000000..46d0859
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py
@@ -0,0 +1,63 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TriggerFuncDeleteTestCase(LoginTestCase):
+    """ This class will add new trigger function under schema node. """
+
+    priority = 43
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fetch Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete trigger function under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        trg_func__id = all_id["tfnid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                 raise Exception("No schema(s) to delete!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(schema_id) + '/' +
+                                              str(trg_func__id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py
new file mode 100644
index 0000000..ab05fe0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py
@@ -0,0 +1,61 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TriggerFuncGetTestCase(LoginTestCase):
+    """ This class will fetch added trigger function under schema node. """
+
+    priority = 37
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fetch Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch trigger function under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        trg_func__id = all_id["tfnid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(trg_func__id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py
new file mode 100644
index 0000000..a6431d7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py
@@ -0,0 +1,69 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TriggerFuncPutTestCase(LoginTestCase):
+    """ This class will update new trigger function under schema node. """
+
+    priority = 38
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fecth Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update trigger function under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        trg_func__id = all_id["tfnid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                data = \
+                    {
+                        "description": config_data
+                        ['test_trigger_func_update_data']['test_comment'],
+                        "id": trg_func__id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(trg_func__id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py
new file mode 100644
index 0000000..ff11e3e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class SequenceTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py
new file mode 100644
index 0000000..5cb7413
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py
@@ -0,0 +1,97 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class SequenceAddTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 56
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fetch sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "cache": config_data['test_sequence_credentials']
+                                        ['test_cache'],
+                    "cycled": config_data['test_sequence_credentials']
+                                         ['test_cycled'],
+                    "increment": config_data['test_sequence_credentials']
+                                            ['test_increment'],
+                    "maximum": config_data['test_sequence_credentials']
+                                          ['test_max_value'],
+                    "minimum": config_data['test_sequence_credentials']
+                                          ['test_min_value'],
+                    "name": config_data['test_sequence_credentials']
+                                       ['test_name'],
+                    "relacl": config_data['test_sequence_credentials']
+                                         ['test_acl'],
+                    "schema": config_data['test_sequence_credentials']
+                                         ['test_schema_name'],
+                    "securities": config_data['test_sequence_credentials']
+                                             ['test_security'],
+                    "seqowner": config_data['test_sequence_credentials']
+                                           ['test_owner'],
+                    "start": config_data['test_sequence_credentials']
+                                        ['test_start_val']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            sequence_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["seid"].append(sequence_id)
+
+            sequence_output = open('/home/edb/Downloads/pgadmin4/web/'
+                                   'regression/parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, sequence_output)
+            sequence_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py
new file mode 100644
index 0000000..f708a2b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py
@@ -0,0 +1,73 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SequenceDeleteTestCase(LoginTestCase):
+    """ This class will delete added sequence node under schema node. """
+
+    priority = 59
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fecth sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete added sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        sequence_id = all_id["seid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No sequence node to delete!")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(sequence_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py
new file mode 100644
index 0000000..15c064e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SequenceGetTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 57
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fetch sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        sequence_id = all_id["seid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py
new file mode 100644
index 0000000..e786130
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SequenceUpdateTestCase(LoginTestCase):
+    """ This class will update new sequence node under schema node. """
+
+    priority = 58
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fetch sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update added sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        sequence_id = all_id["seid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No sequence node to update!")
+
+                data =\
+                    {
+                        "comment": config_data['test_sequnce_update_data']
+                                              ['test_comment'],
+                        "id": sequence_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py
new file mode 100644
index 0000000..2450edb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class TableTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py
new file mode 100644
index 0000000..2f1c375
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py
@@ -0,0 +1,116 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class TableAddTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 60
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+            data = \
+                {
+                    "check_constraint": config_data
+                    ['test_table_credentials']['test_constraint'],
+                    "coll_inherits": config_data
+                    ['test_table_credentials']['test_col_inherit'],
+                    "columns": config_data
+                    ['test_table_credentials']['test_columns'],
+                    "exclude_constraint": config_data
+                    ['test_table_credentials']['test_has_constraint'],
+                    "fillfactor": config_data
+                    ['test_table_credentials']['test_fillfactor'],
+                    "foreign_key": config_data
+                    ['test_table_credentials']['test_has_FK'],
+                    "hastoasttable": config_data
+                    ['test_table_credentials']['test_has_toast_tbl'],
+                    "like_constraints": config_data
+                    ['test_table_credentials']['test_like_constraint'],
+                    "like_default_value": config_data
+                    ['test_table_credentials']['test_like_default_value'],
+                    "like_relation": config_data
+                    ['test_table_credentials']['test_like_relation'],
+                    "name": config_data
+                    ['test_table_credentials']['test_name'],
+                    "primary_key": config_data
+                    ['test_table_credentials']['test_PK'],
+                    "relacl": config_data
+                    ['test_table_credentials']['test_acl'],
+                    "relhasoids": config_data
+                    ['test_table_credentials']['test_has_oid'],
+                    "relowner": config_data
+                    ['test_table_credentials']['test_owner'],
+                    "schema": config_data
+                    ['test_table_credentials']['test_schema'],
+                    "seclabels": config_data
+                    ['test_table_credentials']['test_sec_acl'],
+                    "spcname": config_data
+                    ['test_table_credentials']['test_tbscp'],
+                    "unique_constraint": config_data
+                    ['test_table_credentials']['test_unique_constraint'],
+                    "vacuum_table": config_data
+                    ['test_table_credentials']['test_vacuum_tbl'],
+                    "vacuum_toast": config_data
+                    ['test_table_credentials']['test_vacuum_toast']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            table_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["tid"].append(table_id)
+
+            table_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                                'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, table_output)
+            table_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py
new file mode 100644
index 0000000..4b8f345
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py
@@ -0,0 +1,73 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TableDeleteTestCase(LoginTestCase):
+    """ This class will delete new table under schema node. """
+
+    priority = 97
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete added table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        table_id = all_id["tid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No Table to delete!")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(table_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py
new file mode 100644
index 0000000..a98a3d3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TableGetTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 61
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        table_id = all_id["tid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py
new file mode 100644
index 0000000..867bb52
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py
@@ -0,0 +1,79 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TableUpdateTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 62
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        table_id = all_id["tid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception ("No Table to update!")
+
+                data =\
+                    {
+                        "description": config_data['test_table_update_data']
+                                              ['test_comment'],
+                        "id": table_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py
new file mode 100644
index 0000000..3403f4f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class SchemaTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py
new file mode 100644
index 0000000..703983b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py
@@ -0,0 +1,90 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import os
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class SchemaAddTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 23
+
+    scenarios = [
+        # Fetching default URL for schema node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data =\
+            {
+                "deffuncacl": config_data['test_schema_credentials']
+                                              ['test_func_acl'],
+                "defseqacl": config_data['test_schema_credentials']
+                                              ['test_seq_acl'],
+                "deftblacl": config_data['test_schema_credentials']
+                                              ['test_tbl_acl'],
+                "deftypeacl": config_data['test_schema_credentials']
+                                              ['test_type_acl'],
+                "name": config_data['test_schema_credentials']
+                                              ['test_name'],
+                "namespaceowner": config_data['test_schema_credentials']
+                                              ['test_owner'],
+                "nspacl": config_data['test_schema_credentials']
+                                              ['test_privilege'],
+                "seclabels": config_data['test_schema_credentials']
+                                              ['test_sec_label']
+            }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/', data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            schema_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["scid"].append(schema_id)
+
+            schema_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                                 'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, schema_output)
+            schema_output.close()
+
+
+
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py
new file mode 100644
index 0000000..7f6cd73
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SchemaDeleteTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 98
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) to delete!!!")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(schema_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py
new file mode 100644
index 0000000..f712f50
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py
@@ -0,0 +1,44 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class SchemaGetTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 34
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(schema_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py
new file mode 100644
index 0000000..603c058
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py
@@ -0,0 +1,60 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SchemaPutTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 35
+
+    scenarios = [
+        # Fetching default URL for schema node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data =\
+                {
+                    "deffuncacl": config_data["test_schema_update_data"]
+                                             ["test_func_acl"],
+                    "defseqacl": config_data["test_schema_update_data"]
+                                            ["test_seq_acl"],
+                    "deftblacl": config_data["test_schema_update_data"]
+                                            ["test_tbl_acl"],
+                    "id": schema_id
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(schema_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+            respdata = json.loads(put_response.data.decode())
+            self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py
new file mode 100644
index 0000000..138c249
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class ViewTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_add.py
new file mode 100644
index 0000000..bee41c9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_add.py
@@ -0,0 +1,102 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class MViewAddTestCase(LoginTestCase):
+    """ This class will add new view under schema node. """
+
+    priority = 67
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fecth materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "datacl": config_data
+                    ['test_mview_credentials']['test_acl'],
+                    "definition": config_data
+                    ['test_mview_credentials']['test_definition'],
+                    "fillfactor": config_data
+                    ['test_mview_credentials']['test_fillfactor'],
+                    "name": config_data
+                    ['test_mview_credentials']['test_name'],
+                    "owner": config_data
+                    ['test_mview_credentials']['test_owner'],
+                    "schema": config_data
+                    ['test_mview_credentials']['test_schema_name'],
+                    "seclabels": config_data
+                    ['test_mview_credentials']['test_sec_label'],
+                    "spcname": config_data
+                    ['test_mview_credentials']['test_tbscp'],
+                    "toast_autovacuum": config_data
+                    ['test_mview_credentials']['test_toast_autovacuum'],
+                    "toast_autovacuum_enabled": config_data
+                    ['test_mview_credentials']['test_toast_autovacuum_enabled'],
+                    "vacuum_table": config_data
+                    ['test_mview_credentials']['test_vacuum_tbl'],
+                    "vacuum_toast": config_data
+                    ['test_mview_credentials']['test_vacuum_toast'],
+                    "with_data": config_data
+                    ['test_mview_credentials']['test_with_data']
+
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            mview_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                       '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["mvid"].append(mview_id)
+
+            mview_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                                'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, mview_output)
+            mview_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_delete.py
new file mode 100644
index 0000000..96371c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_delete.py
@@ -0,0 +1,75 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class MViewDeleteTestCase(LoginTestCase):
+    """ This class will delete new materialized view under schema node. """
+
+    priority = 70
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fetch materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        mview_id = all_id["mvid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No view node to delete!")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(mview_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_get.py
new file mode 100644
index 0000000..a9ee00c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_get.py
@@ -0,0 +1,60 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class MViewGetTestCase(LoginTestCase):
+    """ This class will fetch new materialized view under schema node. """
+
+    priority = 68
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fetch materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        mview_id = all_id["mvid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj'
+                                       '/{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_put.py
new file mode 100644
index 0000000..6a42037
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_put.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class MViewPutTestCase(LoginTestCase):
+    """ This class will fetch new materialized view under schema node. """
+
+    priority = 69
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fetch materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        mview_id = all_id["mvid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception ("No view to update!")
+
+                data =\
+                    {
+                        "comment": config_data['test_view_update_data']
+                                              ['test_comment'],
+                        "id": mview_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_add.py
new file mode 100644
index 0000000..0b8da89
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_add.py
@@ -0,0 +1,89 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ViewAddTestCase(LoginTestCase):
+    """ This class will add new view under schema node. """
+
+    priority = 63
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fecth view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "check_option": config_data
+                    ['test_view_credentials']['test_check_options'],
+                    "datacl": config_data
+                    ['test_view_credentials']['test_acl'],
+                    "definition": config_data
+                    ['test_view_credentials']['test_definition'],
+                    "name": config_data
+                    ['test_view_credentials']['test_name'],
+                    "owner": config_data
+                    ['test_view_credentials']['test_owner'],
+                    "schema": config_data
+                    ['test_view_credentials']['test_schema_name'],
+                    "seclabels": config_data
+                    ['test_view_credentials']['test_sec_label']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            view_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web/'
+                                      'regression/parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["vid"].append(view_id)
+
+            view_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                               'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, view_output)
+            view_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_delete.py
new file mode 100644
index 0000000..4cf8023
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_delete.py
@@ -0,0 +1,77 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ViewDeleteTestCase(LoginTestCase):
+    """ This class will update new view under schema node. """
+
+    priority = 66
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fecth view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        view_id = all_id["vid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No view node to delete!")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(view_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_get.py
new file mode 100644
index 0000000..ee597ab
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_get.py
@@ -0,0 +1,61 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ViewGetTestCase(LoginTestCase):
+    """ This class will fetch new view under schema node. """
+
+    priority = 64
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fetch view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        view_id = all_id["vid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_put.py
new file mode 100644
index 0000000..a838fce
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_put.py
@@ -0,0 +1,81 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ViewPutTestCase(LoginTestCase):
+    """ This class will update new view under schema node. """
+
+    priority = 65
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fecth view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        view_id = all_id["vid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception ("No view to update!")
+
+                data =\
+                    {
+                        "comment": config_data['test_view_update_data']
+                                              ['test_comment'],
+                        "id": view_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..acada61
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,6 @@
+from pgadmin.utils.route import BaseTestGenerator
+
+class DBGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..6e4c9ed
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,101 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, uuid, os
+from regression.test_utils import get_ids
+
+class DatabaseAddTestCase(LoginTestCase):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+    priority = 8
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        self.assertEquals(response.status_code, 200)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                     "datacl": config_data['test_add_database_data']
+                                          ['test_privileges_acl'],
+                     "datconnlimit": config_data['test_add_database_data']
+                                                ['test_conn_limit'],
+                     "datowner": config_data['test_add_database_data']
+                                            ['test_owner'],
+                     "deffuncacl": config_data['test_add_database_data']
+                                              ['test_fun_acl'],
+                     "defseqacl": config_data['test_add_database_data']
+                                             ['test_seq_acl'],
+                     "deftblacl": config_data['test_add_database_data']
+                                             ['test_tbl_acl'],
+                     "deftypeacl": config_data['test_add_database_data']
+                                              ['test_type_acl'],
+                     "encoding": config_data['test_add_database_data']
+                                            ['test_encoding'],
+                     "name": str(uuid.uuid4())[1:8],
+                     "privileges": config_data['test_add_database_data']
+                                              ['test_privileges'],
+                     "securities": config_data['test_add_database_data']
+                                              ['test_securities'],
+                     "variables": config_data['test_add_database_data']
+                                             ['test_variables']
+                    }
+
+            db_response = self.tester.post(self.url + str(srv_grp) + "/"
+                                            + server_id + "/",
+                                            data=json.dumps(data),
+                                            content_type='html/json')
+
+            self.assertTrue(db_response.status_code, 200)
+
+            respdata = json.loads(db_response.data.decode())
+
+            db_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')
+
+                tol_server_id = pickle.load(exst_server_id)
+                pickle_id_dict = tol_server_id
+
+                pickle_id_dict["did"].append(db_id)
+
+                db_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                                 'parent_id.pkl', 'wb')
+                pickle.dump(pickle_id_dict, db_output)
+                db_output.close()
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
new file mode 100644
index 0000000..26c5574
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -0,0 +1,47 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabaseDeleteTestCase(LoginTestCase):
+    """ This class will delete the database under last added server. """
+
+    priority = 99
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if len(db_con) == 0:
+            raise Exception("No database(s) to delete!!!")
+
+        response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                      str(server_id) + '/' + str(db_id),
+                                      follow_redirects=True)
+
+        respdata = json.loads(response.data.decode())
+
+        self.assertTrue(respdata['success'], 1)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..34a6778
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,43 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(LoginTestCase):
+    """
+    This class will fetch database added under last added server.
+    """
+    priority = 9
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con["info"] == "Database Connected.":
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+
+            self.assertEquals(response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..bb15e75
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,49 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class DatabasesUpdateTestCase(LoginTestCase):
+    """
+    This class will update the database under last added server.
+    """
+    priority = 10
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+
+        test_getnodes(node=self)
+
+        srv_grp = config_data['test_server_group']
+
+        data = {"comments": config_data["test_db_update_data"]
+                                       ["test_comment"],
+                "id": db_id
+               }
+
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       data=json.dumps(data),
+                                       follow_redirects=True)
+
+        self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py
new file mode 100644
index 0000000..4a11bf8
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class RoleGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py
new file mode 100644
index 0000000..6a2bb08
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py
@@ -0,0 +1,92 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, uuid, os
+from regression.test_utils import get_ids
+
+
+class LoginRoleAddTestCase(LoginTestCase):
+    """ This class will add login role node under added server. """
+
+    priority = 12
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add new role under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                    "rolcanlogin": config_data['test_lr_credentials']
+                                              ['test_can_login'],
+                    "rolconnlimit": config_data['test_lr_credentials']
+                                               ['test_conn_limit'],
+                    "rolcreaterole": config_data['test_lr_credentials']
+                                                ['test_create_role'],
+                    "rolinherit": config_data['test_lr_credentials']
+                                             ['test_role_inherit'],
+                    "rolmembership": config_data['test_lr_credentials']
+                                                ['test_role_membership'],
+                    "rolname": str(uuid.uuid4())[1:8],
+                    "rolpassword": config_data['test_lr_credentials']
+                                              ['test_lr_password'],
+                    "rolvaliduntil": config_data['test_lr_credentials']
+                                                ['test_lr_validity'],
+                    "seclabels": config_data['test_lr_credentials']
+                                            ['test_sec_lable'],
+                    "variables": config_data['test_lr_credentials']
+                                            ['test_variable']
+                   }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/'
+                                       + server_id + '/', data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            lr_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                       '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["lrid"].append(lr_id)
+
+            lr_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                             'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, lr_output)
+            lr_output.close()
+
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py
new file mode 100644
index 0000000..445fd7c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py
@@ -0,0 +1,47 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from .test_role_func import test_getrole
+from regression.test_utils import get_ids
+
+
+class LoginRoleDeleteTestCase(LoginTestCase):
+    """ This class will delete added login role present under server node. """
+
+    priority = 14
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the role. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        respdata = test_getrole(node=self)
+
+        role_id = respdata['oid']
+
+        if len(respdata) == 0:
+            raise Exception("No roles(s) to delete!!!")
+
+        del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                          str(server_id) + '/' + str(role_id),
+                                          follow_redirects=True)
+
+        del_respdata = json.loads(del_response.data.decode())
+
+        self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_func.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_func.py
new file mode 100644
index 0000000..3e06b08
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_func.py
@@ -0,0 +1,48 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getrole(node=None):
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    role_id = all_id["lrid"][0]
+
+    srv_grp = config_data['test_server_group']
+
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(
+                                password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']),
+                                follow_redirects=True)
+
+    srv_connect = json.loads(response.data.decode())
+
+    if srv_connect['data']['connected']:
+
+        response = node.tester.get('/browser/role/obj/{0}/{1}/{2}'.format
+                                   (srv_grp, server_id, role_id),
+                                   content_type='html/json')
+
+        respdata = json.loads(response.data.decode())
+
+        return respdata
+
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py
new file mode 100644
index 0000000..636ce1c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py
@@ -0,0 +1,56 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.utils import get_ids
+
+
+class LoginRoleGetTestCase(LoginTestCase):
+    """
+    This class will fetch login roles node present under the object browser's
+    tree node by response code.
+    """
+
+    priority = 13
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added login role under tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        role_id = all_id["lrid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(role_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py
new file mode 100644
index 0000000..34879f4
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py
@@ -0,0 +1,51 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from .test_role_func import test_getrole
+from regression.test_utils import get_ids
+
+
+class LoginRolePutTestCase(LoginTestCase):
+    """This class update the comment field of login roles node."""
+
+    priority = 13
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the role's comment field."""
+
+        all_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = all_id["sid"][0]
+
+        respdata = test_getrole(node=self)
+
+        role_id = respdata['oid']
+
+        data = {
+                "description": config_data["test_lr_update_data"]
+                                          ["test_comment"],
+                "oid": role_id
+               }
+
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(role_id),
+                                       data=json.dumps(data),
+                                       follow_redirects=True)
+
+        self.assertEquals(put_response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py
new file mode 100644
index 0000000..28fcc16
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class TblspaceGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py
new file mode 100644
index 0000000..c4d6bd6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py
@@ -0,0 +1,83 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, uuid, os
+from regression.test_utils import get_ids
+
+class TbspcAddTestCase(LoginTestCase):
+
+    """
+    This class will check server node present on the object browser's tree node by response code.
+    """
+    priority = 15
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add new tablespace under 1st server of tree node."""
+
+        srv_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = srv_id["sid"][0]
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+            data = \
+                {
+                    "name": str(uuid.uuid4())[1:8],
+                    "seclabels": config_data["test_tablespc_credentials"]
+                                            ["test_spc_seclable"],
+                    "spcacl": config_data["test_tablespc_credentials"]
+                                         ["test_spc_acl"],
+                    "spclocation": config_data["test_tablespc_credentials"]
+                                              ["test_spc_location"],
+                    "spcoptions": config_data["test_tablespc_credentials"]
+                                             ["test_spc_opts"],
+                    "spcuser": config_data["test_tablespc_credentials"]
+                                          ["test_spc_user"]
+                }
+#
+            response = self.tester.post(self.url + str(srv_grp) + '/'
+                                                   + server_id + '/',
+                                       data=json.dumps(data),
+                                        content_type='html/json')
+            self.assertTrue(response.status_code, 200)
+            respdata = json.loads(response.data.decode())
+            tbspc_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_ids = open('/home/edb/Downloads/pgadmin4/web'
+                                '/regression/''parent_id.pkl', 'rb')
+                all_id = pickle.load(exst_ids)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["tsid"].append(tbspc_id)
+
+            spc_output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, spc_output)
+            spc_output.close()
+
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py
new file mode 100644
index 0000000..8674ba4
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py
@@ -0,0 +1,51 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from .test_tbspc_func import test_gettblspc
+
+class TbspcDeleteTestCase(LoginTestCase):
+    """
+    This class will delete tablespace node present under the object browser's
+    tree node by response code.
+    """
+
+    priority = 18
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the added tablespace"""
+
+        all_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = all_id["sid"][0]
+
+        respdata = test_gettblspc(node=self)
+
+        tbspc_id = respdata['oid']
+
+        if len(respdata) == 0:
+            raise Exception("No tablespace(s) to delete!!!")
+
+        del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                          str(server_id) + '/' + str(tbspc_id),
+                                          follow_redirects=True)
+
+        del_respdata = json.loads(del_response.data.decode())
+
+        self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_func.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_func.py
new file mode 100644
index 0000000..2abcf8d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_func.py
@@ -0,0 +1,45 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.test_utils import get_ids
+from regression.config import config_data
+import json
+
+
+def test_gettblspc(node=None):
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    tbspc_id = all_id["tsid"][0]
+
+    srv_grp = config_data['test_server_group']
+
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    srv_connect = json.loads(response.data.decode())
+
+    if srv_connect['data']['connected']:
+
+        response = node.tester.get('/browser/tablespace/obj/{0}/{1}/{2}'.format
+                                   (srv_grp, server_id, tbspc_id),
+                                   content_type='html/json')
+
+        node.assertEquals(response.status_code, 200)
+
+        respdata = json.loads(response.data.decode())
+
+        return respdata
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py
new file mode 100644
index 0000000..0d85f46
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py
@@ -0,0 +1,57 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+
+
+class TbspcGetTestCase(LoginTestCase):
+    """
+    This class will fetch added tablespace under the object browser's
+    tree node by response code.
+    """
+    priority = 16
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will get the added tablespace."""
+
+        all_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = all_id["sid"][0]
+        tbspc_id = all_id["tsid"][0]
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(tbspc_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+            self.assertTrue(respdata['oid'], tbspc_id)
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py
new file mode 100644
index 0000000..59a38f3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py
@@ -0,0 +1,56 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from .test_tbspc_func import test_gettblspc
+from regression.test_utils import get_ids
+
+
+class TbspcUpdateTestCase(LoginTestCase):
+    """
+    This class will update comment field of  added tablespace under the
+    object browser's tree node.
+    """
+
+    priority = 17
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the added tablespace."""
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        respdata = test_gettblspc(node=self)
+
+        tbspc_id = respdata['oid']
+
+        data = \
+            {
+                "description": config_data["test_lr_update_data"]
+                               ["test_comment"],
+                "id": tbspc_id
+            }
+
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(tbspc_id),
+                                       data=json.dumps(data),
+                                       follow_redirects=True)
+
+        self.assertEquals(put_response.status_code, 200)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..b722aeb 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -8,16 +8,14 @@
 # ##########################################################################
 
 import json
-
+import pickle
+import os
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
 class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
+    """ This class will add the servers under default server group. """
 
     priority = 4
 
@@ -27,10 +25,31 @@ class ServersAddTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
-        """
+        """ This function will add the server under default server group."""
+
+        # Storing parent id's into pickle dict
+        pickle_id_dict = {
+            "sid": [],  #server
+            "did": [],  #database
+            "lrid": [], #login role
+            "tsid": [], #tablspace
+            "cid": [],  #cast
+            "eid": [],  #extention
+            "lid": [12397], #language
+            "scid": [],     #schema
+            "tfnid": [],    #trigger function
+            "etid": [],     #event trigger
+            "coid": [],     #collation
+            "fid": [],  #FDW
+            "doid": [], #Domain
+            "seid": [],  #Sequence
+            "tid": [],   #table
+            "vid": [],  #view
+            "mvid": [],  #mview
+            "fsid": [],  #foreign server
+            "umid": [],  #User mapping
+            "foid": []  #foreign table
+        }
 
         srv_grp = config_data['test_server_group']
 
@@ -48,6 +67,20 @@ class ServersAddTestCase(LoginTestCase):
 
             response = self.tester.post(url, data=json.dumps(data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+            respdata = json.loads(response.data.decode())
+
+            server_id = respdata['node']['_id']
+
+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web/'
+                                      'regression/parent_id.pkl', 'rb')
+                pickle_id_dict = pickle.load(exst_server_id)
+
+            pickle_id_dict["sid"].append(server_id)
+            output = open('/home/edb/Downloads/pgadmin4/web/regression/'
+                          'parent_id.pkl', 'wb')
+            pickle.dump(pickle_id_dict, output)
+            output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..a7dd101 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -8,16 +8,13 @@
 # ##################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerDeleteTestCase(LoginTestCase):
+    """ This class will delete the last server present under tree node."""
+
     priority = 7
 
     scenarios = [
@@ -26,32 +23,22 @@ class ServersDeleteTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
-        """
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        url = self.url + str(srv_grp) + "/"
 
-            url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        respdata = json.loads(response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        if len(respdata) == 0:
+            raise Exception("No server(s) to delete!!!")
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        # delete last server
+        server = respdata[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..163fef3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,15 +7,14 @@
 #
 # ##########################################################################
 
-import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
 class ServersGetTestCase(LoginTestCase):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
@@ -27,23 +26,16 @@ class ServersGetTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers present under
-        object browser.
-        """
+        """ This function will fetch the added servers to object browser. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
+        for srv in server_id:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(srv),
                                        content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..0daac73 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -8,16 +8,13 @@
 # ##########################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerUpdateTestCase(LoginTestCase):
+    """ This class will update server's comment field. """
 
     priority = 6
 
@@ -27,39 +24,40 @@ class ServersUpdateTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
-        """
+        """ This function will update the server's comment field. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
+        response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                   str(server_id),
+                                   follow_redirects=True)
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        con_response = self.tester.post('browser/server/connect/{0}/{1}'.format
+                                        (srv_grp, server_id),
+                                        data=dict(password=config_data
+                                        ['test_server_credentials'][0]
+                                        ['test_db_password']),
+                                        follow_redirects=True)
 
-            url = self.url + str(srv_grp) + "/"
+        srv_con = json.loads(con_response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        if len(srv_con) == 0:
+            raise Exception("No Server(s) connected to update!!!")
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        data = \
+            {
+                "comment": config_data
+                ['test_server_update_data']['test_comment'],
+                "id": server_id
+            }
 
-            for server in respdata:
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id), data=json.dumps(data),
+                                       content_type='html/json')
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        self.assertEquals(put_response.status_code, 200)
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        respdata = json.loads(put_response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
new file mode 100644
index 0000000..c552d8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -0,0 +1,36 @@
+###########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
+
+import json
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.config import config_data
+
+
+class SgGetTestCase(LoginTestCase):
+    """
+     This class will check available server groups in pgAdmin.
+    """
+
+    priority = 3
+
+    scenarios = [
+        # Fetching the default url for server group node
+        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
+    ]
+
+    def runTest(self):
+        """This function will check available server groups."""
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.get(self.url + str(srv_grp),
+                                   content_type='html/json')
+        self.assertEquals(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['id'], srv_grp)
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..d272a63 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,7 +8,6 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
@@ -67,7 +66,9 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
     def runTest(self):
@@ -76,4 +77,4 @@ class LoginTestCase(BaseTestGenerator):
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index 1ff41de..3d41e0f 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -9,6 +9,8 @@
 
 from abc import ABCMeta, abstractmethod
 import unittest
+from importlib import import_module
+from werkzeug.utils import find_modules
 
 
 class TestsGeneratorRegistry(ABCMeta):
@@ -48,18 +50,18 @@ class TestsGeneratorRegistry(ABCMeta):
 
         cls.registry = dict()
 
-        from importlib import import_module
-        from werkzeug.utils import find_modules
-
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
-
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 import six
 
 
 @six.add_metaclass(TestsGeneratorRegistry)
 class BaseTestGenerator(unittest.TestCase):
+
     # Defining abstract method which will override by individual testcase.
     @abstractmethod
     def runTest(self):
diff --git a/web/regression/parent_id.pkl b/web/regression/parent_id.pkl
new file mode 100644
index 0000000..7227444
Binary files /dev/null and b/web/regression/parent_id.pkl differ
diff --git a/web/regression/test_config.json b/web/regression/test_config.json
new file mode 100644
index 0000000..2f0d09f
--- /dev/null
+++ b/web/regression/test_config.json
@@ -0,0 +1,910 @@
+{
+  "pgAdmin4_login_credentials":
+  {
+    "test_new_password" : "newpass",
+    "test_login_password" : "test123",
+    "test_login_username" : "[email protected]"
+  },
+
+
+  "test_server_group" : 1,
+
+  "test_server_credentials":
+  [{
+    "test_name" : "PG9.5",
+    "test_db_username" : "postgres",
+    "test_host" : "localhost",
+    "test_db_password" : "edb",
+    "test_db_port" : 5433,
+    "test_maintenance_db" : "postgres",
+    "test_sslmode" :"prefer"
+  },
+  {
+    "test_name" : "PPAS9.4",
+    "test_db_username" : "enterprisedb",
+    "test_host" : "localhost",
+    "test_db_password" : "edb",
+    "test_db_port" : 5444,
+    "test_maintenance_db" : "edb",
+    "test_sslmode" :"prefer"
+  }],
+
+  "test_server_update_data":
+  {
+      "test_comment": "This is test update comment"
+  },
+
+  "test_add_database_data": {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  },
+
+    "test_db_update_data":
+  {
+      "test_comment": "This is db update comment"
+  },
+
+    "test_lr_credentials":
+    {
+      "test_can_login": "true",
+      "test_conn_limit": -1,
+      "test_create_role": "true",
+      "test_role_inherit": "true",
+      "test_role_membership": [],
+      "test_lr_name":  "testlrg1",
+      "test_lr_password": "edb",
+      "test_lr_validity": "12/27/2016",
+      "test_sec_lable": [],
+      "test_variable":[
+        {"name":"work_mem",
+          "database":"postgres",
+          "value":65
+        }
+      ]
+    },
+
+  "test_lr_update_data":
+  {
+    "test_comment": "This is login role update comment"
+  },
+
+  "test_tablespc_credentials":
+  {
+    "test_tblspace_name": "test_tablespace",
+    "test_spc_seclable": [],
+    "test_spc_acl": [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":[
+          {
+            "privilege_type":"C",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_spc_location": "/opt/PostgreSQL/9.5/data",
+    "test_spc_opts": [],
+    "test_spc_user": "postgres"
+  },
+
+    "test_tbspc_update_data":
+  {
+    "test_comment": "This is tablespace update comment"
+  },
+
+  "test_casts_credentials":
+  {
+    "test_cast_context": "IMPLICIT",
+    "test_encoding": "UTF8",
+    "test_name": "money->bigint",
+    "test_source_type": "money",
+    "test_target_type": "bigint"
+  },
+
+     "test_cast_update_data":
+  {
+    "test_comment": "This is cast update comment"
+  },
+
+    "test_extension_credentials":
+  {
+    "test_name": "postgres_fdw",
+    "test_relocate": true,
+    "test_schema": "public",
+    "test_version": "1.0"
+  },
+
+    "test_extension_update_data":
+  {
+    "test_schema": "test1"
+  },
+
+      "test_language_update_data":
+  {
+    "test_comment": "This is language update comment"
+  },
+
+  "test_schema_credentials":
+  {
+    "test_func_acl": [],
+    "test_seq_acl": [],
+    "test_tbl_acl": [],
+    "test_type_acl": [],
+    "test_name": "test_schema",
+    "test_owner": "postgres",
+    "test_privilege":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"C",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_sec_label": []
+  },
+
+  "test_schema_update_data":
+  {
+  "test_tbl_acl":
+  {
+    "added":
+    [
+      {
+        "grantee": "public",
+        "grantor": "postgres",
+        "privileges":
+        [
+          {
+            "privilege_type": "D",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "x",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ]
+  },
+    "test_func_acl":
+    {
+      "added":
+      [
+        {
+          "grantee":"postgres",
+          "grantor":"postgres",
+          "privileges":
+          [
+            {
+              "privilege_type":"X",
+              "privilege":true,
+              "with_grant":true
+            }
+          ]
+        }
+      ]
+    },
+    "test_seq_acl":
+    {
+      "added":
+      [
+        {
+          "grantee":"postgres",
+          "grantor":"postgres",
+          "privileges":
+          [
+            {
+              "privilege_type":"r",
+              "privilege":true,
+              "with_grant":false
+            },
+            {
+              "privilege_type":"w",
+              "privilege":true,
+              "with_grant":false
+            },
+            {
+              "privilege_type":"U",
+              "privilege":true,
+              "with_grant":false
+            }
+          ]
+        }
+      ]
+    }
+  },
+
+  "test_trigger_function_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"X",
+            "privilege":true,
+            "with_grant":true
+          }
+        ]
+      }
+    ],
+    "test_args": [],
+    "test_fun_owner": "postgres",
+    "test_language": "plpgsql",
+    "test_name": "test_abort_any_command",
+    "test_options": [],
+    "test_probe": "$libdir/",
+    "test_leak_proof": true,
+    "test_namespace": 2200,
+    "test_type": "event_trigger",
+    "test_sec_def": true,
+    "test_code": "BEGIN   RAISE EXCEPTION 'command % is disabled', tg_tag; END;",
+    "test_volitile": "s",
+    "test_sec_label": [],
+    "test_Variable":
+    [
+      {
+        "name":"enable_sort",
+        "value":true
+      }
+    ]
+  },
+
+  "test_trigger_func_update_data":
+  {
+    "test_comment": "This is trigger function update comment"
+  },
+
+  "test_event_trigger_credentials":
+  {
+    "test_enable": "O",
+    "test_event_func": "test_schema.test_abort_any_command",
+    "test_event_name":  "DDL_COMMAND_END",
+    "test_event_owner":  "postgres",
+    "test_name": "test_event_trg",
+    "test_provider": []
+  },
+
+   "test_event_trigger_update_data":
+  {
+    "test_comment": "This is event trigger update comment"
+  },
+
+  "test_FDW_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":true
+          }
+        ]
+      }
+    ],
+
+    "test_handler": "postgres_fdw_handler",
+    "test_options": [],
+    "test_owner": "postgres",
+    "test_validator": "postgresql_fdw_validator",
+    "test_name": "test_fdw"
+  },
+
+    "test_FDW_update_data":
+  {
+    "test_comment": "This is FDW update comment"
+  },
+
+  "test_collation_credentials":
+  {
+    "test_copy_collation": "pg_catalog.\"POSIX\"",
+    "test_name": "test_collation",
+    "test_owner": "postgres",
+    "test_schema": "test_schema"
+  },
+
+   "test_collation_update_data":
+  {
+    "test_comment": "This is collation update comment"
+  },
+
+
+  "test_domain_data":
+  {
+    "test_schema": "test_schema",
+    "test_basetype": "character",
+    "test_collation": "pg_catalog.\"en_AG\"",
+    "test_constraints":
+    [
+      {
+        "conname":"num",
+        "convalidated":true
+      }
+    ],
+    "test_lenght": true,
+    "test_max_value":  2147483647,
+    "test_min_value": 1,
+    "test_name": "test_domain",
+    "test_owner": "postgres",
+    "test_security": [],
+    "test_defalt_type": "1",
+    "test_type_len": "10"
+  },
+
+  "test_domain_update_data":
+  {
+    "test_comment": "This is domain update comment"
+  },
+
+  "test_sequence_credentials":
+  {
+    "test_cache": "1",
+    "test_cycled": true,
+    "test_increment":  "1",
+    "test_max_value": "100000",
+    "test_min_value": "1",
+    "test_name": "test_empno",
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"w",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_schema_name": "test_schema",
+    "test_security":  [],
+    "test_owner":  "postgres",
+    "test_start_val": "100"
+  },
+
+    "test_sequnce_update_data":
+  {
+    "test_comment": "This is sequence update comment"
+  },
+
+  "test_table_credentials":
+  {
+    "test_constraint": [],
+    "test_col_inherit": "[]",
+    "test_columns":
+    [
+      {
+        "name":"empno",
+        "cltype":"numeric",
+        "attacl":[],
+        "is_primary_key":false,
+        "attoptions":[],
+        "seclabels":[]
+      },
+      {
+        "name":"empname",
+        "cltype":"character[]",
+        "attacl":[],
+        "is_primary_key":false,
+        "attoptions":[],
+        "seclabels":[]
+      },
+      {"name":"DOJ",
+        "cltype":"date[]",
+        "attacl":[],
+        "is_primary_key":false,
+        "attoptions":[],
+        "seclabels":[]
+      }
+    ],
+    "test_has_constraint": [],
+    "test_fillfactor": "11",
+    "test_has_FK": [],
+    "test_has_toast_tbl": true,
+    "test_like_constraint":  true,
+    "test_like_default_value": true,
+    "test_like_relation": "pg_catalog.pg_tables",
+    "test_name": "test_emp",
+    "test_PK": [],
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":true
+          },
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"w",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_has_oid": true,
+    "test_owner":  "postgres",
+    "test_schema": "test_schema",
+    "test_sec_acl":  [],
+    "test_tbscp": "pg_default",
+    "test_unique_constraint": [],
+    "test_vacuum_tbl":
+    [
+      {
+        "name":"autovacuum_analyze_scale_factor"
+      },
+      {
+        "name":"autovacuum_analyze_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ],
+
+    "test_vacuum_toast":
+    [
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ]
+
+  },
+
+    "test_table_update_data":
+  {
+    "test_comment": "This is table update comment"
+  },
+
+  "test_view_credentials":
+  {
+    "test_check_options": "local",
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":true
+          },
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_definition":  "select test_emp.empname from test_schema.test_emp;",
+    "test_name":  "test_view",
+    "test_owner": "postgres",
+    "test_schema_name": "test_schema",
+    "test_sec_label": []
+  },
+
+  "test_view_update_data":
+  {
+    "test_comment": "This is view update comment"
+  },
+
+  "test_mview_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_definition": "select test_emp.empname from test_schema.test_emp where test_emp.empno = 1;",
+    "test_fillfactor":  "11",
+    "test_name": "test_mview",
+    "test_owner": "postgres",
+    "test_schema_name": "test_schema",
+    "test_sec_label": [],
+    "test_tbscp": "pg_default",
+    "test_toast_autovacuum": true,
+    "test_toast_autovacuum_enabled": false,
+    "test_vacuum_tbl":
+    [
+      {
+        "name":"autovacuum_analyze_scale_factor"
+      },
+      {
+        "name":"autovacuum_analyze_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ],
+    "test_vacuum_toast":
+    [
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ],
+
+    "test_with_data": true
+  },
+
+    "test_mview_update_data":
+  {
+    "test_comment": "This is materialized view update comment"
+  },
+
+  "test_foreign_server_credentials":
+  {
+    "test_fsr_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+
+    "test_fsr_optns":
+    [
+      {
+        "fsrvoption":"host",
+        "fsrvvalue":"localhost"
+      },
+      {
+        "fsrvoption":"port",
+        "fsrvvalue":"5433"
+      },
+      {
+        "fsrvoption":"dbname",
+        "fsrvvalue":"postgres"
+      }
+    ],
+    "test_fsr_owner": "postgres",
+    "test_name": "test_foreign_server"
+  },
+
+  "test_FRS_update_data":
+  {
+    "test_comment": "This is foreign server update comment"
+  },
+
+  "test_user_mapping_credentials":
+  {
+    "test_name": "postgres",
+    "test_option": [],
+    "test_options":
+    [
+      {
+        "umoption":"user",
+        "umvalue":"postgres"
+      },
+      {
+        "umoption":"password",
+        "umvalue":"edb"
+      }
+    ]
+  },
+
+  "test_user_mapping_update_data":
+  {
+    "test_options":
+    {
+      "changed":
+      [
+        {"umoption":"password",
+          "umvalue":"edb1"
+        }
+      ]
+    }
+  },
+
+  "test_foreign_table_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"w",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"x",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_schema_name": "test_schema",
+    "test_column":
+    [
+      {
+        "attname":"enme",
+        "datatype":"text",
+        "attnotnull":true,
+        "collname":"pg_catalog.\"default\"",
+        "is_tlength":false,
+        "is_precision":false
+      }
+    ],
+    "test_constraints": [],
+    "test_options": [],
+    "test_frs_name":  "test_foreign_server",
+    "test_name": "test_ft",
+    "test_owner":  "postgres",
+    "test_rel_acl":  [],
+    "test_sec_lable": [],
+    "test_str_acl": []
+  },
+
+    "test_FT_update_data":
+  {
+    "test_comment": "This is foreign table update comment"
+  }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..9877a04
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,40 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    srv_grp = config_data['test_server_group']
+
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    con_response = node.tester.post('browser/database/connect/'
+                                    '{0}/{1}/{2}'.format
+                                    (srv_grp, server_id, db_id),
+                                    follow_redirects=True)
+
+    db_con = json.loads(con_response.data.decode())
+
+    return db_con
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..abc06d0
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,19 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import pickle
+
+
+def get_ids(url='/home/edb/Downloads/pgadmin4/web/regression/parent_id.pkl'):
+    # This function will read parent nodes id's and return it.
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+    return ids
\ No newline at end of file
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 9ec7ffe..6d8e074 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -9,10 +9,12 @@
 
 """ This file collect all modules/files present in tests directory and add
 them to TestSuite. """
-
+from __future__ import print_function
 import os
 import sys
 import unittest
+import operator
+import logging
 from testscenarios.scenarios import generate_scenarios
 
 # We need to include the root directory in sys.path to ensure that we can
@@ -44,6 +46,21 @@ TestsGeneratorRegistry.load_generators('pgadmin')
 # application. We can trigger test request to the application.
 test_client = app.test_client()
 
+class StreamToLogger(object):
+    """
+    Fake file-like stream object that redirects writes to a logger instance.
+    """
+    def __init__(self, logger, log_level=logging.INFO):
+        self.logger = logger
+        self.log_level = log_level
+        self.linebuf = ''
+
+    def write(self, buf):
+        for line in buf.rstrip().splitlines():
+            self.logger.log(self.log_level, line.rstrip())
+
+    def flush(self):
+        pass
 
 def suite():
     """ Defining test suite which will execute all the testcases present in
@@ -58,6 +75,8 @@ def suite():
 
         modules.insert(gen.priority, gen)
 
+    modules.sort(key=operator.attrgetter('priority'))
+
     for m in modules:
         obj = m()
         obj.setTestClient(test_client)
@@ -66,7 +85,26 @@ def suite():
 
     return pgadmin_suite
 
-
 if __name__ == '__main__':
+
+    print("Please check output in file: logger.log placed at "
+          ".../pgadmin4/web/regression")
+
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w'
+                        )
+
+    stdout_logger = logging.getLogger('STDOUT')
+    sl = StreamToLogger(stdout_logger, logging.INFO)
+    sys.stdout = sl
+
+    stderr_logger = logging.getLogger('STDERR')
+    sl = StreamToLogger(stderr_logger, logging.ERROR)
+    sys.stderr = sl
+
     suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    tests = unittest.TextTestRunner(descriptions=True, verbosity=2,
+                                    stream=sys.stdout).run(suite)
+    os.remove("parent_id.pkl")


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-06 08:33 ` Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-06-06 08:33 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi

On Sun, Jun 5, 2016 at 6:56 PM, Priyanka Shendge
<[email protected]> wrote:
> Hi,
>
> PFA patch for API test cases for tree nodes/modules. This patch does not
> include
> api tests for following modules:
>
> 1. Type
> 2. Table child nodes
> 3. FTS modules
>
> Kindly, review the same and let me know for any modification.

I took a very quick look at the patch and immediately saw a serious
problem I'm afraid - you cannot hard-code paths like this:

+            if os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
+                              'parent_id.pkl'):
+                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
+                                      '/regression/''parent_id.pkl', 'rb')

You need to dynamically generate such paths so this will work on any
machine. Look at line 19 of web/pgAdmin4.py to see how to get the
patch to the current file as an example.

Also; despite this not being part of the end-user interface, please
try to follow the standards for messages, e.g. instead of:

No event trigger(s) to update!!!

use

No event trigger(s) to update.

There is likely more to change of course, but please fix these issues first.

Thanks!

-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers



^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-06-06 08:39   ` Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-06 08:39 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

On 6 June 2016 at 14:03, Dave Page <[email protected]> wrote:

> Hi
>
> On Sun, Jun 5, 2016 at 6:56 PM, Priyanka Shendge
> <[email protected]> wrote:
> > Hi,
> >
> > PFA patch for API test cases for tree nodes/modules. This patch does not
> > include
> > api tests for following modules:
> >
> > 1. Type
> > 2. Table child nodes
> > 3. FTS modules
> >
> > Kindly, review the same and let me know for any modification.
>
> I took a very quick look at the patch and immediately saw a serious
> problem I'm afraid - you cannot hard-code paths like this:
>
> +            if
> os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
> +                              'parent_id.pkl'):
> +                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
> +                                      '/regression/''parent_id.pkl', 'rb')
>
> You need to dynamically generate such paths so this will work on any
> machine. Look at line 19 of web/pgAdmin4.py to see how to get the
> patch to the current file as an example.
>
Sure, i'll check and update accordingly.

>
> Also; despite this not being part of the end-user interface, please
> try to follow the standards for messages, e.g. instead of:
>
> No event trigger(s) to update!!!
>
> use
>
> No event trigger(s) to update.
>
Noted. I will update for all applicable files.

>
> There is likely more to change of course, but please fix these issues
> first.
>
Sure.

Thank you.

>
> Thanks!
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-09 12:37     ` Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-09 12:37 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi Dave,

PFA updated patch. I have made changes suggested by you.

Kindly, review and let me know for more changes.

On 6 June 2016 at 14:09, Priyanka Shendge <[email protected]
> wrote:

>
>
> On 6 June 2016 at 14:03, Dave Page <[email protected]> wrote:
>
>> Hi
>>
>> On Sun, Jun 5, 2016 at 6:56 PM, Priyanka Shendge
>> <[email protected]> wrote:
>> > Hi,
>> >
>> > PFA patch for API test cases for tree nodes/modules. This patch does not
>> > include
>> > api tests for following modules:
>> >
>> > 1. Type
>> > 2. Table child nodes
>> > 3. FTS modules
>> >
>> > Kindly, review the same and let me know for any modification.
>>
>> I took a very quick look at the patch and immediately saw a serious
>> problem I'm afraid - you cannot hard-code paths like this:
>>
>> +            if
>> os.path.isfile('/home/edb/Downloads/pgadmin4/web/regression/'
>> +                              'parent_id.pkl'):
>> +                exst_server_id = open('/home/edb/Downloads/pgadmin4/web'
>> +                                      '/regression/''parent_id.pkl',
>> 'rb')
>>
>> You need to dynamically generate such paths so this will work on any
>> machine. Look at line 19 of web/pgAdmin4.py to see how to get the
>> patch to the current file as an example.
>>
> Sure, i'll check and update accordingly.
>
>>
>> Also; despite this not being part of the end-user interface, please
>> try to follow the standards for messages, e.g. instead of:
>>
>> No event trigger(s) to update!!!
>>
>> use
>>
>> No event trigger(s) to update.
>>
> Noted. I will update for all applicable files.
>
>>
>> There is likely more to change of course, but please fix these issues
>> first.
>>
> Sure.
>
> Thank you.
>
>>
>> Thanks!
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [application/octet-stream] pgadmin_api_test2.patch (240.1K, 3-pgadmin_api_test2.patch)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py
index 6f3453b..489d324 100644
--- a/web/pgadmin/browser/server_groups/servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/__init__.py
@@ -14,12 +14,12 @@ from flask.ext.security import current_user
 from pgadmin.model import db, Server, ServerGroup, User
 from pgadmin.utils.menu import MenuItem
 from pgadmin.utils.ajax import make_json_response, bad_request, forbidden, \
-    make_response as ajax_response, internal_server_error, unauthorized, gone
+    make_response as ajax_response, internal_server_error, unauthorized
 from pgadmin.browser.utils import PGChildNodeView
 import traceback
 from flask.ext.babel import gettext
 import pgadmin.browser.server_groups as sg
-from pgadmin.utils.crypto import encrypt, decrypt, pqencryptpassword
+from pgadmin.utils.crypto import encrypt
 from config import PG_DEFAULT_DRIVER
 from pgadmin.browser.server_groups.servers.types import ServerType
 import config
@@ -70,22 +70,14 @@ class ServerModule(sg.ServerGroupPluginModule):
             conn = manager.connection()
             connected = conn.connected()
             if connected:
-                status, result = conn.execute_dict("""
+                status, in_recovery = conn.execute_scalar("""
                     SELECT CASE WHEN usesuper
                            THEN pg_is_in_recovery()
                            ELSE FALSE
-                           END as inrecovery,
-                           CASE WHEN usesuper AND pg_is_in_recovery()
-                           THEN pg_is_xlog_replay_paused()
-                           ELSE FALSE
-                           END as isreplaypaused
+                           END as inrecovery
                     FROM pg_user WHERE usename=current_user""")
-
-                in_recovery = result['rows'][0]['inrecovery'];
-                wal_paused = result['rows'][0]['isreplaypaused']
             else:
                 in_recovery = None
-                wal_paused = None
 
             yield self.generate_browser_node(
                     "%d" % (server.id),
@@ -100,8 +92,7 @@ class ServerModule(sg.ServerGroupPluginModule):
                     version=manager.version,
                     db=manager.db,
                     user=manager.user_info if connected else None,
-                    in_recovery=in_recovery,
-                    wal_pause=wal_paused
+                    in_recovery=in_recovery
                     )
 
     @property
@@ -170,7 +161,7 @@ class ServerModule(sg.ServerGroupPluginModule):
         Override it so that - it does not register the show_node preference for
         server type.
         """
-        ServerType.register_preferences()
+        pass
 
 class ServerMenuItem(MenuItem):
     def __init__(self, **kwargs):
@@ -204,11 +195,7 @@ class ServerNode(PGChildNodeView):
             [{'post': 'create_restore_point'}],
         'connect': [{
             'get': 'connect_status', 'post': 'connect', 'delete': 'disconnect'
-            }],
-        'change_password': [{'post': 'change_password'}],
-        'wal_replay': [{
-            'delete': 'pause_wal_replay', 'put': 'resume_wal_replay'
-        }]
+            }]
     })
 
     def nodes(self, gid):
@@ -228,24 +215,6 @@ class ServerNode(PGChildNodeView):
             conn = manager.connection()
             connected = conn.connected()
 
-            if connected:
-                status, result = conn.execute_dict("""
-                    SELECT CASE WHEN usesuper
-                           THEN pg_is_in_recovery()
-                           ELSE FALSE
-                           END as inrecovery,
-                           CASE WHEN usesuper AND pg_is_in_recovery()
-                           THEN pg_is_xlog_replay_paused()
-                           ELSE FALSE
-                           END as isreplaypaused
-                    FROM pg_user WHERE usename=current_user""")
-
-                in_recovery = result['rows'][0]['inrecovery'];
-                wal_paused = result['rows'][0]['isreplaypaused']
-            else:
-                in_recovery = None
-                wal_paused = None
-
             res.append(
                 self.blueprint.generate_browser_node(
                     "%d" % (server.id),
@@ -259,9 +228,7 @@ class ServerNode(PGChildNodeView):
                     server_type=manager.server_type if connected else 'pg',
                     version=manager.version,
                     db=manager.db,
-                    user=manager.user_info if connected else None,
-                    in_recovery=in_recovery,
-                    wal_pause=wal_paused
+                    user=manager.user_info if connected else None
                     )
                 )
         return make_json_response(result=res)
@@ -288,24 +255,6 @@ class ServerNode(PGChildNodeView):
         conn = manager.connection()
         connected = conn.connected()
 
-        if connected:
-            status, result = conn.execute_dict("""
-                SELECT CASE WHEN usesuper
-                    THEN pg_is_in_recovery()
-                    ELSE FALSE
-                    END as inrecovery,
-                    CASE WHEN usesuper AND pg_is_in_recovery()
-                    THEN pg_is_xlog_replay_paused()
-                    ELSE FALSE
-                    END as isreplaypaused
-                FROM pg_user WHERE usename=current_user""")
-
-            in_recovery = result['rows'][0]['inrecovery'];
-            wal_paused = result['rows'][0]['isreplaypaused']
-        else:
-            in_recovery = None
-            wal_paused = None
-
         return make_json_response(
                 result=self.blueprint.generate_browser_node(
                     "%d" % (server.id),
@@ -319,9 +268,7 @@ class ServerNode(PGChildNodeView):
                     server_type=manager.server_type if connected else 'pg',
                     version=manager.version,
                     db=manager.db,
-                    user=manager.user_info if connected else None,
-                    in_recovery=in_recovery,
-                    wal_pause=wal_paused
+                    user=manager.user_info if connected else None
                     )
                 )
 
@@ -350,14 +297,14 @@ class ServerNode(PGChildNodeView):
                     success=0,
                     errormsg=e.message)
 
-        try:
-            info = traceback.format_exc()
-        except Exception as e:
-            current_app.logger.exception(e)
-            info = str(e)
+        # try:
+        #     info = traceback.format_exc()
+        # except Exception as e:
+        #     current_app.logger.exception(e)
+        #     info = str(e)
 
         return make_json_response(success=1,
-                                  info=info)
+                                  info= "success")
 
     def update(self, gid, sid):
         """Update the server settings"""
@@ -782,24 +729,6 @@ class ServerNode(PGChildNodeView):
 
             current_app.logger.info('Connection Established for server: \
                 %s - %s' % (server.id, server.name))
-            # Update the recovery and wal pause option for the server if connected successfully
-            status, result = conn.execute_dict("""
-                    SELECT CASE WHEN usesuper
-                           THEN pg_is_in_recovery()
-                           ELSE FALSE
-                           END as inrecovery,
-                           CASE WHEN usesuper AND pg_is_in_recovery()
-                           THEN pg_is_xlog_replay_paused()
-                           ELSE FALSE
-                           END as isreplaypaused
-                    FROM pg_user WHERE usename=current_user""")
-            if status:
-                in_recovery = result['rows'][0]['inrecovery'];
-                wal_paused = result['rows'][0]['isreplaypaused']
-            else:
-                in_recovery = None
-                wal_paused = None
-
             return make_json_response(
                         success=1,
                         info=gettext("Server connected."),
@@ -811,9 +740,7 @@ class ServerNode(PGChildNodeView):
                             'type': manager.server_type,
                             'version': manager.version,
                             'db': manager.db,
-                            'user': manager.user_info,
-                            'in_recovery': in_recovery,
-                            'wal_pause': wal_paused
+                            'user': manager.user_info
                             }
                         )
 
@@ -911,177 +838,4 @@ class ServerNode(PGChildNodeView):
             )
             return internal_server_error(errormsg=str(e))
 
-    def change_password(self, gid, sid):
-        """
-        This function is used to change the password of the
-        Database Server.
-
-        Args:
-            gid: Group id
-            sid: Server id
-        """
-        try:
-            data = json.loads(request.form['data'])
-            if data and ('password' not in data or
-                         data['password'] == '' or
-                         'newPassword' not in data or
-                         data['newPassword'] == '' or
-                         'confirmPassword' not in data or
-                         data['confirmPassword'] == ''):
-                return make_json_response(
-                    status=400,
-                    success=0,
-                    errormsg=gettext(
-                        "Couldn't find the required parameter(s)."
-                    )
-                )
-
-            if data['newPassword'] != data['confirmPassword']:
-                return make_json_response(
-                    status=200,
-                    success=0,
-                    errormsg=gettext(
-                        "Passwords do not match."
-                    )
-                )
-
-            # Fetch Server Details
-            server = Server.query.filter_by(id=sid).first()
-            if server is None:
-                return bad_request(gettext("Server not found."))
-
-            # Fetch User Details.
-            user = User.query.filter_by(id=current_user.id).first()
-            if user is None:
-                return unauthorized(gettext("Unauthorized request."))
-
-            from pgadmin.utils.driver import get_driver
-            manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
-            conn = manager.connection()
-
-            decrypted_password = decrypt(manager.password, user.password)
-
-            if isinstance(decrypted_password, bytes):
-                decrypted_password = decrypted_password.decode()
-
-            password = data['password']
-
-            # Validate old password before setting new.
-            if password != decrypted_password:
-                return unauthorized(gettext("Incorrect password."))
-
-            # Hash new password before saving it.
-            password = pqencryptpassword(data['newPassword'], manager.user)
-
-            SQL = render_template("/".join([
-                        'servers/sql',
-                        '9.2_plus' if manager.version >= 90200 else '9.1_plus',
-                        'change_password.sql'
-                        ]),
-                conn=conn, _=gettext,
-                user=manager.user, encrypted_password=password)
-
-            status, res = conn.execute_scalar(SQL)
-
-            if not status:
-                return internal_server_error(errormsg=res)
-
-            password = encrypt(data['newPassword'], user.password)
-            # Check if old password was stored in pgadmin4 sqlite database.
-            # If yes then update that password.
-            if server.password is not None:
-                setattr(server, 'password', password)
-                db.session.commit()
-            # Also update password in connection manager.
-            manager.password = password
-            manager.update_session()
-
-            return make_json_response(
-                    status=200,
-                    success=1,
-                    info=gettext(
-                        "Password changed successfully."
-                    )
-                )
-
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
-
-    def wal_replay(self, sid, pause=True):
-        """
-        Utility function for wal_replay for resume/pause.
-        """
-        server = Server.query.filter_by(
-            user_id=current_user.id, id=sid
-        ).first()
-
-        if server is None:
-            return make_json_response(
-                success=0,
-                errormsg=gettext("Could not find the required server.")
-            )
-
-        try:
-            from pgadmin.utils.driver import get_driver
-            manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
-            conn = manager.connection()
-
-            # Execute SQL to pause or resume WAL replay
-            if conn.connected():
-                if pause:
-                    status, res = conn.execute_scalar(
-                        "SELECT pg_xlog_replay_pause();"
-                    )
-                    if not status:
-                        return internal_server_error(
-                            errormsg=str(res)
-                        )
-                else:
-                    status, res = conn.execute_scalar(
-                        "SELECT pg_xlog_replay_resume();"
-                    )
-                    if not status:
-                        return internal_server_error(
-                            errormsg=str(res)
-                        )
-                return make_json_response(
-                    success=1,
-                    info=gettext('WAL replay paused'),
-                    data={'in_recovery': True, 'wal_pause': pause}
-                )
-            return gone(errormsg=_('Please connect the server!'))
-        except Exception as e:
-            current_app.logger.error(
-                'WAL replay pause/resume failed'
-            )
-            return internal_server_error(errormsg=str(e))
-
-    def resume_wal_replay(self, gid, sid):
-        """
-        This method will resume WAL replay
-
-        Args:
-            gid: Server group ID
-            sid: Server ID
-
-        Returns:
-            None
-        """
-        return self.wal_replay(sid, False)
-
-    def pause_wal_replay(self, gid, sid):
-        """
-        This method will pause WAL replay
-
-        Args:
-            gid: Server group ID
-            sid: Server ID
-
-        Returns:
-            None
-        """
-        return self.wal_replay(sid, True)
-
-
-
 ServerNode.register_node_view(blueprint)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py
new file mode 100644
index 0000000..bfb0263
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class CastTestGenerator(BaseTestGenerator):
+
+    def runTest(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py
new file mode 100644
index 0000000..5f22f84
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_add.py
@@ -0,0 +1,77 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, os
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsAddTestCase(LoginTestCase):
+    """This class will add cast under database node. """
+
+    priority = 19
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data =\
+                {
+                    "castcontext": config_data['test_casts_credentials']
+                                              ['test_cast_context'],
+                    "encoding": config_data['test_casts_credentials']
+                                           ['test_encoding'],
+                    "name": config_data['test_casts_credentials']
+                                       ['test_name'],
+                    "srctyp": config_data['test_casts_credentials']
+                                         ['test_source_type'],
+                    "trgtyp": config_data['test_casts_credentials']
+                                         ['test_target_type']
+
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            cast_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["cid"].append(cast_id)
+
+            cast_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, cast_output)
+            cast_output.close()
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py
new file mode 100644
index 0000000..0340b42
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_delete.py
@@ -0,0 +1,62 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsDeleteTestCase(LoginTestCase):
+    """
+    This class will delete cast node present on the object browser's
+    tree node by response code.
+    """
+
+    priority = 22
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete added cast node under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        cast_id = all_id["cid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added cast node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(cast_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No cast(s) to delete.")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' + str(cast_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py
new file mode 100644
index 0000000..5603707
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_get.py
@@ -0,0 +1,46 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsGetTestCase(LoginTestCase):
+    """ This class will fetch the cast node added under database. """
+
+    priority = 20
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will get cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        cast_id = all_id["cid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(cast_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py
new file mode 100644
index 0000000..432ec8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/tests/test_cast_put.py
@@ -0,0 +1,67 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class CastsUpdateTestCase(LoginTestCase):
+    """
+    This class will update cast node present on the object browser's
+    tree node by response code.
+    """
+    priority = 21
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Cast Node', dict(url='/browser/cast/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update cast under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        cast_id = all_id["cid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added cast node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(cast_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No cast(s) to update.")
+
+            data = {
+                "description": config_data["test_cast_update_data"]
+                                   ["test_comment"],
+                "id": cast_id
+               }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(cast_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py
new file mode 100644
index 0000000..4b8df06
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class EventTriggerGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py
new file mode 100644
index 0000000..51a7ed9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_add.py
@@ -0,0 +1,77 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class EventTriggerAddTestCase(LoginTestCase):
+    """ This class will add new event trigger under schema node. """
+
+    priority = 39
+
+    scenarios = [
+        # Fetching default URL for event trigger node.
+        ('Fetch Event Trigger Node URL',
+         dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will add event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = \
+                {
+                    "enabled": config_data['test_event_trigger_credentials']
+                                          ['test_enable'],
+                    "eventfunname": config_data['test_event_trigger_credentials']
+                                               ['test_event_func'],
+                    "eventname": config_data['test_event_trigger_credentials']
+                                            ['test_event_name'],
+                    "eventowner": config_data['test_event_trigger_credentials']
+                                             ['test_event_owner'],
+                    "name": config_data['test_event_trigger_credentials']
+                                       ['test_name'],
+                    "providers": config_data['test_event_trigger_credentials']
+                                            ['test_provider']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/', data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            event_trigger_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["etid"].append(event_trigger_id)
+
+            event_trigger_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, event_trigger_output)
+            event_trigger_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py
new file mode 100644
index 0000000..8081e52
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_delete.py
@@ -0,0 +1,61 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class EventTriggerDeleteTestCase(LoginTestCase):
+    """ This class will delete added event trigger under database node. """
+
+    priority = 42
+
+    scenarios = [
+        # Fetching default URL for event trigger  node.
+        ('Fetch Event Trigger Node URL',
+         dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will delete event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        event_trigger_id = all_id["etid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added event trigger node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(event_trigger_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No event trigger(s) to delete.")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(event_trigger_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py
new file mode 100644
index 0000000..92b417b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_get.py
@@ -0,0 +1,47 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class EventTriggerGetTestCase(LoginTestCase):
+    """ This class will fetch added event trigger under schema node. """
+
+    priority = 40
+
+    scenarios = [
+        # Fetching default URL for event trigger  node.
+        ('Fetch Event Trigger Node URL',
+         dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will fetch event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        event_trigger_id = all_id["etid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(event_trigger_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py
new file mode 100644
index 0000000..2cfd04c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/tests/test_event_trigger_put.py
@@ -0,0 +1,66 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class EventTriggerPutTestCase(LoginTestCase):
+    """ This class will update added event trigger under schema node. """
+
+    priority = 41
+
+    scenarios = [
+        # Fetching default URL for event trigger  node.
+        ('Fetch Event Trigger Node URL',
+         dict(url='/browser/event_trigger/obj/'))
+        ]
+
+    def runTest(self):
+        """ This function will update event trigger under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        event_trigger_id = all_id["etid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added event trigger node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(event_trigger_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No event trigger(s) to update.")
+
+            data = \
+                {
+                    "comment": config_data['test_event_trigger_update_data']
+                                          ['test_comment'],
+                    "id": event_trigger_id
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(event_trigger_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py
new file mode 100644
index 0000000..025b57e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class ExtensionGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return []
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py
new file mode 100644
index 0000000..11c61c2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_add.py
@@ -0,0 +1,74 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import os
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionsAddTestCase(LoginTestCase):
+    """ This class will add new extension under extension node. """
+    priority = 33
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Extension Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add extension under 1st server of tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data =\
+                {
+                    "name": config_data['test_extension_credentials']
+                                              ['test_name'],
+                    "relocatable": config_data['test_extension_credentials']
+                                           ['test_relocate'],
+                    "schema": config_data['test_extension_credentials']
+                                       ['test_schema'],
+                    "version": config_data['test_extension_credentials']
+                                         ['test_version']
+
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            extension_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["eid"].append(extension_id)
+
+            extension_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, extension_output)
+            extension_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py
new file mode 100644
index 0000000..a775c8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_delete.py
@@ -0,0 +1,60 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionDeleteTestCase(LoginTestCase):
+    """ This class will delete extension node added under database node. """
+
+    priority = 96
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Cast Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete added extension under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        extension_id = all_id["eid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added extension node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' +
+                                       str(db_id) + '/' + str(extension_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No extension(s) to delete.")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(extension_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py
new file mode 100644
index 0000000..0fba2c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_get.py
@@ -0,0 +1,45 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionGetTestCase(LoginTestCase):
+    """ This class will fetch the extension node added under database. """
+
+    priority = 34 #24
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check extension Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added extension under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        extension_id = all_id["eid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(extension_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py
new file mode 100644
index 0000000..5645af3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/test_extension_put.py
@@ -0,0 +1,67 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class ExtensionPutTestCase(LoginTestCase):
+    """
+    This class will update extension node present on the object browser's
+    tree node by response code.
+    """
+    priority = 35
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check extension Node', dict(url='/browser/extension/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update extension node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        extension_id = all_id["eid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added extension node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(extension_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No extension(s) to update.")
+
+            data = \
+                {
+                    "id": extension_id,
+                    "schema": config_data["test_extension_update_data"]
+                                         ["test_schema"]
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(extension_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py
new file mode 100644
index 0000000..f5a240e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class LanguageTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py
new file mode 100644
index 0000000..14ec42d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_get.py
@@ -0,0 +1,47 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class LanguageGetTestCase(LoginTestCase):
+    """
+    This class will fetch default language node available under database node.
+    """
+    priority = 31
+
+    scenarios = [
+        # Fetching default URL for language node.
+        ('Check language Node', dict(url='/browser/language/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch default language node present under
+        database. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        lang_id = all_id["lid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' +
+                                       str(db_id) + '/' + str(lang_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py
new file mode 100644
index 0000000..63fab63
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/tests/test_language_put.py
@@ -0,0 +1,64 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class LanguageUpdateTestCase(LoginTestCase):
+    """ This class will update available language node under database node. """
+
+    priority = 32
+
+    scenarios = [
+        # Fetching default URL for cast node.
+        ('Check Language Node URL', dict(url='/browser/language/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update language node's comments field. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        lang_id = all_id["lid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch available language node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(lang_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No language(s) to update.")
+
+            data = {
+                "description": config_data["test_language_update_data"]
+                                   ["test_comment"],
+                "id": lang_id
+               }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(lang_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py
new file mode 100644
index 0000000..ba78cb1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class CollationTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py
new file mode 100644
index 0000000..4dcc565
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_add.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class CollationAddTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 48
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Default Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/' + str(srv_grp) +
+                                       '/' + str(server_id) + '/' +
+                                       str(db_id) + '/' + str(schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "copy_collation": config_data['test_collation_credentials']
+                                                 ['test_copy_collation'],
+                    "name": config_data['test_collation_credentials']
+                                       ['test_name'],
+                    "owner": config_data['test_collation_credentials']
+                                        ['test_owner'],
+                    "schema": config_data['test_collation_credentials']
+                                         ['test_schema']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            collation_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["coid"].append(collation_id)
+
+            collation_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, collation_output)
+            collation_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py
new file mode 100644
index 0000000..9187c5a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_delete.py
@@ -0,0 +1,73 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class CollationDeleteTestCase(LoginTestCase):
+    """ This class will delete added collation under schema node. """
+
+    priority = 51
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Fetch collation Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        collation_id = all_id["coid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(collation_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                        raise Exception("No collation node to delete.")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(collation_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py
new file mode 100644
index 0000000..4c95915
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class CollationGetTestCase(LoginTestCase):
+    """ This class will fetch new collation under schema node. """
+
+    priority = 49
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Fecth collation Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        collation_id = all_id["coid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(collation_id),
+                                               content_type='html/json')
+
+                self.assertEquals(get_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py
new file mode 100644
index 0000000..069d22e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/tests/test_collation_put.py
@@ -0,0 +1,79 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class CollationPutTestCase(LoginTestCase):
+    """ This class will update added collation under schema node. """
+
+    priority = 50
+
+    scenarios = [
+        # Fetching default URL for collation node.
+        ('Fetch collation Node URL', dict(url='/browser/collation/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update collation under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        collation_id = all_id["coid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(collation_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                        raise Exception("No collation node to update.")
+
+                data = \
+                    {
+                      "description": config_data['test_collation_update_data']
+                                                ['test_comment'],
+                      "id": collation_id,
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(collation_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py
new file mode 100644
index 0000000..7dca204
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DomainTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py
new file mode 100644
index 0000000..60518e6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_add.py
@@ -0,0 +1,96 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class DomainAddTestCase(LoginTestCase):
+    """ This class will add new domain under schema node. """
+
+    priority = 52
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fecth domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "basensp": config_data['test_domain_data']
+                                          ['test_schema'],
+                    "basetype": config_data['test_domain_data']
+                                           ['test_basetype'],
+                    "collname": config_data['test_domain_data']
+                                           ['test_collation'],
+                    "constraints": config_data['test_domain_data']
+                                              ['test_constraints'],
+                    "is_tlength": config_data['test_domain_data']
+                                             ['test_lenght'],
+                    "max_val": config_data['test_domain_data']
+                                          ['test_max_value'],
+                    "min_val": config_data['test_domain_data']
+                                          ['test_min_value'],
+                    "name": config_data['test_domain_data']
+                                       ['test_name'],
+                    "owner": config_data['test_domain_data']
+                                        ['test_owner'],
+                    "seclabels": config_data['test_domain_data']
+                                            ['test_security'],
+                    "typdefault": config_data['test_domain_data']
+                                             ['test_defalt_type'],
+                    "typlen": config_data['test_domain_data']
+                                         ['test_type_len'],
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            domain_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["doid"].append(domain_id)
+
+            domain_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, domain_output)
+            domain_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py
new file mode 100644
index 0000000..906ee45
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_delete.py
@@ -0,0 +1,72 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class DomainDeleteTestCase(LoginTestCase):
+    """ This class will delete new domain under schema node. """
+
+    priority = 55
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fecth domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        domain_id= all_id["doid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(domain_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                        raise Exception("No domain node to delete.")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(domain_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py
new file mode 100644
index 0000000..cc0fe5c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class DomainGetTestCase(LoginTestCase):
+    """ This class will fetch new collation under schema node. """
+
+    priority = 53
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fetch domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        domain_id= all_id["doid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(domain_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py
new file mode 100644
index 0000000..b2ab972
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/tests/test_domain_put.py
@@ -0,0 +1,79 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class DomainPutTestCase(LoginTestCase):
+    """ This class will fetch new collation under schema node. """
+
+    priority = 54
+
+    scenarios = [
+        # Fetching default URL for domain node.
+        ('Fecth domain Node URL', dict(url='/browser/domain/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update domain under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        domain_id= all_id["doid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(domain_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                        raise Exception("No domain node to update.")
+
+                data = \
+                    {
+                          "description": config_data['test_domain_update_data']
+                                                    ['test_comment'],
+                          "id": domain_id,
+                    }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' +
+                                           str(db_id) + '/' +
+                                           str(schema_id) + '/' +
+                                           str(domain_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py
new file mode 100644
index 0000000..03bf3f6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class TriggerFunctionTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py
new file mode 100644
index 0000000..365248b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_add.py
@@ -0,0 +1,109 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class TriggerFuncAddTestCase(LoginTestCase):
+    """ This class will add new trigger function under schema node. """
+
+    priority = 36
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fecth Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add trigger function under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get('/browser/schema/obj/' + str(srv_grp) +
+                                       '/' + str(server_id) + '/' +
+                                       str(db_id) + '/' + str(schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "acl": config_data
+                    ['test_trigger_function_credentials']['test_acl'],
+                    "arguments": config_data
+                    ['test_trigger_function_credentials']['test_args'],
+                    "funcowner": config_data
+                    ['test_trigger_function_credentials']['test_fun_owner'],
+                    "lanname": config_data
+                    ['test_trigger_function_credentials']['test_language'],
+                    "name": config_data
+                    ['test_trigger_function_credentials']['test_name'],
+                    "options": config_data
+                    ['test_trigger_function_credentials']['test_options'],
+                    "probin": config_data
+                    ['test_trigger_function_credentials']['test_probe'],
+                    "proleakproof": config_data
+                    ['test_trigger_function_credentials']['test_leak_proof'],
+                    "pronamespace": config_data
+                    ['test_trigger_function_credentials']['test_namespace'],
+                    "prorettypename": config_data
+                    ['test_trigger_function_credentials']['test_type'],
+                    "prosecdef": config_data
+                    ['test_trigger_function_credentials']['test_sec_def'],
+                    "prosrc": config_data
+                    ['test_trigger_function_credentials']['test_code'],
+                    "provolatile": config_data
+                    ['test_trigger_function_credentials']['test_volitile'],
+                    "seclabels": config_data
+                    ['test_trigger_function_credentials']['test_sec_label'],
+                    "variables": config_data
+                    ['test_trigger_function_credentials']['test_Variable']
+                }
+
+            if schema_id:
+                data['pronamespace'] = schema_id
+            else:
+                schema_id = data['pronamespace']
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            trg_func__id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["tfnid"].append(trg_func__id)
+
+            extension_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, extension_output)
+            extension_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py
new file mode 100644
index 0000000..a64cd5f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_delete.py
@@ -0,0 +1,74 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TriggerFuncDeleteTestCase(LoginTestCase):
+    """ This class will add new trigger function under schema node. """
+
+    priority = 43
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fetch Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete trigger function under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        trg_func__id = all_id["tfnid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(trg_func__id),
+                                               content_type='html/json')
+
+                respdata = json.loads(get_response.data.decode())
+
+                if len(respdata) == 0:
+                    raise Exception("No trigger function(s) to delete.")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' +
+                                                  str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(trg_func__id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py
new file mode 100644
index 0000000..ab05fe0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_get.py
@@ -0,0 +1,61 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TriggerFuncGetTestCase(LoginTestCase):
+    """ This class will fetch added trigger function under schema node. """
+
+    priority = 37
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fetch Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch trigger function under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        trg_func__id = all_id["tfnid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(trg_func__id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py
new file mode 100644
index 0000000..619f4ea
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_trigger_func_put.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TriggerFuncPutTestCase(LoginTestCase):
+    """ This class will update new trigger function under schema node. """
+
+    priority = 38
+
+    scenarios = [
+        # Fetching default URL for trigger function node.
+        ('Fecth Trigger Function Node URL',
+         dict(url='/browser/trigger_function/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update trigger function under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        trg_func__id = all_id["tfnid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(trg_func__id),
+                                               content_type='html/json')
+
+                respdata = json.loads(get_response.data.decode())
+
+                if len(respdata) == 0:
+                    raise Exception("No trigger function(s) to update.")
+
+                data = \
+                    {
+                        "description": config_data
+                        ['test_trigger_func_update_data']['test_comment'],
+                        "id": trg_func__id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(trg_func__id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py
new file mode 100644
index 0000000..ff11e3e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class SequenceTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py
new file mode 100644
index 0000000..b833972
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py
@@ -0,0 +1,94 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class SequenceAddTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 56
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fetch sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "cache": config_data['test_sequence_credentials']
+                                        ['test_cache'],
+                    "cycled": config_data['test_sequence_credentials']
+                                         ['test_cycled'],
+                    "increment": config_data['test_sequence_credentials']
+                                            ['test_increment'],
+                    "maximum": config_data['test_sequence_credentials']
+                                          ['test_max_value'],
+                    "minimum": config_data['test_sequence_credentials']
+                                          ['test_min_value'],
+                    "name": config_data['test_sequence_credentials']
+                                       ['test_name'],
+                    "relacl": config_data['test_sequence_credentials']
+                                         ['test_acl'],
+                    "schema": config_data['test_sequence_credentials']
+                                         ['test_schema_name'],
+                    "securities": config_data['test_sequence_credentials']
+                                             ['test_security'],
+                    "seqowner": config_data['test_sequence_credentials']
+                                           ['test_owner'],
+                    "start": config_data['test_sequence_credentials']
+                                        ['test_start_val']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            sequence_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["seid"].append(sequence_id)
+
+            sequence_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, sequence_output)
+            sequence_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py
new file mode 100644
index 0000000..3f952e4
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_delete.py
@@ -0,0 +1,73 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SequenceDeleteTestCase(LoginTestCase):
+    """ This class will delete added sequence node under schema node. """
+
+    priority = 59
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fecth sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete added sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        sequence_id = all_id["seid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No sequence node to delete.")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(sequence_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py
new file mode 100644
index 0000000..f3b6f10
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SequenceGetTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 57
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fetch sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        sequence_id = all_id["seid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py
new file mode 100644
index 0000000..035315f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SequenceUpdateTestCase(LoginTestCase):
+    """ This class will update new sequence node under schema node. """
+
+    priority = 58
+
+    scenarios = [
+        # Fetching default URL for sequence node.
+        ('Fetch sequence Node URL', dict(url='/browser/sequence/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update added sequence under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        sequence_id = all_id["seid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No sequence node to update.")
+
+                data =\
+                    {
+                        "comment": config_data['test_sequnce_update_data']
+                                              ['test_comment'],
+                        "id": sequence_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(sequence_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py
new file mode 100644
index 0000000..2450edb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class TableTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py
new file mode 100644
index 0000000..42011c2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_add.py
@@ -0,0 +1,113 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class TableAddTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 60
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+            data = \
+                {
+                    "check_constraint": config_data
+                    ['test_table_credentials']['test_constraint'],
+                    "coll_inherits": config_data
+                    ['test_table_credentials']['test_col_inherit'],
+                    "columns": config_data
+                    ['test_table_credentials']['test_columns'],
+                    "exclude_constraint": config_data
+                    ['test_table_credentials']['test_has_constraint'],
+                    "fillfactor": config_data
+                    ['test_table_credentials']['test_fillfactor'],
+                    "foreign_key": config_data
+                    ['test_table_credentials']['test_has_FK'],
+                    "hastoasttable": config_data
+                    ['test_table_credentials']['test_has_toast_tbl'],
+                    "like_constraints": config_data
+                    ['test_table_credentials']['test_like_constraint'],
+                    "like_default_value": config_data
+                    ['test_table_credentials']['test_like_default_value'],
+                    "like_relation": config_data
+                    ['test_table_credentials']['test_like_relation'],
+                    "name": config_data
+                    ['test_table_credentials']['test_name'],
+                    "primary_key": config_data
+                    ['test_table_credentials']['test_PK'],
+                    "relacl": config_data
+                    ['test_table_credentials']['test_acl'],
+                    "relhasoids": config_data
+                    ['test_table_credentials']['test_has_oid'],
+                    "relowner": config_data
+                    ['test_table_credentials']['test_owner'],
+                    "schema": config_data
+                    ['test_table_credentials']['test_schema'],
+                    "seclabels": config_data
+                    ['test_table_credentials']['test_sec_acl'],
+                    "spcname": config_data
+                    ['test_table_credentials']['test_tbscp'],
+                    "unique_constraint": config_data
+                    ['test_table_credentials']['test_unique_constraint'],
+                    "vacuum_table": config_data
+                    ['test_table_credentials']['test_vacuum_tbl'],
+                    "vacuum_toast": config_data
+                    ['test_table_credentials']['test_vacuum_toast']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            table_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["tid"].append(table_id)
+
+            table_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, table_output)
+            table_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py
new file mode 100644
index 0000000..6481815
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_delete.py
@@ -0,0 +1,73 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TableDeleteTestCase(LoginTestCase):
+    """ This class will delete new table under schema node. """
+
+    priority = 97
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fetch table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete added table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        table_id = all_id["tid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No table(s) to delete.")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(table_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py
new file mode 100644
index 0000000..a98a3d3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_get.py
@@ -0,0 +1,59 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TableGetTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 61
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        table_id = all_id["tid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py
new file mode 100644
index 0000000..0ce42bc
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_table_put.py
@@ -0,0 +1,79 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class TableUpdateTestCase(LoginTestCase):
+    """ This class will add new collation under schema node. """
+
+    priority = 62
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fecth table Node URL', dict(url='/browser/table/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added table under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        table_id = all_id["tid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No table(s) to update.")
+
+                data =\
+                    {
+                        "description": config_data['test_table_update_data']
+                                              ['test_comment'],
+                        "id": table_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(table_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py
new file mode 100644
index 0000000..3403f4f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class SchemaTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py
new file mode 100644
index 0000000..ecc0952
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_add.py
@@ -0,0 +1,87 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import os
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class SchemaAddTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 23
+
+    scenarios = [
+        # Fetching default URL for schema node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data =\
+            {
+                "deffuncacl": config_data['test_schema_credentials']
+                                              ['test_func_acl'],
+                "defseqacl": config_data['test_schema_credentials']
+                                              ['test_seq_acl'],
+                "deftblacl": config_data['test_schema_credentials']
+                                              ['test_tbl_acl'],
+                "deftypeacl": config_data['test_schema_credentials']
+                                              ['test_type_acl'],
+                "name": config_data['test_schema_credentials']
+                                              ['test_name'],
+                "namespaceowner": config_data['test_schema_credentials']
+                                              ['test_owner'],
+                "nspacl": config_data['test_schema_credentials']
+                                              ['test_privilege'],
+                "seclabels": config_data['test_schema_credentials']
+                                              ['test_sec_label']
+            }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/', data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            schema_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["scid"].append(schema_id)
+
+            schema_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, schema_output)
+            schema_output.close()
+
+
+
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py
new file mode 100644
index 0000000..e1649dc
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_delete.py
@@ -0,0 +1,60 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SchemaDeleteTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 98
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) to delete.")
+
+            del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                              str(server_id) + '/' +
+                                              str(db_id) + '/' +
+                                              str(schema_id),
+                                              follow_redirects=True)
+
+            del_respdata = json.loads(del_response.data.decode())
+
+            self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py
new file mode 100644
index 0000000..a8a9b93
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_get.py
@@ -0,0 +1,44 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class SchemaGetTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 24 #34
+
+    scenarios = [
+        # Fetching default URL for extension node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(schema_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py
new file mode 100644
index 0000000..67e778e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/test_schema_put.py
@@ -0,0 +1,71 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class SchemaPutTestCase(LoginTestCase):
+    """ This class will add new schema under database node. """
+
+    priority = 25
+
+    scenarios = [
+        # Fetching default URL for schema node.
+        ('Check Schema Node URL', dict(url='/browser/schema/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update schema under database node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id) +
+                                       '/' + str(schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) == 0:
+                raise Exception("No schema(s) to update.")
+
+            data =\
+                {
+                    "deffuncacl": config_data["test_schema_update_data"]
+                                             ["test_func_acl"],
+                    "defseqacl": config_data["test_schema_update_data"]
+                                            ["test_seq_acl"],
+                    "deftblacl": config_data["test_schema_update_data"]
+                                            ["test_tbl_acl"],
+                    "id": schema_id
+                }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id) +
+                                           '/' + str(schema_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
+            respdata = json.loads(put_response.data.decode())
+            self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py
new file mode 100644
index 0000000..138c249
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/__init__.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class ViewTestGenerator(BaseTestGenerator):
+
+   def generate_tests(self):
+       return []
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_add.py
new file mode 100644
index 0000000..f0ccde1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_add.py
@@ -0,0 +1,99 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class MViewAddTestCase(LoginTestCase):
+    """ This class will add new view under schema node. """
+
+    priority = 67
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fecth materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Get schema id
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "datacl": config_data
+                    ['test_mview_credentials']['test_acl'],
+                    "definition": config_data
+                    ['test_mview_credentials']['test_definition'],
+                    "fillfactor": config_data
+                    ['test_mview_credentials']['test_fillfactor'],
+                    "name": config_data
+                    ['test_mview_credentials']['test_name'],
+                    "owner": config_data
+                    ['test_mview_credentials']['test_owner'],
+                    "schema": config_data
+                    ['test_mview_credentials']['test_schema_name'],
+                    "seclabels": config_data
+                    ['test_mview_credentials']['test_sec_label'],
+                    "spcname": config_data
+                    ['test_mview_credentials']['test_tbscp'],
+                    "toast_autovacuum": config_data
+                    ['test_mview_credentials']['test_toast_autovacuum'],
+                    "toast_autovacuum_enabled": config_data
+                    ['test_mview_credentials']['test_toast_autovacuum_enabled'],
+                    "vacuum_table": config_data
+                    ['test_mview_credentials']['test_vacuum_tbl'],
+                    "vacuum_toast": config_data
+                    ['test_mview_credentials']['test_vacuum_toast'],
+                    "with_data": config_data
+                    ['test_mview_credentials']['test_with_data']
+
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            mview_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["mvid"].append(mview_id)
+
+            mview_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, mview_output)
+            mview_output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_delete.py
new file mode 100644
index 0000000..bb64dc0
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_delete.py
@@ -0,0 +1,75 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class MViewDeleteTestCase(LoginTestCase):
+    """ This class will delete new materialized view under schema node. """
+
+    priority = 70
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fetch materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        mview_id = all_id["mvid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No materialized view to delete.")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(mview_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_get.py
new file mode 100644
index 0000000..432e9a9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_get.py
@@ -0,0 +1,60 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class MViewGetTestCase(LoginTestCase):
+    """ This class will fetch new materialized view under schema node. """
+
+    priority = 68
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fetch materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        mview_id = all_id["mvid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj'
+                                       '/{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_put.py
new file mode 100644
index 0000000..36ccebe
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_mview_put.py
@@ -0,0 +1,80 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class MViewPutTestCase(LoginTestCase):
+    """ This class will fetch new materialized view under schema node. """
+
+    priority = 69
+
+    scenarios = [
+        # Fetching default URL for materialized view node.
+        ('Fetch materialized view Node URL', dict(url='/browser/mview/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add materialized view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        mview_id = all_id["mvid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No materialized view to update.")
+
+                data =\
+                    {
+                        "comment": config_data['test_view_update_data']
+                                              ['test_comment'],
+                        "id": mview_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(mview_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_add.py
new file mode 100644
index 0000000..0cbde19
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_add.py
@@ -0,0 +1,86 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ViewAddTestCase(LoginTestCase):
+    """ This class will add new view under schema node. """
+
+    priority = 63
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fetch view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            data = \
+                {
+                    "check_option": config_data
+                    ['test_view_credentials']['test_check_options'],
+                    "datacl": config_data
+                    ['test_view_credentials']['test_acl'],
+                    "definition": config_data
+                    ['test_view_credentials']['test_definition'],
+                    "name": config_data
+                    ['test_view_credentials']['test_name'],
+                    "owner": config_data
+                    ['test_view_credentials']['test_owner'],
+                    "schema": config_data
+                    ['test_view_credentials']['test_schema_name'],
+                    "seclabels": config_data
+                    ['test_view_credentials']['test_sec_label']
+                }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/' +
+                                        str(server_id) + '/' + str(db_id) +
+                                        '/' + str(schema_id) + '/',
+                                        data=json.dumps(data),
+                                        content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            view_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["vid"].append(view_id)
+
+            view_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, view_output)
+            view_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_delete.py
new file mode 100644
index 0000000..d552ece
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_delete.py
@@ -0,0 +1,75 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class ViewDeleteTestCase(LoginTestCase):
+    """ This class will update new view under schema node. """
+
+    priority = 66
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fetch view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        view_id = all_id["vid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No view to delete.")
+
+                del_response = self.tester.delete(self.url + str(srv_grp) +
+                                                  '/' + str(server_id) + '/' +
+                                                  str(db_id) + '/' +
+                                                  str(schema_id) + '/' +
+                                                  str(view_id),
+                                                  follow_redirects=True)
+
+                del_respdata = json.loads(del_response.data.decode())
+
+                self.assertTrue(del_respdata['success'], 1)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_get.py
new file mode 100644
index 0000000..611018f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_get.py
@@ -0,0 +1,61 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+import pickle
+import os
+
+
+class ViewGetTestCase(LoginTestCase):
+    """ This class will fetch new view under schema node. """
+
+    priority = 64
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fetch view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        view_id = all_id["vid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               content_type='html/json')
+
+                self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_put.py
new file mode 100644
index 0000000..8c9421c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_view_put.py
@@ -0,0 +1,79 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+import json
+
+
+class ViewPutTestCase(LoginTestCase):
+    """ This class will update new view under schema node. """
+
+    priority = 65
+
+    scenarios = [
+        # Fetching default URL for view node.
+        ('Fecth view Node URL', dict(url='/browser/view/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update view under schema node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        schema_id = all_id["scid"][0]
+        view_id = all_id["vid"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            # Fetch added schema node.
+            response = self.tester.get('/browser/schema/obj/'
+                                       '{0}/{1}/{2}/{3}'.format
+                                       (srv_grp, server_id, db_id, schema_id),
+                                       content_type='html/json')
+
+            respdata = json.loads(response.data.decode())
+
+            if len(respdata) != 0:
+
+                get_response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               content_type='html/json')
+
+                get_respdata = json.loads(get_response.data.decode())
+
+                if len(get_respdata) == 0:
+                    raise Exception("No view to update.")
+
+                data =\
+                    {
+                        "comment": config_data['test_view_update_data']
+                                              ['test_comment'],
+                        "id": view_id
+                    }
+
+                put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                               str(server_id) + '/' +
+                                               str(db_id) + '/' +
+                                               str(schema_id) + '/' +
+                                               str(view_id),
+                                               data=json.dumps(data),
+                                               follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..60ed4c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,16 @@
+# ##########################################################################
+#
+# #pgAdmin 4 - PostgreSQL Tools
+#
+# #Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# #This software is released under the PostgreSQL Licence
+#
+# ##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DatabaseGenerateTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..02dda68
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,99 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, uuid, os
+from regression.test_utils import get_ids
+
+
+class DatabaseAddTestCase(LoginTestCase):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+    priority = 8
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        self.assertEquals(response.status_code, 200)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                     "datacl": config_data['test_add_database_data']
+                                          ['test_privileges_acl'],
+                     "datconnlimit": config_data['test_add_database_data']
+                                                ['test_conn_limit'],
+                     "datowner": config_data['test_add_database_data']
+                                            ['test_owner'],
+                     "deffuncacl": config_data['test_add_database_data']
+                                              ['test_fun_acl'],
+                     "defseqacl": config_data['test_add_database_data']
+                                             ['test_seq_acl'],
+                     "deftblacl": config_data['test_add_database_data']
+                                             ['test_tbl_acl'],
+                     "deftypeacl": config_data['test_add_database_data']
+                                              ['test_type_acl'],
+                     "encoding": config_data['test_add_database_data']
+                                            ['test_encoding'],
+                     "name": str(uuid.uuid4())[1:8],
+                     "privileges": config_data['test_add_database_data']
+                                              ['test_privileges'],
+                     "securities": config_data['test_add_database_data']
+                                              ['test_securities'],
+                     "variables": config_data['test_add_database_data']
+                                             ['test_variables']
+                    }
+
+            db_response = self.tester.post(self.url + str(srv_grp) + "/" +
+                                           server_id + "/",
+                                           data=json.dumps(data),
+                                           content_type='html/json')
+
+            self.assertTrue(db_response.status_code, 200)
+
+            respdata = json.loads(db_response.data.decode())
+
+            db_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+
+                exst_server_id = open(pickle_path, 'rb')
+
+                tol_server_id = pickle.load(exst_server_id)
+                pickle_id_dict = tol_server_id
+
+                pickle_id_dict["did"].append(db_id)
+
+                db_output = open(pickle_path, 'wb')
+                pickle.dump(pickle_id_dict, db_output)
+                db_output.close()
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
new file mode 100644
index 0000000..e008df3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -0,0 +1,47 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabaseDeleteTestCase(LoginTestCase):
+    """ This class will delete the database under last added server. """
+
+    priority = 99
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if len(db_con) == 0:
+            raise Exception("No database(s) to delete.")
+
+        response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                      str(server_id) + '/' + str(db_id),
+                                      follow_redirects=True)
+
+        respdata = json.loads(response.data.decode())
+
+        self.assertTrue(respdata['success'], 1)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..bbbd7ec
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,43 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(LoginTestCase):
+    """
+    This class will fetch database added under last added server.
+    """
+    priority = 9
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con["info"] == "Database Connected.":
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..809a51e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,50 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class DatabasesUpdateTestCase(LoginTestCase):
+    """
+    This class will update the database under last added server.
+    """
+    priority = 10
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = {"comments": config_data["test_db_update_data"]
+                                           ["test_comment"],
+                    "id": db_id
+                   }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py
new file mode 100644
index 0000000..4a11bf8
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class RoleGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py
new file mode 100644
index 0000000..66de64c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_add.py
@@ -0,0 +1,89 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, uuid, os
+from regression.test_utils import get_ids
+
+
+class LoginRoleAddTestCase(LoginTestCase):
+    """ This class will add login role node under added server. """
+
+    priority = 12
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add new role under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                    "rolcanlogin": config_data['test_lr_credentials']
+                                              ['test_can_login'],
+                    "rolconnlimit": config_data['test_lr_credentials']
+                                               ['test_conn_limit'],
+                    "rolcreaterole": config_data['test_lr_credentials']
+                                                ['test_create_role'],
+                    "rolinherit": config_data['test_lr_credentials']
+                                             ['test_role_inherit'],
+                    "rolmembership": config_data['test_lr_credentials']
+                                                ['test_role_membership'],
+                    "rolname": str(uuid.uuid4())[1:8],
+                    "rolpassword": config_data['test_lr_credentials']
+                                              ['test_lr_password'],
+                    "rolvaliduntil": config_data['test_lr_credentials']
+                                                ['test_lr_validity'],
+                    "seclabels": config_data['test_lr_credentials']
+                                            ['test_sec_lable'],
+                    "variables": config_data['test_lr_credentials']
+                                            ['test_variable']
+                   }
+
+            response = self.tester.post(self.url + str(srv_grp) + '/'
+                                       + server_id + '/', data=json.dumps(data),
+                                        content_type='html/json')
+
+            self.assertTrue(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+
+            lr_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_server_id)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["lrid"].append(lr_id)
+
+            lr_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, lr_output)
+            lr_output.close()
+
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py
new file mode 100644
index 0000000..445fd7c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_delete.py
@@ -0,0 +1,47 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from .test_role_func import test_getrole
+from regression.test_utils import get_ids
+
+
+class LoginRoleDeleteTestCase(LoginTestCase):
+    """ This class will delete added login role present under server node. """
+
+    priority = 14
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the role. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        respdata = test_getrole(node=self)
+
+        role_id = respdata['oid']
+
+        if len(respdata) == 0:
+            raise Exception("No roles(s) to delete!!!")
+
+        del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                          str(server_id) + '/' + str(role_id),
+                                          follow_redirects=True)
+
+        del_respdata = json.loads(del_response.data.decode())
+
+        self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_func.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_func.py
new file mode 100644
index 0000000..3e06b08
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_func.py
@@ -0,0 +1,48 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getrole(node=None):
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    role_id = all_id["lrid"][0]
+
+    srv_grp = config_data['test_server_group']
+
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(
+                                password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']),
+                                follow_redirects=True)
+
+    srv_connect = json.loads(response.data.decode())
+
+    if srv_connect['data']['connected']:
+
+        response = node.tester.get('/browser/role/obj/{0}/{1}/{2}'.format
+                                   (srv_grp, server_id, role_id),
+                                   content_type='html/json')
+
+        respdata = json.loads(response.data.decode())
+
+        return respdata
+
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py
new file mode 100644
index 0000000..636ce1c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_get.py
@@ -0,0 +1,56 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.utils import get_ids
+
+
+class LoginRoleGetTestCase(LoginTestCase):
+    """
+    This class will fetch login roles node present under the object browser's
+    tree node by response code.
+    """
+
+    priority = 13
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added login role under tree node. """
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        role_id = all_id["lrid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(role_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py
new file mode 100644
index 0000000..34879f4
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/roles/tests/test_role_put.py
@@ -0,0 +1,51 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from .test_role_func import test_getrole
+from regression.test_utils import get_ids
+
+
+class LoginRolePutTestCase(LoginTestCase):
+    """This class update the comment field of login roles node."""
+
+    priority = 13
+
+    scenarios = [
+        # Fetching default URL for roles node.
+        ('Check Role Node', dict(url='/browser/role/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the role's comment field."""
+
+        all_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = all_id["sid"][0]
+
+        respdata = test_getrole(node=self)
+
+        role_id = respdata['oid']
+
+        data = {
+                "description": config_data["test_lr_update_data"]
+                                          ["test_comment"],
+                "oid": role_id
+               }
+
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(role_id),
+                                       data=json.dumps(data),
+                                       follow_redirects=True)
+
+        self.assertEquals(put_response.status_code, 200)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py
new file mode 100644
index 0000000..28fcc16
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/__init__.py
@@ -0,0 +1,16 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class TblspaceGeneratorTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py
new file mode 100644
index 0000000..2d1651f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_add.py
@@ -0,0 +1,78 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json, pickle, uuid, os
+from regression.test_utils import get_ids
+
+
+class TbspcAddTestCase(LoginTestCase):
+    """ This class will add tablespace node under server. """
+    priority = 15
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add new tablespace under server node."""
+
+        srv_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = srv_id["sid"][0]
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+            data = \
+                {
+                    "name": str(uuid.uuid4())[1:8],
+                    "seclabels": config_data["test_tablespc_credentials"]
+                                            ["test_spc_seclable"],
+                    "spcacl": config_data["test_tablespc_credentials"]
+                                         ["test_spc_acl"],
+                    "spclocation": config_data["test_tablespc_credentials"]
+                                              ["test_spc_location"],
+                    "spcoptions": config_data["test_tablespc_credentials"]
+                                             ["test_spc_opts"],
+                    "spcuser": config_data["test_tablespc_credentials"]
+                                          ["test_spc_user"]
+                }
+#
+            response = self.tester.post(self.url + str(srv_grp) + '/'
+                                                   + server_id + '/',
+                                       data=json.dumps(data),
+                                        content_type='html/json')
+            self.assertTrue(response.status_code, 200)
+            respdata = json.loads(response.data.decode())
+            tbspc_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_ids = open(pickle_path, 'rb')
+                all_id = pickle.load(exst_ids)
+                pickle_id_dict = all_id
+
+            pickle_id_dict["tsid"].append(tbspc_id)
+
+            spc_output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, spc_output)
+            spc_output.close()
+
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py
new file mode 100644
index 0000000..8674ba4
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_delete.py
@@ -0,0 +1,51 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from .test_tbspc_func import test_gettblspc
+
+class TbspcDeleteTestCase(LoginTestCase):
+    """
+    This class will delete tablespace node present under the object browser's
+    tree node by response code.
+    """
+
+    priority = 18
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the added tablespace"""
+
+        all_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = all_id["sid"][0]
+
+        respdata = test_gettblspc(node=self)
+
+        tbspc_id = respdata['oid']
+
+        if len(respdata) == 0:
+            raise Exception("No tablespace(s) to delete!!!")
+
+        del_response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                          str(server_id) + '/' + str(tbspc_id),
+                                          follow_redirects=True)
+
+        del_respdata = json.loads(del_response.data.decode())
+
+        self.assertTrue(del_respdata['success'], 1)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_func.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_func.py
new file mode 100644
index 0000000..2abcf8d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_func.py
@@ -0,0 +1,45 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.test_utils import get_ids
+from regression.config import config_data
+import json
+
+
+def test_gettblspc(node=None):
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    tbspc_id = all_id["tsid"][0]
+
+    srv_grp = config_data['test_server_group']
+
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    srv_connect = json.loads(response.data.decode())
+
+    if srv_connect['data']['connected']:
+
+        response = node.tester.get('/browser/tablespace/obj/{0}/{1}/{2}'.format
+                                   (srv_grp, server_id, tbspc_id),
+                                   content_type='html/json')
+
+        node.assertEquals(response.status_code, 200)
+
+        respdata = json.loads(response.data.decode())
+
+        return respdata
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py
new file mode 100644
index 0000000..0d85f46
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_get.py
@@ -0,0 +1,57 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+
+
+class TbspcGetTestCase(LoginTestCase):
+    """
+    This class will fetch added tablespace under the object browser's
+    tree node by response code.
+    """
+    priority = 16
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will get the added tablespace."""
+
+        all_id = get_ids()
+
+        srv_grp = config_data['test_server_group']
+
+        server_id = all_id["sid"][0]
+        tbspc_id = all_id["tsid"][0]
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(tbspc_id),
+                                       content_type='html/json')
+
+            self.assertEquals(response.status_code, 200)
+
+            respdata = json.loads(response.data.decode())
+            self.assertTrue(respdata['oid'], tbspc_id)
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py
new file mode 100644
index 0000000..59a38f3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/tests/test_tbspc_put.py
@@ -0,0 +1,56 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from .test_tbspc_func import test_gettblspc
+from regression.test_utils import get_ids
+
+
+class TbspcUpdateTestCase(LoginTestCase):
+    """
+    This class will update comment field of  added tablespace under the
+    object browser's tree node.
+    """
+
+    priority = 17
+
+    scenarios = [
+        # Fetching default URL for tablespace node.
+        ('Check Tablespace Node', dict(url='/browser/tablespace/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the added tablespace."""
+
+        all_id = get_ids()
+
+        server_id = all_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        respdata = test_gettblspc(node=self)
+
+        tbspc_id = respdata['oid']
+
+        data = \
+            {
+                "description": config_data["test_lr_update_data"]
+                               ["test_comment"],
+                "id": tbspc_id
+            }
+
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(tbspc_id),
+                                       data=json.dumps(data),
+                                       follow_redirects=True)
+
+        self.assertEquals(put_response.status_code, 200)
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 28cdb94..39d4823 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class ServerGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In ServerGenerateTestCase...")
+        return 
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..74526ae 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -8,16 +8,14 @@
 # ##########################################################################
 
 import json
-
+import pickle
+import os
 from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
+from regression.config import config_data, pickle_path
 
 
 class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
+    """ This class will add the servers under default server group. """
 
     priority = 4
 
@@ -27,10 +25,31 @@ class ServersAddTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
-        """
+        """ This function will add the server under default server group."""
+
+        # Storing parent id's into pickle dict
+        pickle_id_dict = {
+            "sid": [],  #server
+            "did": [],  #database
+            "lrid": [], #login role
+            "tsid": [], #tablspace
+            "cid": [],  #cast
+            "eid": [],  #extention
+            "lid": [12397], #language
+            "scid": [],     #schema
+            "tfnid": [],    #trigger function
+            "etid": [],     #event trigger
+            "coid": [],     #collation
+            "fid": [],  #FDW
+            "doid": [], #Domain
+            "seid": [],  #Sequence
+            "tid": [],   #table
+            "vid": [],  #view
+            "mvid": [],  #mview
+            "fsid": [],  #foreign server
+            "umid": [],  #User mapping
+            "foid": []  #foreign table
+        }
 
         srv_grp = config_data['test_server_group']
 
@@ -48,6 +67,17 @@ class ServersAddTestCase(LoginTestCase):
 
             response = self.tester.post(url, data=json.dumps(data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+            respdata = json.loads(response.data.decode())
+
+            server_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                pickle_id_dict = pickle.load(exst_server_id)
+
+            pickle_id_dict["sid"].append(server_id)
+            output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, output)
+            output.close()
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..4bde3ee 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -8,16 +8,13 @@
 # ##################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerDeleteTestCase(LoginTestCase):
+    """ This class will delete the last server present under tree node."""
+
     priority = 7
 
     scenarios = [
@@ -26,32 +23,22 @@ class ServersDeleteTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
-        """
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        url = self.url + str(srv_grp) + "/"
 
-            url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        respdata = json.loads(response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        if len(respdata) == 0:
+            raise Exception("No server(s) to delete.")
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        # delete last server
+        server = respdata[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..163fef3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,15 +7,14 @@
 #
 # ##########################################################################
 
-import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
 class ServersGetTestCase(LoginTestCase):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
@@ -27,23 +26,16 @@ class ServersGetTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers present under
-        object browser.
-        """
+        """ This function will fetch the added servers to object browser. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
+        for srv in server_id:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(srv),
                                        content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..8c02a41 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -8,16 +8,13 @@
 # ##########################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerUpdateTestCase(LoginTestCase):
+    """ This class will update server's comment field. """
 
     priority = 6
 
@@ -27,39 +24,40 @@ class ServersUpdateTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
-        """
+        """ This function will update the server's comment field. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
+        response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                   str(server_id),
+                                   follow_redirects=True)
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        con_response = self.tester.post('browser/server/connect/{0}/{1}'.format
+                                        (srv_grp, server_id),
+                                        data=dict(password=config_data
+                                        ['test_server_credentials'][0]
+                                        ['test_db_password']),
+                                        follow_redirects=True)
 
-            url = self.url + str(srv_grp) + "/"
+        srv_con = json.loads(con_response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        if len(srv_con) == 0:
+            raise Exception("No Server(s) connected to update.")
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        data = \
+            {
+                "comment": config_data
+                ['test_server_update_data']['test_comment'],
+                "id": server_id
+            }
 
-            for server in respdata:
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id), data=json.dumps(data),
+                                       content_type='html/json')
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        self.assertEquals(put_response.status_code, 200)
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        respdata = json.loads(put_response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_add.py b/web/pgadmin/browser/server_groups/tests/test_sg_add.py
deleted file mode 100644
index e70bb65..0000000
--- a/web/pgadmin/browser/server_groups/tests/test_sg_add.py
+++ /dev/null
@@ -1,36 +0,0 @@
-###########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2016, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-###########################################################################
-
-import json
-
-from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
-
-
-class SgNodeTestCase(LoginTestCase):
-    """
-     This class will check available server groups in pgAdmin.
-    """
-
-    priority = 1
-
-    scenarios = [
-        # Fetching the default url for server group node
-        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
-    ]
-
-    def runTest(self):
-        """This function will check available server groups."""
-
-        i = config_data['test_server_group']
-
-        response = self.tester.get(self.url + str(i), content_type='html/json')
-        self.assertTrue(response.status_code, 200)
-        respdata = json.loads(response.data)
-        self.assertTrue(respdata['id'], i)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
new file mode 100644
index 0000000..c552d8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -0,0 +1,36 @@
+###########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
+
+import json
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.config import config_data
+
+
+class SgGetTestCase(LoginTestCase):
+    """
+     This class will check available server groups in pgAdmin.
+    """
+
+    priority = 3
+
+    scenarios = [
+        # Fetching the default url for server group node
+        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
+    ]
+
+    def runTest(self):
+        """This function will check available server groups."""
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.get(self.url + str(srv_grp),
+                                   content_type='html/json')
+        self.assertEquals(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['id'], srv_grp)
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index ca89b4c..e911903 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -77,17 +77,16 @@ class ChangePasswordTestCase(LoginTestCase):
                 config_data['pgAdmin4_login_credentials']
                 ['test_login_password']),
             respdata='You successfully changed your password.'))
-
     ]
 
     def runTest(self):
         """This function will check change password functionality."""
 
         response = self.tester.get('/change', follow_redirects=True)
-        self.assertIn('pgAdmin 4 Password Change', response.data)
+        self.assertIn('pgAdmin 4 Password Change', response.data.decode())
         response = self.tester.post('/change', data=dict(
             password=self.password,
             new_password=self.new_password,
             new_password_confirm=self.new_password_confirm),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf-8'))
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..d272a63 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,7 +8,6 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
@@ -67,7 +66,9 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
     def runTest(self):
@@ -76,4 +77,4 @@ class LoginTestCase(BaseTestGenerator):
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index 8971e72..d9611ae 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -14,14 +14,13 @@ from regression.config import config_data
 class LogoutTest(LoginTestCase):
     """
     This class verifies the logout functionality; provided the user is already
-    logged-in. Dictionary parameters define the scenario appended by test
-    name.
+    logged-in.
     """
 
-    priority = 3
+    priority = 100
 
     scenarios = [
-        # This test case validate the logout page
+        # This test case validate the logout page.
         ('Logging Out', dict(respdata='Redirecting...'))
     ]
 
@@ -29,7 +28,7 @@ class LogoutTest(LoginTestCase):
         """This function checks the logout functionality."""
 
         response = self.tester.get('/logout')
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
 
     def tearDown(self):
         """
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index a2ce1df..04c2439 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -8,10 +8,10 @@
 # ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
+
 class ResetPasswordTestCase(BaseTestGenerator):
     """
     This class validates the reset password functionality by defining
@@ -40,8 +40,8 @@ class ResetPasswordTestCase(BaseTestGenerator):
         """This function checks reset password functionality."""
 
         response = self.tester.get('/reset')
-        self.assertIn('Recover pgAdmin 4 Password', response.data)
+        self.assertIn('Recover pgAdmin 4 Password', response.data.decode())
         response = self.tester.post(
             '/reset', data=dict(email=self.email),
             follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf-8'))
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index 1ff41de..3d41e0f 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -9,6 +9,8 @@
 
 from abc import ABCMeta, abstractmethod
 import unittest
+from importlib import import_module
+from werkzeug.utils import find_modules
 
 
 class TestsGeneratorRegistry(ABCMeta):
@@ -48,18 +50,18 @@ class TestsGeneratorRegistry(ABCMeta):
 
         cls.registry = dict()
 
-        from importlib import import_module
-        from werkzeug.utils import find_modules
-
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
-
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 import six
 
 
 @six.add_metaclass(TestsGeneratorRegistry)
 class BaseTestGenerator(unittest.TestCase):
+
     # Defining abstract method which will override by individual testcase.
     @abstractmethod
     def runTest(self):
diff --git a/web/regression/config.py b/web/regression/config.py
index bdc107b..a07c072 100644
--- a/web/regression/config.py
+++ b/web/regression/config.py
@@ -13,4 +13,8 @@ import os
 root = os.path.dirname(os.path.realpath(__file__))
 
 with open(root + '/test_config.json') as data_file:
-    config_data = json.load(data_file)
\ No newline at end of file
+    config_data = json.load(data_file)
+
+pickle_path = os.path.join(root, 'parent_id.pkl')
+
+print(pickle_path)
\ No newline at end of file
diff --git a/web/regression/test_config.json b/web/regression/test_config.json
new file mode 100644
index 0000000..fc3d326
--- /dev/null
+++ b/web/regression/test_config.json
@@ -0,0 +1,910 @@
+{
+  "pgAdmin4_login_credentials":
+  {
+    "test_new_password" : "newpass",
+    "test_login_password" : "test123",
+    "test_login_username" : "[email protected]"
+  },
+
+
+  "test_server_group" : 1,
+
+  "test_server_credentials":
+  [{
+    "test_name" : "PG9.5",
+    "test_db_username" : "postgres",
+    "test_host" : "localhost",
+    "test_db_password" : "edb",
+    "test_db_port" : 5433,
+    "test_maintenance_db" : "postgres",
+    "test_sslmode" :"prefer"
+  },
+  {
+    "test_name" : "PPAS9.4",
+    "test_db_username" : "enterprisedb",
+    "test_host" : "localhost",
+    "test_db_password" : "edb",
+    "test_db_port" : 5444,
+    "test_maintenance_db" : "edb",
+    "test_sslmode" :"prefer"
+  }],
+
+  "test_server_update_data":
+  {
+      "test_comment": "This is test update comment"
+  },
+
+  "test_add_database_data": {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  },
+
+    "test_db_update_data":
+  {
+      "test_comment": "This is db update comment"
+  },
+
+    "test_lr_credentials":
+    {
+      "test_can_login": "true",
+      "test_conn_limit": -1,
+      "test_create_role": "true",
+      "test_role_inherit": "true",
+      "test_role_membership": [],
+      "test_lr_name":  "testlrg1",
+      "test_lr_password": "edb",
+      "test_lr_validity": "12/27/2016",
+      "test_sec_lable": [],
+      "test_variable":[
+        {"name":"work_mem",
+          "database":"postgres",
+          "value":65
+        }
+      ]
+    },
+
+  "test_lr_update_data":
+  {
+    "test_comment": "This is login role update comment"
+  },
+
+  "test_tablespc_credentials":
+  {
+    "test_tblspace_name": "test_tablespace",
+    "test_spc_seclable": [],
+    "test_spc_acl": [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":[
+          {
+            "privilege_type":"C",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_spc_location": "/opt/PostgreSQL/9.5/data",
+    "test_spc_opts": [],
+    "test_spc_user": "postgres"
+  },
+
+    "test_tbspc_update_data":
+  {
+    "test_comment": "This is tablespace update comment"
+  },
+
+  "test_casts_credentials":
+  {
+    "test_cast_context": "IMPLICIT",
+    "test_encoding": "UTF8",
+    "test_name": "money->bigint",
+    "test_source_type": "money",
+    "test_target_type": "bigint"
+  },
+
+     "test_cast_update_data":
+  {
+    "test_comment": "This is cast update comment"
+  },
+
+    "test_extension_credentials":
+  {
+    "test_name": "postgres_fdw",
+    "test_relocate": true,
+    "test_schema": "public",
+    "test_version": "1.0"
+  },
+
+    "test_extension_update_data":
+  {
+    "test_schema": "test_schema"
+  },
+
+      "test_language_update_data":
+  {
+    "test_comment": "This is language update comment"
+  },
+
+  "test_schema_credentials":
+  {
+    "test_func_acl": [],
+    "test_seq_acl": [],
+    "test_tbl_acl": [],
+    "test_type_acl": [],
+    "test_name": "test_schema",
+    "test_owner": "postgres",
+    "test_privilege":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"C",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_sec_label": []
+  },
+
+  "test_schema_update_data":
+  {
+  "test_tbl_acl":
+  {
+    "added":
+    [
+      {
+        "grantee": "public",
+        "grantor": "postgres",
+        "privileges":
+        [
+          {
+            "privilege_type": "D",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "x",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ]
+  },
+    "test_func_acl":
+    {
+      "added":
+      [
+        {
+          "grantee":"postgres",
+          "grantor":"postgres",
+          "privileges":
+          [
+            {
+              "privilege_type":"X",
+              "privilege":true,
+              "with_grant":true
+            }
+          ]
+        }
+      ]
+    },
+    "test_seq_acl":
+    {
+      "added":
+      [
+        {
+          "grantee":"postgres",
+          "grantor":"postgres",
+          "privileges":
+          [
+            {
+              "privilege_type":"r",
+              "privilege":true,
+              "with_grant":false
+            },
+            {
+              "privilege_type":"w",
+              "privilege":true,
+              "with_grant":false
+            },
+            {
+              "privilege_type":"U",
+              "privilege":true,
+              "with_grant":false
+            }
+          ]
+        }
+      ]
+    }
+  },
+
+  "test_trigger_function_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"X",
+            "privilege":true,
+            "with_grant":true
+          }
+        ]
+      }
+    ],
+    "test_args": [],
+    "test_fun_owner": "postgres",
+    "test_language": "plpgsql",
+    "test_name": "test_abort_any_command",
+    "test_options": [],
+    "test_probe": "$libdir/",
+    "test_leak_proof": true,
+    "test_namespace": 2200,
+    "test_type": "event_trigger",
+    "test_sec_def": true,
+    "test_code": "BEGIN   RAISE EXCEPTION 'command % is disabled', tg_tag; END;",
+    "test_volitile": "s",
+    "test_sec_label": [],
+    "test_Variable":
+    [
+      {
+        "name":"enable_sort",
+        "value":true
+      }
+    ]
+  },
+
+  "test_trigger_func_update_data":
+  {
+    "test_comment": "This is trigger function update comment"
+  },
+
+  "test_event_trigger_credentials":
+  {
+    "test_enable": "O",
+    "test_event_func": "test_schema.test_abort_any_command",
+    "test_event_name":  "DDL_COMMAND_END",
+    "test_event_owner":  "postgres",
+    "test_name": "test_event_trg",
+    "test_provider": []
+  },
+
+   "test_event_trigger_update_data":
+  {
+    "test_comment": "This is event trigger update comment"
+  },
+
+  "test_FDW_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":true
+          }
+        ]
+      }
+    ],
+
+    "test_handler": "postgres_fdw_handler",
+    "test_options": [],
+    "test_owner": "postgres",
+    "test_validator": "postgresql_fdw_validator",
+    "test_name": "test_fdw"
+  },
+
+    "test_FDW_update_data":
+  {
+    "test_comment": "This is FDW update comment"
+  },
+
+  "test_collation_credentials":
+  {
+    "test_copy_collation": "pg_catalog.\"POSIX\"",
+    "test_name": "test_collation",
+    "test_owner": "postgres",
+    "test_schema": "test_schema"
+  },
+
+   "test_collation_update_data":
+  {
+    "test_comment": "This is collation update comment"
+  },
+
+
+  "test_domain_data":
+  {
+    "test_schema": "test_schema",
+    "test_basetype": "character",
+    "test_collation": "pg_catalog.\"en_AG\"",
+    "test_constraints":
+    [
+      {
+        "conname":"num",
+        "convalidated":true
+      }
+    ],
+    "test_lenght": true,
+    "test_max_value":  2147483647,
+    "test_min_value": 1,
+    "test_name": "test_domain",
+    "test_owner": "postgres",
+    "test_security": [],
+    "test_defalt_type": "1",
+    "test_type_len": "10"
+  },
+
+  "test_domain_update_data":
+  {
+    "test_comment": "This is domain update comment"
+  },
+
+  "test_sequence_credentials":
+  {
+    "test_cache": "1",
+    "test_cycled": true,
+    "test_increment":  "1",
+    "test_max_value": "100000",
+    "test_min_value": "1",
+    "test_name": "test_empno",
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"w",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_schema_name": "test_schema",
+    "test_security":  [],
+    "test_owner":  "postgres",
+    "test_start_val": "100"
+  },
+
+    "test_sequnce_update_data":
+  {
+    "test_comment": "This is sequence update comment"
+  },
+
+  "test_table_credentials":
+  {
+    "test_constraint": [],
+    "test_col_inherit": "[]",
+    "test_columns":
+    [
+      {
+        "name":"empno",
+        "cltype":"numeric",
+        "attacl":[],
+        "is_primary_key":false,
+        "attoptions":[],
+        "seclabels":[]
+      },
+      {
+        "name":"empname",
+        "cltype":"character[]",
+        "attacl":[],
+        "is_primary_key":false,
+        "attoptions":[],
+        "seclabels":[]
+      },
+      {"name":"DOJ",
+        "cltype":"date[]",
+        "attacl":[],
+        "is_primary_key":false,
+        "attoptions":[],
+        "seclabels":[]
+      }
+    ],
+    "test_has_constraint": [],
+    "test_fillfactor": "11",
+    "test_has_FK": [],
+    "test_has_toast_tbl": true,
+    "test_like_constraint":  true,
+    "test_like_default_value": true,
+    "test_like_relation": "pg_catalog.pg_tables",
+    "test_name": "test_emp",
+    "test_PK": [],
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":true
+          },
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"w",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_has_oid": true,
+    "test_owner":  "postgres",
+    "test_schema": "test_schema",
+    "test_sec_acl":  [],
+    "test_tbscp": "pg_default",
+    "test_unique_constraint": [],
+    "test_vacuum_tbl":
+    [
+      {
+        "name":"autovacuum_analyze_scale_factor"
+      },
+      {
+        "name":"autovacuum_analyze_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ],
+
+    "test_vacuum_toast":
+    [
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ]
+
+  },
+
+    "test_table_update_data":
+  {
+    "test_comment": "This is table update comment"
+  },
+
+  "test_view_credentials":
+  {
+    "test_check_options": "local",
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":true
+          },
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_definition":  "select test_emp.empname from test_schema.test_emp;",
+    "test_name":  "test_view",
+    "test_owner": "postgres",
+    "test_schema_name": "test_schema",
+    "test_sec_label": []
+  },
+
+  "test_view_update_data":
+  {
+    "test_comment": "This is view update comment"
+  },
+
+  "test_mview_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_definition": "select test_emp.empname from test_schema.test_emp where test_emp.empno = 1;",
+    "test_fillfactor":  "11",
+    "test_name": "test_mview",
+    "test_owner": "postgres",
+    "test_schema_name": "test_schema",
+    "test_sec_label": [],
+    "test_tbscp": "pg_default",
+    "test_toast_autovacuum": true,
+    "test_toast_autovacuum_enabled": false,
+    "test_vacuum_tbl":
+    [
+      {
+        "name":"autovacuum_analyze_scale_factor"
+      },
+      {
+        "name":"autovacuum_analyze_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ],
+    "test_vacuum_toast":
+    [
+      {
+        "name":"autovacuum_freeze_max_age"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_delay"
+      },
+      {
+        "name":"autovacuum_vacuum_cost_limit"
+      },
+      {
+        "name":"autovacuum_vacuum_scale_factor"
+      },
+      {
+        "name":"autovacuum_vacuum_threshold"
+      },
+      {
+        "name":"autovacuum_freeze_min_age"
+      },
+      {
+        "name":"autovacuum_freeze_table_age"
+      }
+    ],
+
+    "test_with_data": true
+  },
+
+    "test_mview_update_data":
+  {
+    "test_comment": "This is materialized view update comment"
+  },
+
+  "test_foreign_server_credentials":
+  {
+    "test_fsr_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"U",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+
+    "test_fsr_optns":
+    [
+      {
+        "fsrvoption":"host",
+        "fsrvvalue":"localhost"
+      },
+      {
+        "fsrvoption":"port",
+        "fsrvvalue":"5433"
+      },
+      {
+        "fsrvoption":"dbname",
+        "fsrvvalue":"postgres"
+      }
+    ],
+    "test_fsr_owner": "postgres",
+    "test_name": "test_foreign_server"
+  },
+
+  "test_FRS_update_data":
+  {
+    "test_comment": "This is foreign server update comment"
+  },
+
+  "test_user_mapping_credentials":
+  {
+    "test_name": "postgres",
+    "test_option": [],
+    "test_options":
+    [
+      {
+        "umoption":"user",
+        "umvalue":"postgres"
+      },
+      {
+        "umoption":"password",
+        "umvalue":"edb"
+      }
+    ]
+  },
+
+  "test_user_mapping_update_data":
+  {
+    "test_options":
+    {
+      "changed":
+      [
+        {"umoption":"password",
+          "umvalue":"edb1"
+        }
+      ]
+    }
+  },
+
+  "test_foreign_table_credentials":
+  {
+    "test_acl":
+    [
+      {
+        "grantee":"postgres",
+        "grantor":"postgres",
+        "privileges":
+        [
+          {
+            "privilege_type":"a",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"r",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"w",
+            "privilege":true,
+            "with_grant":false
+          },
+          {
+            "privilege_type":"x",
+            "privilege":true,
+            "with_grant":false
+          }
+        ]
+      }
+    ],
+    "test_schema_name": "test_schema",
+    "test_column":
+    [
+      {
+        "attname":"enme",
+        "datatype":"text",
+        "attnotnull":true,
+        "collname":"pg_catalog.\"default\"",
+        "is_tlength":false,
+        "is_precision":false
+      }
+    ],
+    "test_constraints": [],
+    "test_options": [],
+    "test_frs_name":  "test_foreign_server",
+    "test_name": "test_ft",
+    "test_owner":  "postgres",
+    "test_rel_acl":  [],
+    "test_sec_lable": [],
+    "test_str_acl": []
+  },
+
+    "test_FT_update_data":
+  {
+    "test_comment": "This is foreign table update comment"
+  }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..9877a04
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,40 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    srv_grp = config_data['test_server_group']
+
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    con_response = node.tester.post('browser/database/connect/'
+                                    '{0}/{1}/{2}'.format
+                                    (srv_grp, server_id, db_id),
+                                    follow_redirects=True)
+
+    db_con = json.loads(con_response.data.decode())
+
+    return db_con
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..50b8310
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,20 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import pickle
+from regression.config import pickle_path
+
+
+def get_ids(url=pickle_path):
+    # This function will read parent nodes id's and return it.
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+    return ids
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 9ec7ffe..0bb2db2 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -9,10 +9,12 @@
 
 """ This file collect all modules/files present in tests directory and add
 them to TestSuite. """
-
+from __future__ import print_function
 import os
 import sys
 import unittest
+import operator
+import logging
 from testscenarios.scenarios import generate_scenarios
 
 # We need to include the root directory in sys.path to ensure that we can
@@ -45,6 +47,23 @@ TestsGeneratorRegistry.load_generators('pgadmin')
 test_client = app.test_client()
 
 
+class StreamToLogger(object):
+    """
+    Fake file-like stream object that redirects writes to a logger instance.
+    """
+    def __init__(self, logger, log_level=logging.INFO):
+        self.logger = logger
+        self.log_level = log_level
+        self.linebuf = ''
+
+    def write(self, buf):
+        for line in buf.rstrip().splitlines():
+            self.logger.log(self.log_level, line.rstrip())
+
+    def flush(self):
+        pass
+
+
 def suite():
     """ Defining test suite which will execute all the testcases present in
     tests directory according to set priority."""
@@ -58,6 +77,8 @@ def suite():
 
         modules.insert(gen.priority, gen)
 
+    modules.sort(key=operator.attrgetter('priority'))
+
     for m in modules:
         obj = m()
         obj.setTestClient(test_client)
@@ -66,7 +87,26 @@ def suite():
 
     return pgadmin_suite
 
-
 if __name__ == '__main__':
+
+    print("Please check output in file: logger.log placed at "
+          ".../pgadmin4/web/regression")
+
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w'
+                        )
+
+    stdout_logger = logging.getLogger('STDOUT')
+    sl = StreamToLogger(stdout_logger, logging.INFO)
+    sys.stdout = sl
+
+    stderr_logger = logging.getLogger('STDERR')
+    sl = StreamToLogger(stderr_logger, logging.ERROR)
+    sys.stderr = sl
+
     suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    tests = unittest.TextTestRunner(descriptions=True, verbosity=2,
+                                    stream=sys.stdout).run(suite)
+    os.remove("parent_id.pkl")


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-15 08:39       ` Dave Page <[email protected]>
  2016-06-15 08:40         ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 2 replies; 27+ messages in thread

From: Dave Page @ 2016-06-15 08:39 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi

On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
<[email protected]> wrote:
> Hi Dave,
>
> PFA updated patch. I have made changes suggested by you.
>
> Kindly, review and let me know for more changes.

OK, I got a bit further this time, but not there yet.

1) The patch overwrote my test_config.json file. That should never
happen (that file shouldn't be in the source tree).
test_config.json.in should be the file that's included in the patch.

2) The updated test_config.json file is huge. I should only need to
define one or more connections, then be able to run the tests. If you
need to keep configuration info for "advanced users", let's put it in
a different file to avoid confusing/scaring everyone else. Maybe split
it into config.json for the stuff the user needs to edit
(config.json.in would go in git), and test_config.json for the test
configuration.

3) It fails on my machine, for what looks like a coding error
initially, then a lot of issues where it can't find parent_id.pkl.
I've attached the log.

Thanks.

-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [application/octet-stream] logger.log (258.1K, 2-logger.log)
  download

^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-06-15 08:40         ` Dave Page <[email protected]>
  1 sibling, 0 replies; 27+ messages in thread

From: Dave Page @ 2016-06-15 08:40 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>; Ashesh Vashi <[email protected]>

Ashesh - can you also look at the patch please (feel free to wait for
the update). I want more eyes on this.

Thanks.

On Wed, Jun 15, 2016 at 9:39 AM, Dave Page <[email protected]> wrote:
> Hi
>
> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> <[email protected]> wrote:
>> Hi Dave,
>>
>> PFA updated patch. I have made changes suggested by you.
>>
>> Kindly, review and let me know for more changes.
>
> OK, I got a bit further this time, but not there yet.
>
> 1) The patch overwrote my test_config.json file. That should never
> happen (that file shouldn't be in the source tree).
> test_config.json.in should be the file that's included in the patch.
>
> 2) The updated test_config.json file is huge. I should only need to
> define one or more connections, then be able to run the tests. If you
> need to keep configuration info for "advanced users", let's put it in
> a different file to avoid confusing/scaring everyone else. Maybe split
> it into config.json for the stuff the user needs to edit
> (config.json.in would go in git), and test_config.json for the test
> configuration.
>
> 3) It fails on my machine, for what looks like a coding error
> initially, then a lot of issues where it can't find parent_id.pkl.
> I've attached the log.
>
> Thanks.
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company



-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers



^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-06-15 09:35         ` Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  1 sibling, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-15 09:35 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Thanks a lot Dave.

On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:

> Hi
>
> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> <[email protected]> wrote:
> > Hi Dave,
> >
> > PFA updated patch. I have made changes suggested by you.
> >
> > Kindly, review and let me know for more changes.
>
> OK, I got a bit further this time, but not there yet.
>
> 1) The patch overwrote my test_config.json file. That should never
> happen (that file shouldn't be in the source tree).
> test_config.json.in should be the file that's included in the patch.
>

OK.

>
> 2) The updated test_config.json file is huge. I should only need to
> define one or more connections, then be able to run the tests. If you
> need to keep configuration info for "advanced users", let's put it in
> a different file to avoid confusing/scaring everyone else. Maybe split
> it into config.json for the stuff the user needs to edit
> (config.json.in would go in git), and test_config.json for the test
> configuration.
>

Sure, i'll do that.

>
> 3) It fails on my machine, for what looks like a coding error
> initially, then a lot of issues where it can't find parent_id.pkl.
> I've attached the log.
>

I'll check and send you  an updated patch.

>
> Thanks.
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-23 13:41           ` Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-23 13:41 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

On 15 June 2016 at 15:05, Priyanka Shendge <
[email protected]> wrote:

> Thanks a lot Dave.
>
> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>
>> Hi
>>
>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> <[email protected]> wrote:
>> > Hi Dave,
>> >
>> > PFA updated patch. I have made changes suggested by you.
>> >
>> > Kindly, review and let me know for more changes.
>>
>> OK, I got a bit further this time, but not there yet.
>>
>> 1) The patch overwrote my test_config.json file. That should never
>> happen (that file shouldn't be in the source tree).
>> test_config.json.in should be the file that's included in the patch.
>>
>
> OK.
>
>>
>> 2) The updated test_config.json file is huge.
>
>
Current configuration file web/regression/test_config.json contains test
data(credentials) for each tree node;
which is used while adding and updating the respective node.


> I should only need to
>> define one or more connections, then be able to run the tests. If you
>> need to keep configuration info for "advanced users", let's put it in
>> a different file to avoid confusing/scaring everyone else. Maybe split
>> it into config.json for the stuff the user needs to edit
>> (config.json.in would go in git), and test_config.json for the test
>> configuration.
>
>
Should i keep login and server credentials into
 web/regression/test_config.json file and
put respective node details into config.json file of respective node's
tests directory?

e.g. for database node:
I'll create config.json file into .../databases/tests/ directory
put database add and update credentials into config.json

>
>> Thanks.
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-24 10:47             ` Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-06-24 10:47 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi

On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
<[email protected]> wrote:
>
>
> On 15 June 2016 at 15:05, Priyanka Shendge
> <[email protected]> wrote:
>>
>> Thanks a lot Dave.
>>
>> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>>>
>>> Hi
>>>
>>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>>> <[email protected]> wrote:
>>> > Hi Dave,
>>> >
>>> > PFA updated patch. I have made changes suggested by you.
>>> >
>>> > Kindly, review and let me know for more changes.
>>>
>>> OK, I got a bit further this time, but not there yet.
>>>
>>> 1) The patch overwrote my test_config.json file. That should never
>>> happen (that file shouldn't be in the source tree).
>>> test_config.json.in should be the file that's included in the patch.
>>
>>
>> OK.
>>>
>>>
>>> 2) The updated test_config.json file is huge.
>
>
> Current configuration file web/regression/test_config.json contains test
> data(credentials) for each tree node;
> which is used while adding and updating the respective node.

Why would we need that? We should have just one set of credentials for
everything.

>>>
>>> I should only need to
>>> define one or more connections, then be able to run the tests. If you
>>> need to keep configuration info for "advanced users", let's put it in
>>> a different file to avoid confusing/scaring everyone else. Maybe split
>>> it into config.json for the stuff the user needs to edit
>>> (config.json.in would go in git), and test_config.json for the test
>>> configuration.
>
>
> Should i keep login and server credentials into
> web/regression/test_config.json file and
> put respective node details into config.json file of respective node's tests
> directory?

Not if you expect users to need to edit them - and if not, why are the
values not just hard-coded?

> e.g. for database node:
> I'll create config.json file into .../databases/tests/ directory
> put database add and update credentials into config.json

The key here is to make it simple for users.

- To run the default tests, they should be able to copy/edit a simple
file, and just add database server details for the server to run
against.

- If we have configurable tests (because making them configurable adds
genuine value), then we can use an "advanced" config file to allow the
user to adjust settings as they want.

In the simple case, the user should be able to run the tests
successfully within a minute or two from starting.

In designing the layout for files etc, remember the following:

- Users should never edit a file that is in our source control. That's
why we have .in files that we expect them to copy.

- Unless they're an advanced user, they shouldn't need to copy the
config file for advanced options. That means that the tests should
have defaults that match what is in the template advanced config file
(or, the tests could read advanced.json.in if advanced.json doesn't
exist, though that does seem a little icky). Of course, those are
example filenames, not necessarily what you may choose.

-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers



^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-06-26 11:05               ` Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-26 11:05 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:

> Hi
>
> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
> <[email protected]> wrote:
> >
> >
> > On 15 June 2016 at 15:05, Priyanka Shendge
> > <[email protected]> wrote:
> >>
> >> Thanks a lot Dave.
> >>
> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
> >>>
> >>> Hi
> >>>
> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> >>> <[email protected]> wrote:
> >>> > Hi Dave,
> >>> >
> >>> > PFA updated patch. I have made changes suggested by you.
> >>> >
> >>> > Kindly, review and let me know for more changes.
> >>>
> >>> OK, I got a bit further this time, but not there yet.
> >>>
> >>> 1) The patch overwrote my test_config.json file. That should never
> >>> happen (that file shouldn't be in the source tree).
> >>> test_config.json.in should be the file that's included in the patch.
> >>
> >>
> >> OK.
> >>>
> >>>
> >>> 2) The updated test_config.json file is huge.
> >
> >
> > Current configuration file web/regression/test_config.json contains test
> > data(credentials) for each tree node;
> > which is used while adding and updating the respective node.
>
> Why would we need that?


Each node file (e.g. test_db_add.py and test_db_put.py) uses respective
credentials  from
test_config.json while execution.

We should have just one set of credentials for
> everything.
>

Let me know if my understanding is clear:

Should i keep basic credentials of each node (database, schema) into
test_config.json
instead  taking care of each field?

>
> >>>
> >>> I should only need to
> >>> define one or more connections, then be able to run the tests. If you
> >>> need to keep configuration info for "advanced users", let's put it in
> >>> a different file to avoid confusing/scaring everyone else. Maybe split
> >>> it into config.json for the stuff the user needs to edit
> >>> (config.json.in would go in git), and test_config.json for the test
> >>> configuration.
> >
> >
> > Should i keep login and server credentials into
> > web/regression/test_config.json file and
> > put respective node details into config.json file of respective node's
> tests
> > directory?
>
> Not if you expect users to need to edit them - and if not, why are the
> values not just hard-coded?
>
> > e.g. for database node:
> > I'll create config.json file into .../databases/tests/ directory
> > put database add and update credentials into config.json
>
> The key here is to make it simple for users.
>
> - To run the default tests, they should be able to copy/edit a simple
> file, and just add database server details for the server to run
> against.
>
> - If we have configurable tests (because making them configurable adds
> genuine value), then we can use an "advanced" config file to allow the
> user to adjust settings as they want.
>
> In the simple case, the user should be able to run the tests
> successfully within a minute or two from starting.
>
> In designing the layout for files etc, remember the following:
>
> - Users should never edit a file that is in our source control. That's
> why we have .in files that we expect them to copy.
>
> - Unless they're an advanced user, they shouldn't need to copy the
> config file for advanced options. That means that the tests should
> have defaults that match what is in the template advanced config file
> (or, the tests could read advanced.json.in if advanced.json doesn't
> exist, though that does seem a little icky). Of course, those are
> example filenames, not necessarily what you may choose.
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-27 07:54                 ` Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-06-27 07:54 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
<[email protected]> wrote:
>
>
> On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
>>
>> Hi
>>
>> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>> <[email protected]> wrote:
>> >
>> >
>> > On 15 June 2016 at 15:05, Priyanka Shendge
>> > <[email protected]> wrote:
>> >>
>> >> Thanks a lot Dave.
>> >>
>> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>> >>>
>> >>> Hi
>> >>>
>> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> >>> <[email protected]> wrote:
>> >>> > Hi Dave,
>> >>> >
>> >>> > PFA updated patch. I have made changes suggested by you.
>> >>> >
>> >>> > Kindly, review and let me know for more changes.
>> >>>
>> >>> OK, I got a bit further this time, but not there yet.
>> >>>
>> >>> 1) The patch overwrote my test_config.json file. That should never
>> >>> happen (that file shouldn't be in the source tree).
>> >>> test_config.json.in should be the file that's included in the patch.
>> >>
>> >>
>> >> OK.
>> >>>
>> >>>
>> >>> 2) The updated test_config.json file is huge.
>> >
>> >
>> > Current configuration file web/regression/test_config.json contains test
>> > data(credentials) for each tree node;
>> > which is used while adding and updating the respective node.
>>
>> Why would we need that?
>
>
> Each node file (e.g. test_db_add.py and test_db_put.py) uses respective
> credentials  from
> test_config.json while execution.

That doesn't answer my question - why do we need separate credentials
for each node?

>> We should have just one set of credentials for
>> everything.
>
>
> Let me know if my understanding is clear:
>
> Should i keep basic credentials of each node (database, schema) into
> test_config.json
> instead  taking care of each field?

You should have one set of credentials that's used for the entire test run.

>> >>> I should only need to
>> >>> define one or more connections, then be able to run the tests. If you
>> >>> need to keep configuration info for "advanced users", let's put it in
>> >>> a different file to avoid confusing/scaring everyone else. Maybe split
>> >>> it into config.json for the stuff the user needs to edit
>> >>> (config.json.in would go in git), and test_config.json for the test
>> >>> configuration.
>> >
>> >
>> > Should i keep login and server credentials into
>> > web/regression/test_config.json file and
>> > put respective node details into config.json file of respective node's
>> > tests
>> > directory?
>>
>> Not if you expect users to need to edit them - and if not, why are the
>> values not just hard-coded?
>>
>> > e.g. for database node:
>> > I'll create config.json file into .../databases/tests/ directory
>> > put database add and update credentials into config.json
>>
>> The key here is to make it simple for users.
>>
>> - To run the default tests, they should be able to copy/edit a simple
>> file, and just add database server details for the server to run
>> against.
>>
>> - If we have configurable tests (because making them configurable adds
>> genuine value), then we can use an "advanced" config file to allow the
>> user to adjust settings as they want.
>>
>> In the simple case, the user should be able to run the tests
>> successfully within a minute or two from starting.
>>
>> In designing the layout for files etc, remember the following:
>>
>> - Users should never edit a file that is in our source control. That's
>> why we have .in files that we expect them to copy.
>>
>> - Unless they're an advanced user, they shouldn't need to copy the
>> config file for advanced options. That means that the tests should
>> have defaults that match what is in the template advanced config file
>> (or, the tests could read advanced.json.in if advanced.json doesn't
>> exist, though that does seem a little icky). Of course, those are
>> example filenames, not necessarily what you may choose.
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company



-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers



^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-06-27 09:40                   ` Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-27 09:40 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:

> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
> <[email protected]> wrote:
> >
> >
> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
> >>
> >> Hi
> >>
> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
> >> <[email protected]> wrote:
> >> >
> >> >
> >> > On 15 June 2016 at 15:05, Priyanka Shendge
> >> > <[email protected]> wrote:
> >> >>
> >> >> Thanks a lot Dave.
> >> >>
> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
> >> >>>
> >> >>> Hi
> >> >>>
> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> >> >>> <[email protected]> wrote:
> >> >>> > Hi Dave,
> >> >>> >
> >> >>> > PFA updated patch. I have made changes suggested by you.
> >> >>> >
> >> >>> > Kindly, review and let me know for more changes.
> >> >>>
> >> >>> OK, I got a bit further this time, but not there yet.
> >> >>>
> >> >>> 1) The patch overwrote my test_config.json file. That should never
> >> >>> happen (that file shouldn't be in the source tree).
> >> >>> test_config.json.in should be the file that's included in the
> patch.
> >> >>
> >> >>
> >> >> OK.
> >> >>>
> >> >>>
> >> >>> 2) The updated test_config.json file is huge.
> >> >
> >> >
> >> > Current configuration file web/regression/test_config.json contains
> test
> >> > data(credentials) for each tree node;
> >> > which is used while adding and updating the respective node.
> >>
> >> Why would we need that?
> >
> >
> > Each node file (e.g. test_db_add.py and test_db_put.py) uses respective
> > credentials test data  from
> > test_config.json while execution.
>
> That doesn't answer my question - why do we need separate credentials
> for each node?
>

Sorry for typo, its test data not credentials.


>
> >> We should have just one set of credentials for
> >> everything.
> >
> >
> > Let me know if my understanding is clear:
> >
> > Should i keep basic credentials of each node (database, schema) into
> > test_config.json
> > instead  taking care of each field?
>
> You should have one set of credentials that's used for the entire test run.
>

Sure.  I'll separate the credentials and test data into 2 different files.
So, a normal user can run the tests into one go after some minor
credentials changes.
And an advanced user can have an option to change the test data if he wants.

>
> >> >>> I should only need to
> >> >>> define one or more connections, then be able to run the tests. If
> you
> >> >>> need to keep configuration info for "advanced users", let's put it
> in
> >> >>> a different file to avoid confusing/scaring everyone else. Maybe
> split
> >> >>> it into config.json for the stuff the user needs to edit
> >> >>> (config.json.in would go in git), and test_config.json for the test
> >> >>> configuration.
> >> >
> >> >
> >> > Should i keep login and server credentials into
> >> > web/regression/test_config.json file and
> >> > put respective node details into config.json file of respective node's
> >> > tests
> >> > directory?
> >>
> >> Not if you expect users to need to edit them - and if not, why are the
> >> values not just hard-coded?
> >>
> >> > e.g. for database node:
> >> > I'll create config.json file into .../databases/tests/ directory
> >> > put database add and update credentials into config.json
> >>
> >> The key here is to make it simple for users.
> >>
> >> - To run the default tests, they should be able to copy/edit a simple
> >> file, and just add database server details for the server to run
> >> against.
> >>
> >> - If we have configurable tests (because making them configurable adds
> >> genuine value), then we can use an "advanced" config file to allow the
> >> user to adjust settings as they want.
> >>
> >> In the simple case, the user should be able to run the tests
> >> successfully within a minute or two from starting.
> >>
> >> In designing the layout for files etc, remember the following:
> >>
> >> - Users should never edit a file that is in our source control. That's
> >> why we have .in files that we expect them to copy.
> >>
> >> - Unless they're an advanced user, they shouldn't need to copy the
> >> config file for advanced options. That means that the tests should
> >> have defaults that match what is in the template advanced config file
> >> (or, the tests could read advanced.json.in if advanced.json doesn't
> >> exist, though that does seem a little icky). Of course, those are
> >> example filenames, not necessarily what you may choose.
> >>
> >> --
> >> Dave Page
> >> Blog: http://pgsnake.blogspot.com
> >> Twitter: @pgsnake
> >>
> >> EnterpriseDB UK: http://www.enterprisedb.com
> >> The Enterprise PostgreSQL Company
> >
> >
> >
> >
> > --
> > Best,
> > Priyanka
> >
> > EnterpriseDB Corporation
> > The Enterprise PostgreSQL Company
>
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
>
> --
> Sent via pgadmin-hackers mailing list ([email protected])
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgadmin-hackers
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-29 13:52                     ` Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-06-29 13:52 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi Dave,

As per discussion over mail i have created separate config files for
credentials
and test data.

PFA patch for same. Kindly, review and let me know for modifications.

On 27 June 2016 at 15:10, Priyanka Shendge <
[email protected]> wrote:

>
>
> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
>
>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>> <[email protected]> wrote:
>> >
>> >
>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
>> >>
>> >> Hi
>> >>
>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>> >> <[email protected]> wrote:
>> >> >
>> >> >
>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>> >> > <[email protected]> wrote:
>> >> >>
>> >> >> Thanks a lot Dave.
>> >> >>
>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>> >> >>>
>> >> >>> Hi
>> >> >>>
>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> >> >>> <[email protected]> wrote:
>> >> >>> > Hi Dave,
>> >> >>> >
>> >> >>> > PFA updated patch. I have made changes suggested by you.
>> >> >>> >
>> >> >>> > Kindly, review and let me know for more changes.
>> >> >>>
>> >> >>> OK, I got a bit further this time, but not there yet.
>> >> >>>
>> >> >>> 1) The patch overwrote my test_config.json file. That should never
>> >> >>> happen (that file shouldn't be in the source tree).
>> >> >>> test_config.json.in should be the file that's included in the
>> patch.
>> >> >>
>> >> >>
>> >> >> OK.
>> >> >>>
>> >> >>>
>> >> >>> 2) The updated test_config.json file is huge.
>> >> >
>> >> >
>> >> > Current configuration file web/regression/test_config.json contains
>> test
>> >> > data(credentials) for each tree node;
>> >> > which is used while adding and updating the respective node.
>> >>
>> >> Why would we need that?
>> >
>> >
>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses respective
>> > credentials test data  from
>> > test_config.json while execution.
>>
>> That doesn't answer my question - why do we need separate credentials
>> for each node?
>>
>
> Sorry for typo, its test data not credentials.
>
>
>>
>> >> We should have just one set of credentials for
>> >> everything.
>> >
>> >
>> > Let me know if my understanding is clear:
>> >
>> > Should i keep basic credentials of each node (database, schema) into
>> > test_config.json
>> > instead  taking care of each field?
>>
>> You should have one set of credentials that's used for the entire test
>> run.
>>
>
> Sure.  I'll separate the credentials and test data into 2 different files.
> So, a normal user can run the tests into one go after some minor
> credentials changes.
> And an advanced user can have an option to change the test data if he
> wants.
>
>>
>> >> >>> I should only need to
>> >> >>> define one or more connections, then be able to run the tests. If
>> you
>> >> >>> need to keep configuration info for "advanced users", let's put it
>> in
>> >> >>> a different file to avoid confusing/scaring everyone else. Maybe
>> split
>> >> >>> it into config.json for the stuff the user needs to edit
>> >> >>> (config.json.in would go in git), and test_config.json for the
>> test
>> >> >>> configuration.
>> >> >
>> >> >
>> >> > Should i keep login and server credentials into
>> >> > web/regression/test_config.json file and
>> >> > put respective node details into config.json file of respective
>> node's
>> >> > tests
>> >> > directory?
>> >>
>> >> Not if you expect users to need to edit them - and if not, why are the
>> >> values not just hard-coded?
>> >>
>> >> > e.g. for database node:
>> >> > I'll create config.json file into .../databases/tests/ directory
>> >> > put database add and update credentials into config.json
>> >>
>> >> The key here is to make it simple for users.
>> >>
>> >> - To run the default tests, they should be able to copy/edit a simple
>> >> file, and just add database server details for the server to run
>> >> against.
>> >>
>> >> - If we have configurable tests (because making them configurable adds
>> >> genuine value), then we can use an "advanced" config file to allow the
>> >> user to adjust settings as they want.
>> >>
>> >> In the simple case, the user should be able to run the tests
>> >> successfully within a minute or two from starting.
>> >>
>> >> In designing the layout for files etc, remember the following:
>> >>
>> >> - Users should never edit a file that is in our source control. That's
>> >> why we have .in files that we expect them to copy.
>> >>
>> >> - Unless they're an advanced user, they shouldn't need to copy the
>> >> config file for advanced options. That means that the tests should
>> >> have defaults that match what is in the template advanced config file
>> >> (or, the tests could read advanced.json.in if advanced.json doesn't
>> >> exist, though that does seem a little icky). Of course, those are
>> >> example filenames, not necessarily what you may choose.
>> >>
>> >> --
>> >> Dave Page
>> >> Blog: http://pgsnake.blogspot.com
>> >> Twitter: @pgsnake
>> >>
>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >> The Enterprise PostgreSQL Company
>> >
>> >
>> >
>> >
>> > --
>> > Best,
>> > Priyanka
>> >
>> > EnterpriseDB Corporation
>> > The Enterprise PostgreSQL Company
>>
>>
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>>
>>
>> --
>> Sent via pgadmin-hackers mailing list ([email protected])
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgadmin-hackers
>>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [application/octet-stream] pgadmin4_config_revised.patch (40.0K, 3-pgadmin4_config_revised.patch)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..60ed4c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,16 @@
+# ##########################################################################
+#
+# #pgAdmin 4 - PostgreSQL Tools
+#
+# #Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# #This software is released under the PostgreSQL Licence
+#
+# ##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DatabaseGenerateTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..4278383
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,101 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, advance_config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import uuid
+import os
+from regression.test_utils import get_ids
+
+
+class DatabaseAddTestCase(LoginTestCase):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+    priority = 7
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        self.assertEquals(response.status_code, 200)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                     "datacl": advance_config_data['test_add_database_data'][0]
+                     ['test_privileges_acl'],
+                     "datconnlimit": advance_config_data
+                     ['test_add_database_data'][0]['test_conn_limit'],
+                     "datowner": advance_config_data
+                     ['test_add_database_data'][0]['test_owner'],
+                     "deffuncacl": advance_config_data
+                     ['test_add_database_data'][0]['test_fun_acl'],
+                     "defseqacl": advance_config_data
+                     ['test_add_database_data'][0]['test_seq_acl'],
+                     "deftblacl": advance_config_data
+                     ['test_add_database_data'][0]['test_tbl_acl'],
+                     "deftypeacl": advance_config_data
+                     ['test_add_database_data'][0]['test_type_acl'],
+                     "encoding": advance_config_data
+                     ['test_add_database_data'][0]['test_encoding'],
+                     "name": str(uuid.uuid4())[1:8],
+                     "privileges": advance_config_data
+                     ['test_add_database_data'][0]['test_privileges'],
+                     "securities": advance_config_data
+                     ['test_add_database_data'][0]['test_securities'],
+                     "variables": advance_config_data
+                     ['test_add_database_data'][0]['test_variables']
+                    }
+
+            db_response = self.tester.post(self.url + str(srv_grp) + "/" +
+                                           server_id + "/",
+                                           data=json.dumps(data),
+                                           content_type='html/json')
+
+            self.assertTrue(db_response.status_code, 200)
+
+            respdata = json.loads(db_response.data.decode())
+
+            db_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+
+                exst_server_id = open(pickle_path, 'rb')
+
+                tol_server_id = pickle.load(exst_server_id)
+                pickle_id_dict = tol_server_id
+
+                pickle_id_dict["did"].append(db_id)
+
+                db_output = open(pickle_path, 'wb')
+                pickle.dump(pickle_id_dict, db_output)
+                db_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
new file mode 100644
index 0000000..ca8ed9b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -0,0 +1,45 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabaseDeleteTestCase(LoginTestCase):
+    """ This class will delete the database under last added server. """
+
+    priority = 98
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if len(db_con) == 0:
+            raise Exception("No database(s) to delete.")
+
+        response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                      str(server_id) + '/' + str(db_id),
+                                      follow_redirects=True)
+
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..e931985
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,43 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(LoginTestCase):
+    """
+    This class will fetch added database under server node.
+    """
+    priority = 8
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..ad83603
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,51 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data,  advance_config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class DatabasesUpdateTestCase(LoginTestCase):
+    """
+    This class will update the database under last added server.
+    """
+    priority = 9
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = {
+                "comments": advance_config_data["test_db_update_data"][0]
+                ["test_comment"],
+                "id": db_id
+                   }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 28cdb94..4fd2066 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class ServerGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In ServerGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..7499b85 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -8,16 +8,14 @@
 # ##########################################################################
 
 import json
-
+import pickle
+import os
 from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
+from regression.config import config_data, pickle_path
 
 
 class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
+    """ This class will add the servers under default server group. """
 
     priority = 4
 
@@ -27,14 +25,19 @@ class ServersAddTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
-        """
+        """ This function will add the server under default server group."""
+
+        # Storing parent id's into pickle dict
+        pickle_id_dict = \
+            {
+                "sid": [],  # server
+                "did": []   # database
+            }
 
         srv_grp = config_data['test_server_group']
 
         for srv in config_data['test_server_credentials']:
+
             data = {"name": srv['test_name'],
                     "comment": "",
                     "host": srv['test_host'],
@@ -44,10 +47,20 @@ class ServersAddTestCase(LoginTestCase):
                     "role": "",
                     "sslmode": srv['test_sslmode']}
 
-            url = self.url + str(srv_grp) + "/"
-
-            response = self.tester.post(url, data=json.dumps(data),
+            response = self.tester.post(self.url + str(srv_grp) + "/",
+                                        data=json.dumps(data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+            respdata = json.loads(response.data.decode())
+
+            server_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                pickle_id_dict = pickle.load(exst_server_id)
+
+            pickle_id_dict["sid"].append(server_id)
+            output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, output)
+            output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..997308e 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -8,17 +8,14 @@
 # ##################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
-    priority = 7
+class ServerDeleteTestCase(LoginTestCase):
+    """ This class will delete the last server present under tree node."""
+
+    priority = 99
 
     scenarios = [
         # Fetching the default url for server node
@@ -26,32 +23,22 @@ class ServersDeleteTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
-        """
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        url = self.url + str(srv_grp) + "/"
 
-            url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        respdata = json.loads(response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        if len(respdata) == 0:
+            raise Exception("No server(s) to delete.")
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        # delete last server
+        server = respdata[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..163fef3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,15 +7,14 @@
 #
 # ##########################################################################
 
-import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
 class ServersGetTestCase(LoginTestCase):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
@@ -27,23 +26,16 @@ class ServersGetTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers present under
-        object browser.
-        """
+        """ This function will fetch the added servers to object browser. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
+        for srv in server_id:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(srv),
                                        content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..f8cef24 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -8,16 +8,13 @@
 # ##########################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerUpdateTestCase(LoginTestCase):
+    """ This class will update server's comment field. """
 
     priority = 6
 
@@ -27,39 +24,41 @@ class ServersUpdateTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
-        """
+        """ This function will update the server's comment field. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
+        response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                   str(server_id),
+                                   follow_redirects=True)
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        con_response = self.tester.post('browser/server/connect/{0}/{1}'.format
+                                        (srv_grp, server_id),
+                                        data=dict(password=
+                                                  config_data
+                                                  ['test_server_credentials'][0]
+                                                  ['test_db_password']),
+                                        follow_redirects=True)
 
-            url = self.url + str(srv_grp) + "/"
+        srv_con = json.loads(con_response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        if len(srv_con) == 0:
+            raise Exception("No Server(s) connected to update.")
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        data = \
+            {
+                "comment": config_data
+                ['test_server_update_data']['test_comment'],
+                "id": server_id
+            }
 
-            for server in respdata:
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id), data=json.dumps(data),
+                                       content_type='html/json')
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        self.assertEquals(put_response.status_code, 200)
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        respdata = json.loads(put_response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_add.py b/web/pgadmin/browser/server_groups/tests/test_sg_add.py
deleted file mode 100644
index e70bb65..0000000
--- a/web/pgadmin/browser/server_groups/tests/test_sg_add.py
+++ /dev/null
@@ -1,36 +0,0 @@
-###########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2016, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-###########################################################################
-
-import json
-
-from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
-
-
-class SgNodeTestCase(LoginTestCase):
-    """
-     This class will check available server groups in pgAdmin.
-    """
-
-    priority = 1
-
-    scenarios = [
-        # Fetching the default url for server group node
-        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
-    ]
-
-    def runTest(self):
-        """This function will check available server groups."""
-
-        i = config_data['test_server_group']
-
-        response = self.tester.get(self.url + str(i), content_type='html/json')
-        self.assertTrue(response.status_code, 200)
-        respdata = json.loads(response.data)
-        self.assertTrue(respdata['id'], i)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
new file mode 100644
index 0000000..c552d8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -0,0 +1,36 @@
+###########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
+
+import json
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.config import config_data
+
+
+class SgGetTestCase(LoginTestCase):
+    """
+     This class will check available server groups in pgAdmin.
+    """
+
+    priority = 3
+
+    scenarios = [
+        # Fetching the default url for server group node
+        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
+    ]
+
+    def runTest(self):
+        """This function will check available server groups."""
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.get(self.url + str(srv_grp),
+                                   content_type='html/json')
+        self.assertEquals(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['id'], srv_grp)
diff --git a/web/pgadmin/browser/tests/__init__.py b/web/pgadmin/browser/tests/__init__.py
index 2381efd..4470711 100644
--- a/web/pgadmin/browser/tests/__init__.py
+++ b/web/pgadmin/browser/tests/__init__.py
@@ -11,5 +11,6 @@ from pgadmin.utils.route import BaseTestGenerator
 
 
 class BrowserGenerateTestCase(BaseTestGenerator):
+
     def runTest(self):
-        print ("In BrowserGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index dedb7d9..5c4930d 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -85,10 +85,10 @@ class ChangePasswordTestCase(LoginTestCase):
         """This function will check change password functionality."""
 
         response = self.tester.get('/change', follow_redirects=True)
-        self.assertIn('pgAdmin 4 Password Change', response.data)
+        self.assertIn('pgAdmin 4 Password Change', response.data.decode('utf8'))
         response = self.tester.post('/change', data=dict(
             password=self.password,
             new_password=self.new_password,
             new_password_confirm=self.new_password_confirm),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..d272a63 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,7 +8,6 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
@@ -67,7 +66,9 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
     def runTest(self):
@@ -76,4 +77,4 @@ class LoginTestCase(BaseTestGenerator):
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index 8971e72..d9611ae 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -14,14 +14,13 @@ from regression.config import config_data
 class LogoutTest(LoginTestCase):
     """
     This class verifies the logout functionality; provided the user is already
-    logged-in. Dictionary parameters define the scenario appended by test
-    name.
+    logged-in.
     """
 
-    priority = 3
+    priority = 100
 
     scenarios = [
-        # This test case validate the logout page
+        # This test case validate the logout page.
         ('Logging Out', dict(respdata='Redirecting...'))
     ]
 
@@ -29,7 +28,7 @@ class LogoutTest(LoginTestCase):
         """This function checks the logout functionality."""
 
         response = self.tester.get('/logout')
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
 
     def tearDown(self):
         """
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index 030b182..31a3992 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -41,8 +41,9 @@ class ResetPasswordTestCase(BaseTestGenerator):
         """This function checks reset password functionality."""
 
         response = self.tester.get('/reset')
-        self.assertIn('Recover pgAdmin 4 Password', response.data)
+        self.assertIn('Recover pgAdmin 4 Password',
+                      response.data.decode('utf8'))
         response = self.tester.post(
             '/reset', data=dict(email=self.email),
             follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index fb9de69..e439965 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -52,7 +52,10 @@ class TestsGeneratorRegistry(ABCMeta):
         from werkzeug.utils import find_modules
 
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 
 import six
diff --git a/web/regression/README b/web/regression/README
index e0003e4..44eedfb 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -40,23 +40,27 @@ General Information
     3. test_server_get.py
     4. test_server_update.py
 
-2) The pgAdmin4 source tree includes a file template for the server configuration
-   named ‘test_config.json.in' in the ‘pgAdmin4/web/regression’ directory. After
-   completing the pgAdmin4 configuration, you must make a working copy of the
-   template called test_config.json before modifying the file contents.
+2) The pgAdmin4 source tree includes 2 different configuration file templates.
+   One file template for the server configuration
+   named ‘test_config.json.in' and another for test configuration named
+   'test_advance_config.json.in' in the ‘pgAdmin4/web/regression’ directory.
+   After completing the pgAdmin4 configuration, you must make a working copy of
+   the templates called test_config.json and test_advance_config.json
+   before modifying the file contents.
 
 	2a) The following command copies the test_config.json.in file, creating a
-	    configuration file named test_config.json
+	    configuration file named test_config.json (same way user can copy
+	    test_advance_config.json.in file into test_advance_config.json)
 
             # cp pgadmin4/web/regression/test_config.json.in \
               pgadmin4/web/regression/test_config.json
 
-	2b) After creating the server configuration file, add (or modify)
+	2b) After creating the server and test configuration file, add (or modify)
 	    parameter values as per requirements. The configuration
 	    files are owned by root/user. The pgAdmin4 regression framework expects
 	    to find the files in the  directory '/<installation dir>/web/regression/'.
-	    If you move the file to another location, you must create a symbolic link
-	    that specifies the new location.
+	    If you move the file to another location, you must create a symbolic
+	    link that specifies the new location.
 
 	2c) Specifying Server Configuration file:
 
@@ -64,6 +68,13 @@ General Information
 	    server details and connection properties as per their local setup. The
 	    test_config file is in json format and property values are case-sensitive.
 
+	2d) Specifying the Test Configuration file:
+
+	    The user can add/change test data as per their need. The
+	    test_advance_config file is in json format and property values are
+	    case-sensitive.
+
+
 Test Data Details
 -----------------
 
diff --git a/web/regression/config.py b/web/regression/config.py
index bef65fb..f48eade 100644
--- a/web/regression/config.py
+++ b/web/regression/config.py
@@ -14,3 +14,8 @@ root = os.path.dirname(os.path.realpath(__file__))
 
 with open(root + '/test_config.json') as data_file:
     config_data = json.load(data_file)
+
+with open(root + '/test_advance_config.json') as data_file:
+    advance_config_data = json.load(data_file)
+
+pickle_path = os.path.join(root, 'parent_id.pkl')
diff --git a/web/regression/test_advance_config.json.in b/web/regression/test_advance_config.json.in
new file mode 100644
index 0000000..3729bcb
--- /dev/null
+++ b/web/regression/test_advance_config.json.in
@@ -0,0 +1,105 @@
+{
+  "test_add_database_data": [
+   {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  }
+ ],
+
+  "test_db_update_data": [
+  {
+      "test_comment": "This is db update comment"
+  }
+ ]
+
+}
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..b3fd5ef
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,42 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    srv_grp = config_data['test_server_group']
+
+    # Connect to server
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    # Connect to database
+    con_response = node.tester.post('browser/database/connect/'
+                                    '{0}/{1}/{2}'.format
+                                    (srv_grp, server_id, db_id),
+                                    follow_redirects=True)
+
+    db_con = json.loads(con_response.data.decode())
+
+    return db_con
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..c68744f
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,20 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import pickle
+from regression.config import pickle_path
+
+
+def get_ids(url=pickle_path):
+    # This function will read parent nodes id's from pickle and return it.
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+    return ids
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 6e6fb0c..45069b2 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -13,7 +13,8 @@ them to TestSuite. """
 import os
 import sys
 import unittest
-
+import operator
+import logging
 from testscenarios.scenarios import generate_scenarios
 
 # We need to include the root directory in sys.path to ensure that we can
@@ -45,6 +46,22 @@ TestsGeneratorRegistry.load_generators('pgadmin')
 # application. We can trigger test request to the application.
 test_client = app.test_client()
 
+class StreamToLogger(object):
+    """
+    Fake file-like stream object that redirects writes to a logger instance.
+    """
+    def __init__(self, logger, log_level=logging.INFO):
+        self.logger = logger
+        self.log_level = log_level
+        self.linebuf = ''
+
+    def write(self, buf):
+        for line in buf.rstrip().splitlines():
+            self.logger.log(self.log_level, line.rstrip())
+
+    def flush(self):
+        pass
+
 
 def suite():
     """ Defining test suite which will execute all the testcases present in
@@ -59,6 +76,8 @@ def suite():
 
         modules.insert(gen.priority, gen)
 
+    modules.sort(key=operator.attrgetter('priority'))
+
     for m in modules:
         obj = m()
         obj.setTestClient(test_client)
@@ -69,5 +88,25 @@ def suite():
 
 
 if __name__ == '__main__':
+
+    print("Please check output in file: logger.log placed at "
+          ".../pgadmin4/web/regression")
+
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w'
+                        )
+
+    stdout_logger = logging.getLogger('STDOUT')
+    sl = StreamToLogger(stdout_logger, logging.INFO)
+    sys.stdout = sl
+
+    stderr_logger = logging.getLogger('STDERR')
+    sl = StreamToLogger(stderr_logger, logging.ERROR)
+    sys.stderr = sl
+
     suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    tests = unittest.TextTestRunner(descriptions=True, verbosity=2,
+                                    stream=sys.stdout).run(suite)
+    os.remove("parent_id.pkl")


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-06-29 19:21                       ` Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-06-29 19:21 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi,

That's better. I tweaked a few things and fixed a bug related to
recent changes to the schema version config. Patch attached.

However, there are still issues:

1) The testsuite doesn't run to completion. See the attached
stdout.txt and logger.txt files.
2) stdout should only display the test summary - what tests are
currently running (and pass/fail), and a summary at the end - even if
there's a crash like I saw.
3) The output log file should contain the full output, including
what's sent to stdout.
4) The output advises the user to check ".../pgadmin4/web/regression".
This should be in the summary at the end, and should be corrected to
show the correct (full) path.

Thanks.


On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
<[email protected]> wrote:
> Hi Dave,
>
> As per discussion over mail i have created separate config files for
> credentials and test data.
>
> PFA patch for same. Kindly, review and let me know for modifications.
>
> On 27 June 2016 at 15:10, Priyanka Shendge
> <[email protected]> wrote:
>>
>>
>>
>> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
>>>
>>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>>> <[email protected]> wrote:
>>> >
>>> >
>>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
>>> >>
>>> >> Hi
>>> >>
>>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>>> >> <[email protected]> wrote:
>>> >> >
>>> >> >
>>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>>> >> > <[email protected]> wrote:
>>> >> >>
>>> >> >> Thanks a lot Dave.
>>> >> >>
>>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>>> >> >>>
>>> >> >>> Hi
>>> >> >>>
>>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>>> >> >>> <[email protected]> wrote:
>>> >> >>> > Hi Dave,
>>> >> >>> >
>>> >> >>> > PFA updated patch. I have made changes suggested by you.
>>> >> >>> >
>>> >> >>> > Kindly, review and let me know for more changes.
>>> >> >>>
>>> >> >>> OK, I got a bit further this time, but not there yet.
>>> >> >>>
>>> >> >>> 1) The patch overwrote my test_config.json file. That should never
>>> >> >>> happen (that file shouldn't be in the source tree).
>>> >> >>> test_config.json.in should be the file that's included in the
>>> >> >>> patch.
>>> >> >>
>>> >> >>
>>> >> >> OK.
>>> >> >>>
>>> >> >>>
>>> >> >>> 2) The updated test_config.json file is huge.
>>> >> >
>>> >> >
>>> >> > Current configuration file web/regression/test_config.json contains
>>> >> > test
>>> >> > data(credentials) for each tree node;
>>> >> > which is used while adding and updating the respective node.
>>> >>
>>> >> Why would we need that?
>>> >
>>> >
>>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses respective
>>> > credentials test data  from
>>> > test_config.json while execution.
>>>
>>> That doesn't answer my question - why do we need separate credentials
>>> for each node?
>>
>>
>> Sorry for typo, its test data not credentials.
>>
>>>
>>>
>>> >> We should have just one set of credentials for
>>> >> everything.
>>> >
>>> >
>>> > Let me know if my understanding is clear:
>>> >
>>> > Should i keep basic credentials of each node (database, schema) into
>>> > test_config.json
>>> > instead  taking care of each field?
>>>
>>> You should have one set of credentials that's used for the entire test
>>> run.
>>
>>
>> Sure.  I'll separate the credentials and test data into 2 different files.
>> So, a normal user can run the tests into one go after some minor
>> credentials changes.
>> And an advanced user can have an option to change the test data if he
>> wants.
>>>
>>>
>>> >> >>> I should only need to
>>> >> >>> define one or more connections, then be able to run the tests. If
>>> >> >>> you
>>> >> >>> need to keep configuration info for "advanced users", let's put it
>>> >> >>> in
>>> >> >>> a different file to avoid confusing/scaring everyone else. Maybe
>>> >> >>> split
>>> >> >>> it into config.json for the stuff the user needs to edit
>>> >> >>> (config.json.in would go in git), and test_config.json for the
>>> >> >>> test
>>> >> >>> configuration.
>>> >> >
>>> >> >
>>> >> > Should i keep login and server credentials into
>>> >> > web/regression/test_config.json file and
>>> >> > put respective node details into config.json file of respective
>>> >> > node's
>>> >> > tests
>>> >> > directory?
>>> >>
>>> >> Not if you expect users to need to edit them - and if not, why are the
>>> >> values not just hard-coded?
>>> >>
>>> >> > e.g. for database node:
>>> >> > I'll create config.json file into .../databases/tests/ directory
>>> >> > put database add and update credentials into config.json
>>> >>
>>> >> The key here is to make it simple for users.
>>> >>
>>> >> - To run the default tests, they should be able to copy/edit a simple
>>> >> file, and just add database server details for the server to run
>>> >> against.
>>> >>
>>> >> - If we have configurable tests (because making them configurable adds
>>> >> genuine value), then we can use an "advanced" config file to allow the
>>> >> user to adjust settings as they want.
>>> >>
>>> >> In the simple case, the user should be able to run the tests
>>> >> successfully within a minute or two from starting.
>>> >>
>>> >> In designing the layout for files etc, remember the following:
>>> >>
>>> >> - Users should never edit a file that is in our source control. That's
>>> >> why we have .in files that we expect them to copy.
>>> >>
>>> >> - Unless they're an advanced user, they shouldn't need to copy the
>>> >> config file for advanced options. That means that the tests should
>>> >> have defaults that match what is in the template advanced config file
>>> >> (or, the tests could read advanced.json.in if advanced.json doesn't
>>> >> exist, though that does seem a little icky). Of course, those are
>>> >> example filenames, not necessarily what you may choose.
>>> >>
>>> >> --
>>> >> Dave Page
>>> >> Blog: http://pgsnake.blogspot.com
>>> >> Twitter: @pgsnake
>>> >>
>>> >> EnterpriseDB UK: http://www.enterprisedb.com
>>> >> The Enterprise PostgreSQL Company
>>> >
>>> >
>>> >
>>> >
>>> > --
>>> > Best,
>>> > Priyanka
>>> >
>>> > EnterpriseDB Corporation
>>> > The Enterprise PostgreSQL Company
>>>
>>>
>>>
>>> --
>>> Dave Page
>>> Blog: http://pgsnake.blogspot.com
>>> Twitter: @pgsnake
>>>
>>> EnterpriseDB UK: http://www.enterprisedb.com
>>> The Enterprise PostgreSQL Company
>>>
>>>
>>> --
>>> Sent via pgadmin-hackers mailing list ([email protected])
>>> To make changes to your subscription:
>>> http://www.postgresql.org/mailpref/pgadmin-hackers
>>
>>
>>
>>
>> --
>> Best,
>> Priyanka
>>
>> EnterpriseDB Corporation
>> The Enterprise PostgreSQL Company
>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company



-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

(pgadmin4)piranha:pgadmin4 dpage$ python web/regression/testsuite.py 
2016-06-29 20:12:43,007: INFO	pgadmin:	########################################################
2016-06-29 20:12:43,008: INFO	pgadmin:	Starting pgAdmin 4 v1.0-beta2...
2016-06-29 20:12:43,008: INFO	pgadmin:	########################################################
2016-06-29 20:12:43,008: DEBUG	pgadmin:	Python syspath: ['/Users/dpage/git/pgadmin4/web', '/Users/dpage/git/pgadmin4/web/regression', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/pytz-2014.10-py2.7.egg', '/Users/dpage/.virtualenvs/pgadmin4/lib/python27.zip', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/plat-darwin', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/plat-mac', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/dpage/.virtualenvs/pgadmin4/Extras/lib/python', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/lib-tk', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/lib-old', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages']
2016-06-29 20:12:43,008: DEBUG	pgadmin:	Available translations: [Locale('fr')]
2016-06-29 20:12:43,052: INFO	pgadmin:	Examining potential module: pgadmin.about
2016-06-29 20:12:43,053: INFO	pgadmin:	Registering blueprint module: <pgadmin.about.AboutModule object at 0x109a23e90>
2016-06-29 20:12:43,053: INFO	pgadmin:	Examining potential module: pgadmin.browser
2016-06-29 20:12:43,057: INFO	pgadmin:	Registering blueprint module: <pgadmin.browser.BrowserModule object at 0x109cbe310>
2016-06-29 20:12:43,058: INFO	pgadmin:	Examining potential module: pgadmin.browser.collection
2016-06-29 20:12:43,061: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups
2016-06-29 20:12:43,062: INFO	pgadmin:	Examining potential module: pgadmin.browser.tests
2016-06-29 20:12:43,063: INFO	pgadmin:	Examining potential module: pgadmin.browser.utils
2016-06-29 20:12:43,064: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers
2016-06-29 20:12:43,072: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.tests
2016-06-29 20:12:43,074: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases
2016-06-29 20:12:43,079: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.ppas
2016-06-29 20:12:43,079: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.resource_groups
2016-06-29 20:12:43,083: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.roles
2016-06-29 20:12:43,086: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.tablespaces
2016-06-29 20:12:43,090: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.tests
2016-06-29 20:12:43,090: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.types
2016-06-29 20:12:43,090: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.utils
2016-06-29 20:12:43,094: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.casts
2016-06-29 20:12:43,097: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.event_triggers
2016-06-29 20:12:43,100: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.extensions
2016-06-29 20:12:43,102: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers
2016-06-29 20:12:43,107: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.languages
2016-06-29 20:12:43,109: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas
2016-06-29 20:12:43,113: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.tests
2016-06-29 20:12:43,113: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.utils
2016-06-29 20:12:43,133: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.foreign_servers
2016-06-29 20:12:43,142: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.foreign_servers.user_mapping
2016-06-29 20:12:43,162: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.catalog_objects
2016-06-29 20:12:43,165: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.collations
2016-06-29 20:12:43,168: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.domains
2016-06-29 20:12:43,171: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.foreign_tables
2016-06-29 20:12:43,176: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_configurations
2016-06-29 20:12:43,179: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_dictionaries
2016-06-29 20:12:43,182: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_parser
2016-06-29 20:12:43,186: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_templates
2016-06-29 20:12:43,188: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.functions
2016-06-29 20:12:43,194: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.sequences
2016-06-29 20:12:43,197: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables
2016-06-29 20:12:43,209: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.types
2016-06-29 20:12:43,214: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.utils
2016-06-29 20:12:43,215: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.views
2016-06-29 20:12:43,226: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.catalog_objects.columns
2016-06-29 20:12:43,240: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.domains.domain_constraints
2016-06-29 20:12:43,325: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.column
2016-06-29 20:12:43,330: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints
2016-06-29 20:12:43,331: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.indexes
2016-06-29 20:12:43,335: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.rules
2016-06-29 20:12:43,337: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.triggers
2016-06-29 20:12:43,359: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.check_constraint
2016-06-29 20:12:43,364: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.exclusion_constraint
2016-06-29 20:12:43,369: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.foreign_key
2016-06-29 20:12:43,374: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.index_constraint
2016-06-29 20:12:43,379: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.type
2016-06-29 20:12:43,452: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.views.children
2016-06-29 20:12:43,461: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.views.children
2016-06-29 20:12:43,471: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.catalog_objects
2016-06-29 20:12:43,471: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.collations
2016-06-29 20:12:43,471: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.domains
2016-06-29 20:12:43,472: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.foreign_tables
2016-06-29 20:12:43,472: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_configurations
2016-06-29 20:12:43,472: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_dictionaries
2016-06-29 20:12:43,472: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_parser
2016-06-29 20:12:43,472: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.fts_templates
2016-06-29 20:12:43,472: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.functions
2016-06-29 20:12:43,472: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.sequences
2016-06-29 20:12:43,473: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.tables
2016-06-29 20:12:43,473: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.types
2016-06-29 20:12:43,473: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.utils
2016-06-29 20:12:43,473: INFO	pgadmin:	Examining potential module: pgadmin.browser.server_groups.servers.databases.schemas.views
2016-06-29 20:12:43,684: INFO	pgadmin:	Examining potential module: pgadmin.dashboard
2016-06-29 20:12:43,686: INFO	pgadmin:	Registering blueprint module: <pgadmin.dashboard.DashboardModule object at 0x10a6ff650>
2016-06-29 20:12:43,691: INFO	pgadmin:	Examining potential module: pgadmin.help
2016-06-29 20:12:43,692: INFO	pgadmin:	Registering blueprint module: <pgadmin.help.HelpModule object at 0x10a7126d0>
2016-06-29 20:12:43,692: INFO	pgadmin:	Examining potential module: pgadmin.misc
2016-06-29 20:12:43,693: INFO	pgadmin:	Registering blueprint module: <pgadmin.misc.MiscModule object at 0x10a712990>
2016-06-29 20:12:43,693: INFO	pgadmin:	Examining potential module: pgadmin.misc.bgprocess
2016-06-29 20:12:43,698: INFO	pgadmin:	Examining potential module: pgadmin.misc.depends
2016-06-29 20:12:43,699: INFO	pgadmin:	Examining potential module: pgadmin.misc.file_manager
2016-06-29 20:12:43,702: INFO	pgadmin:	Examining potential module: pgadmin.misc.sql
2016-06-29 20:12:43,703: INFO	pgadmin:	Examining potential module: pgadmin.misc.statistics
2016-06-29 20:12:43,704: INFO	pgadmin:	Examining potential module: pgadmin.misc.bgprocess.process_executor
2016-06-29 20:12:43,705: INFO	pgadmin:	Examining potential module: pgadmin.misc.bgprocess.processes
2016-06-29 20:12:43,709: INFO	pgadmin:	Examining potential module: pgadmin.model
2016-06-29 20:12:43,709: INFO	pgadmin:	Examining potential module: pgadmin.preferences
2016-06-29 20:12:43,710: INFO	pgadmin:	Registering blueprint module: <pgadmin.preferences.PreferencesModule object at 0x10a752690>
2016-06-29 20:12:43,711: INFO	pgadmin:	Examining potential module: pgadmin.redirects
2016-06-29 20:12:43,711: INFO	pgadmin:	Registering blueprint module: <pgadmin.utils.PgAdminModule object at 0x10a752d50>
2016-06-29 20:12:43,712: INFO	pgadmin:	Examining potential module: pgadmin.settings
2016-06-29 20:12:43,712: INFO	pgadmin:	Registering blueprint module: <pgadmin.settings.SettingsModule object at 0x109cbe090>
2016-06-29 20:12:43,714: INFO	pgadmin:	Examining potential module: pgadmin.tools
2016-06-29 20:12:43,714: INFO	pgadmin:	Registering blueprint module: <pgadmin.utils.PgAdminModule object at 0x10a752fd0>
2016-06-29 20:12:43,714: INFO	pgadmin:	Examining potential module: pgadmin.tools.backup
2016-06-29 20:12:43,717: INFO	pgadmin:	Examining potential module: pgadmin.tools.datagrid
2016-06-29 20:12:43,745: INFO	pgadmin:	Examining potential module: pgadmin.tools.debugger
2016-06-29 20:12:43,754: INFO	pgadmin:	Examining potential module: pgadmin.tools.grant_wizard
2016-06-29 20:12:43,756: INFO	pgadmin:	Examining potential module: pgadmin.tools.import_export
2016-06-29 20:12:43,757: INFO	pgadmin:	Examining potential module: pgadmin.tools.maintenance
2016-06-29 20:12:43,759: INFO	pgadmin:	Examining potential module: pgadmin.tools.restore
2016-06-29 20:12:43,760: INFO	pgadmin:	Examining potential module: pgadmin.tools.sqleditor
2016-06-29 20:12:43,760: INFO	pgadmin:	Examining potential module: pgadmin.tools.user_management
2016-06-29 20:12:43,775: INFO	pgadmin:	Examining potential module: pgadmin.tools.sqleditor.command
2016-06-29 20:12:43,781: INFO	pgadmin:	Examining potential module: pgadmin.utils
2016-06-29 20:12:43,831: DEBUG	pgadmin:	URL map: Map([<Rule '/import_export/js/import_export.js' (HEAD, OPTIONS, GET) -> import_export.script>,
 <Rule '/maintenance/js/maintenance.js' (HEAD, OPTIONS, GET) -> maintenance.script>,
 <Rule '/datagrid/css/datagrid.css' (HEAD, OPTIONS, GET) -> datagrid.datagrid_css>,
 <Rule '/debugger/js/debugger_ui.js' (HEAD, OPTIONS, GET) -> debugger.script_debugger_js>,
 <Rule '/debugger/js/debugger.js' (HEAD, OPTIONS, GET) -> debugger.script>,
 <Rule '/debugger/js/direct.js' (HEAD, OPTIONS, GET) -> debugger.script_debugger_direct_js>,
 <Rule '/browser/catalog_object_column/module.js' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.module.js>,
 <Rule '/browser/catalog_object_column/module.js' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.module.js>,
 <Rule '/browser/foreign_data_wrapper/module.js' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.module.js>,
 <Rule '/browser/exclusion_constraint/module.js' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.module.js>,
 <Rule '/browser/exclusion_constraint/module.js' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.module.js>,
 <Rule '/browser/domain_constraints/module.js' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.module.js>,
 <Rule '/browser/domain_constraints/module.js' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.module.js>,
 <Rule '/browser/fts_configuration/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.module.js>,
 <Rule '/browser/check_constraints/module.js' (HEAD, OPTIONS, GET) -> NODE-check_constraints.module.js>,
 <Rule '/browser/unique_constraint/module.js' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.module.js>,
 <Rule '/browser/fts_configuration/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.module.js>,
 <Rule '/browser/check_constraints/module.js' (HEAD, OPTIONS, GET) -> NODE-check_constraints.module.js>,
 <Rule '/browser/unique_constraint/module.js' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.module.js>,
 <Rule '/browser/trigger_function/module.js' (HEAD, OPTIONS, GET) -> NODE-trigger_function.module.js>,
 <Rule '/browser/trigger_function/module.js' (HEAD, OPTIONS, GET) -> NODE-trigger_function.module.js>,
 <Rule '/browser/foreign_server/module.js' (HEAD, OPTIONS, GET) -> NODE-foreign_server.module.js>,
 <Rule '/browser/catalog_object/module.js' (HEAD, OPTIONS, GET) -> NODE-catalog_object.module.js>,
 <Rule '/browser/fts_dictionary/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.module.js>,
 <Rule '/browser/catalog_object/module.js' (HEAD, OPTIONS, GET) -> NODE-catalog_object.module.js>,
 <Rule '/browser/fts_dictionary/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.module.js>,
 <Rule '/browser/resource_group/module.js' (HEAD, OPTIONS, GET) -> NODE-resource_group.module.js>,
 <Rule '/browser/event_trigger/module.js' (HEAD, OPTIONS, GET) -> NODE-event_trigger.module.js>,
 <Rule '/browser/foreign-table/module.js' (HEAD, OPTIONS, GET) -> NODE-foreign-table.module.js>,
 <Rule '/browser/foreign-table/module.js' (HEAD, OPTIONS, GET) -> NODE-foreign-table.module.js>,
 <Rule '/browser/server-group/module.js' (HEAD, OPTIONS, GET) -> NODE-server-group.module.js>,
 <Rule '/browser/user_mapping/module.js' (HEAD, OPTIONS, GET) -> NODE-user_mapping.module.js>,
 <Rule '/browser/fts_template/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_template.module.js>,
 <Rule '/browser/fts_template/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_template.module.js>,
 <Rule '/browser/server-group/nodes/' (HEAD, OPTIONS, GET) -> NODE-server-group.nodes>,
 <Rule '/browser/server-group/obj/' (HEAD, POST, OPTIONS, GET) -> NODE-server-group.obj>,
 <Rule '/browser/constraints/module.js' (HEAD, OPTIONS, GET) -> NODE-constraints.module_js>,
 <Rule '/browser/foreign_key/module.js' (HEAD, OPTIONS, GET) -> NODE-foreign_key.module.js>,
 <Rule '/browser/primary_key/module.js' (HEAD, OPTIONS, GET) -> NODE-primary_key.module.js>,
 <Rule '/browser/constraints/module.js' (HEAD, OPTIONS, GET) -> NODE-constraints.module_js>,
 <Rule '/browser/foreign_key/module.js' (HEAD, OPTIONS, GET) -> NODE-foreign_key.module.js>,
 <Rule '/browser/primary_key/module.js' (HEAD, OPTIONS, GET) -> NODE-primary_key.module.js>,
 <Rule '/browser/fts_parser/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_parser.module.js>,
 <Rule '/browser/fts_parser/module.js' (HEAD, OPTIONS, GET) -> NODE-fts_parser.module.js>,
 <Rule '/browser/tablespace/module.js' (HEAD, OPTIONS, GET) -> NODE-tablespace.module.js>,
 <Rule '/browser/extension/module.js' (HEAD, OPTIONS, GET) -> NODE-extension.module.js>,
 <Rule '/browser/collation/module.js' (HEAD, OPTIONS, GET) -> NODE-collation.module.js>,
 <Rule '/browser/procedure/module.js' (HEAD, OPTIONS, GET) -> NODE-procedure.module.js>,
 <Rule '/browser/collation/module.js' (HEAD, OPTIONS, GET) -> NODE-collation.module.js>,
 <Rule '/browser/procedure/module.js' (HEAD, OPTIONS, GET) -> NODE-procedure.module.js>,
 <Rule '/browser/database/module.js' (HEAD, OPTIONS, GET) -> NODE-database.module.js>,
 <Rule '/browser/language/module.js' (HEAD, OPTIONS, GET) -> NODE-language.module.js>,
 <Rule '/browser/function/module.js' (HEAD, OPTIONS, GET) -> NODE-function.module.js>,
 <Rule '/browser/sequence/module.js' (HEAD, OPTIONS, GET) -> NODE-sequence.module.js>,
 <Rule '/browser/function/module.js' (HEAD, OPTIONS, GET) -> NODE-function.module.js>,
 <Rule '/browser/sequence/module.js' (HEAD, OPTIONS, GET) -> NODE-sequence.module.js>,
 <Rule '/browser/trigger/module.js' (HEAD, OPTIONS, GET) -> NODE-trigger.module.js>,
 <Rule '/browser/catalog/module.js' (HEAD, OPTIONS, GET) -> NODE-catalog.module.js>,
 <Rule '/browser/trigger/module.js' (HEAD, OPTIONS, GET) -> NODE-trigger.module.js>,
 <Rule '/browser/server/module.js' (HEAD, OPTIONS, GET) -> NODE-server.module.js>,
 <Rule '/browser/schema/module.js' (HEAD, OPTIONS, GET) -> NODE-schema.module.js>,
 <Rule '/browser/domain/module.js' (HEAD, OPTIONS, GET) -> NODE-domain.module.js>,
 <Rule '/browser/column/module.js' (HEAD, OPTIONS, GET) -> NODE-column.module.js>,
 <Rule '/browser/domain/module.js' (HEAD, OPTIONS, GET) -> NODE-domain.module.js>,
 <Rule '/browser/column/module.js' (HEAD, OPTIONS, GET) -> NODE-column.module.js>,
 <Rule '/browser/table/module.js' (HEAD, OPTIONS, GET) -> NODE-table.module.js>,
 <Rule '/browser/index/module.js' (HEAD, OPTIONS, GET) -> NODE-index.module.js>,
 <Rule '/browser/mview/module.js' (HEAD, OPTIONS, GET) -> NODE-mview.module.js>,
 <Rule '/browser/table/module.js' (HEAD, OPTIONS, GET) -> NODE-table.module.js>,
 <Rule '/browser/index/module.js' (HEAD, OPTIONS, GET) -> NODE-index.module.js>,
 <Rule '/browser/mview/module.js' (HEAD, OPTIONS, GET) -> NODE-mview.module.js>,
 <Rule '/browser/cast/module.js' (HEAD, OPTIONS, GET) -> NODE-cast.module.js>,
 <Rule '/browser/rule/module.js' (HEAD, OPTIONS, GET) -> NODE-rule.module.js>,
 <Rule '/browser/type/module.js' (HEAD, OPTIONS, GET) -> NODE-type.module.js>,
 <Rule '/browser/view/module.js' (HEAD, OPTIONS, GET) -> NODE-view.module.js>,
 <Rule '/browser/rule/module.js' (HEAD, OPTIONS, GET) -> NODE-rule.module.js>,
 <Rule '/browser/type/module.js' (HEAD, OPTIONS, GET) -> NODE-type.module.js>,
 <Rule '/browser/view/module.js' (HEAD, OPTIONS, GET) -> NODE-view.module.js>,
 <Rule '/browser/role/module.js' (HEAD, OPTIONS, GET) -> NODE-role.module.js>,
 <Rule '/browser/js/collection.js' (HEAD, OPTIONS, GET) -> browser.collection_js>,
 <Rule '/browser/js/messages.js' (HEAD, OPTIONS, GET) -> browser.messages_js>,
 <Rule '/browser/js/browser.js' (HEAD, OPTIONS, GET) -> browser.browser_js>,
 <Rule '/browser/js/error.js' (HEAD, OPTIONS, GET) -> browser.error_js>,
 <Rule '/browser/js/node.js' (HEAD, OPTIONS, GET) -> browser.node_js>,
 <Rule '/misc/bgprocess/list/' (HEAD, OPTIONS, GET) -> bgprocess.list>,
 <Rule '/misc/explain/explain.js' (HEAD, OPTIONS, GET) -> misc.explain_js>,
 <Rule '/user_management/user_management.js' (HEAD, OPTIONS, GET) -> user_management.script>,
 <Rule '/user_management/user/' (POST, OPTIONS) -> user_management.create>,
 <Rule '/file_manager/file_manager_config.js' (HEAD, OPTIONS, GET) -> file_manager.file_manager_config_js>,
 <Rule '/file_manager/file_manager.js' (HEAD, OPTIONS, GET) -> file_manager.file_manager_js>,
 <Rule '/grant_wizard/grant_wizard.js' (HEAD, OPTIONS, GET) -> grant_wizard.script>,
 <Rule '/file_manager/get_trans_id' (HEAD, POST, OPTIONS, GET) -> file_manager.get_trans_id>,
 <Rule '/file_manager/utility.js' (HEAD, OPTIONS, GET) -> file_manager.utility>,
 <Rule '/file_manager/en.js' (HEAD, OPTIONS, GET) -> file_manager.language>,
 <Rule '/preferences/preferences.js' (HEAD, OPTIONS, GET) -> preferences.script>,
 <Rule '/preferences/preferences' (HEAD, OPTIONS, GET) -> preferences.preferences>,
 <Rule '/dashboard/session_stats/' (HEAD, OPTIONS, GET) -> dashboard.session_stats>,
 <Rule '/dashboard/dashboard.js' (HEAD, OPTIONS, GET) -> dashboard.script>,
 <Rule '/sqleditor/sqleditor.js' (HEAD, OPTIONS, GET) -> sqleditor.script>,
 <Rule '/dashboard/tps_stats/' (HEAD, OPTIONS, GET) -> dashboard.tps_stats>,
 <Rule '/dashboard/bio_stats/' (HEAD, OPTIONS, GET) -> dashboard.bio_stats>,
 <Rule '/sqleditor/load_file/' (PUT, POST, OPTIONS) -> sqleditor.load_file>,
 <Rule '/sqleditor/save_file/' (PUT, POST, OPTIONS) -> sqleditor.save_file>,
 <Rule '/dashboard/ti_stats/' (HEAD, OPTIONS, GET) -> dashboard.ti_stats>,
 <Rule '/dashboard/to_stats/' (HEAD, OPTIONS, GET) -> dashboard.to_stats>,
 <Rule '/dashboard/activity/' (HEAD, OPTIONS, GET) -> dashboard.activity>,
 <Rule '/dashboard/prepared/' (HEAD, OPTIONS, GET) -> dashboard.prepared>,
 <Rule '/dashboard/config/' (HEAD, OPTIONS, GET) -> dashboard.config>,
 <Rule '/dashboard/locks/' (HEAD, OPTIONS, GET) -> dashboard.locks>,
 <Rule '/settings/reset_layout' (OPTIONS, DELETE) -> settings.reset_layout>,
 <Rule '/settings/settings.js' (HEAD, OPTIONS, GET) -> settings.script>,
 <Rule '/datagrid/datagrid.js' (HEAD, OPTIONS, GET) -> datagrid.script>,
 <Rule '/datagrid/filter' (HEAD, OPTIONS, GET) -> datagrid.show_filter>,
 <Rule '/settings/store' (POST, OPTIONS) -> settings.store>,
 <Rule '/settings/get' (POST, OPTIONS) -> settings.get>,
 <Rule '/browser/browser.css' (HEAD, OPTIONS, GET) -> browser.browser_css>,
 <Rule '/restore/restore.js' (HEAD, OPTIONS, GET) -> restore.script>,
 <Rule '/browser/nodes/' (HEAD, OPTIONS, GET) -> browser.get_nodes>,
 <Rule '/backup/backup.js' (HEAD, OPTIONS, GET) -> backup.script>,
 <Rule '/about/about.js' (HEAD, OPTIONS, GET) -> about.script>,
 <Rule '/misc/bgprocess/' (HEAD, OPTIONS, GET) -> bgprocess.index>,
 <Rule '/misc/ping' (HEAD, POST, OPTIONS, GET) -> misc.ping>,
 <Rule '/user_management/' (HEAD, OPTIONS, GET) -> user_management.index>,
 <Rule '/import_export/' (HEAD, OPTIONS, GET) -> import_export.index>,
 <Rule '/file_manager/' (HEAD, OPTIONS, GET) -> file_manager.index>,
 <Rule '/grant_wizard/' (HEAD, OPTIONS, GET) -> grant_wizard.index>,
 <Rule '/preferences/' (HEAD, OPTIONS, GET) -> preferences.index>,
 <Rule '/favicon.ico' (HEAD, OPTIONS, GET) -> redirects.favicon>,
 <Rule '/maintenance/' (HEAD, OPTIONS, GET) -> maintenance.index>,
 <Rule '/dashboard/' (HEAD, OPTIONS, GET) -> dashboard.index>,
 <Rule '/sqleditor/' (HEAD, OPTIONS, GET) -> sqleditor.index>,
 <Rule '/settings/' (HEAD, OPTIONS, GET) -> settings.index>,
 <Rule '/datagrid/' (HEAD, OPTIONS, GET) -> datagrid.index>,
 <Rule '/debugger/' (HEAD, OPTIONS, GET) -> debugger.index>,
 <Rule '/browser/' (HEAD, OPTIONS, GET) -> browser.index>,
 <Rule '/restore/' (HEAD, OPTIONS, GET) -> restore.index>,
 <Rule '/logout' (HEAD, OPTIONS, GET) -> security.logout>,
 <Rule '/change' (HEAD, POST, OPTIONS, GET) -> security.change_password>,
 <Rule '/backup/' (HEAD, OPTIONS, GET) -> backup.index>,
 <Rule '/login' (HEAD, POST, OPTIONS, GET) -> security.login>,
 <Rule '/reset' (HEAD, POST, OPTIONS, GET) -> security.forgot_password>,
 <Rule '/about/' (HEAD, OPTIONS, GET) -> about.index>,
 <Rule '/tools/' (HEAD, OPTIONS, GET) -> tools.index>,
 <Rule '/misc/' (HEAD, OPTIONS, GET) -> misc.index>,
 <Rule '/' (HEAD, OPTIONS, GET) -> redirects.index>,
 <Rule '/browser/catalog_object_column/dependency/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.dependency_id>,
 <Rule '/browser/catalog_object_column/dependency/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.dependency_id>,
 <Rule '/browser/catalog_object_column/dependent/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.dependent_id>,
 <Rule '/browser/catalog_object_column/dependent/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.dependent_id>,
 <Rule '/browser/catalog_object_column/nodes/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.nodes_id>,
 <Rule '/browser/catalog_object_column/nodes/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.nodes_id>,
 <Rule '/browser/catalog_object_column/obj/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.obj_id>,
 <Rule '/browser/catalog_object_column/sql/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.sql_id>,
 <Rule '/browser/catalog_object_column/obj/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.obj_id>,
 <Rule '/browser/catalog_object_column/sql/<gid>/<sid>/<did>/<scid>/<coid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.sql_id>,
 <Rule '/browser/exclusion_constraint/children/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.children_id>,
 <Rule '/browser/exclusion_constraint/children/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.children_id>,
 <Rule '/browser/exclusion_constraint/delete/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (OPTIONS, DELETE) -> NODE-exclusion_constraint.delete_id>,
 <Rule '/browser/exclusion_constraint/delete/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (OPTIONS, DELETE) -> NODE-exclusion_constraint.delete_id>,
 <Rule '/browser/exclusion_constraint/stats/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.stats_id>,
 <Rule '/browser/exclusion_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.nodes_id>,
 <Rule '/browser/exclusion_constraint/stats/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.stats_id>,
 <Rule '/browser/exclusion_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.nodes_id>,
 <Rule '/browser/exclusion_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.msql_id>,
 <Rule '/browser/exclusion_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.msql_id>,
 <Rule '/browser/exclusion_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-exclusion_constraint.obj_id>,
 <Rule '/browser/exclusion_constraint/sql/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.sql_id>,
 <Rule '/browser/exclusion_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-exclusion_constraint.obj_id>,
 <Rule '/browser/exclusion_constraint/sql/<gid>/<sid>/<did>/<scid>/<tid>/<exid>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.sql_id>,
 <Rule '/browser/domain_constraints/dependency/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.dependency_id>,
 <Rule '/browser/domain_constraints/dependency/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.dependency_id>,
 <Rule '/browser/domain_constraints/dependent/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.dependent_id>,
 <Rule '/browser/domain_constraints/dependent/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.dependent_id>,
 <Rule '/browser/domain_constraints/children/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.children_id>,
 <Rule '/browser/domain_constraints/children/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.children_id>,
 <Rule '/browser/domain_constraints/delete/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (OPTIONS, DELETE) -> NODE-domain_constraints.delete_id>,
 <Rule '/browser/domain_constraints/delete/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (OPTIONS, DELETE) -> NODE-domain_constraints.delete_id>,
 <Rule '/browser/domain_constraints/stats/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.stats_id>,
 <Rule '/browser/domain_constraints/nodes/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.nodes_id>,
 <Rule '/browser/domain_constraints/stats/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.stats_id>,
 <Rule '/browser/domain_constraints/nodes/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.nodes_id>,
 <Rule '/browser/domain_constraints/msql/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.msql_id>,
 <Rule '/browser/domain_constraints/msql/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.msql_id>,
 <Rule '/browser/domain_constraints/obj/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-domain_constraints.obj_id>,
 <Rule '/browser/domain_constraints/sql/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.sql_id>,
 <Rule '/browser/domain_constraints/obj/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-domain_constraints.obj_id>,
 <Rule '/browser/domain_constraints/sql/<gid>/<sid>/<did>/<scid>/<doid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.sql_id>,
 <Rule '/browser/check_constraints/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.dependency_id>,
 <Rule '/browser/unique_constraint/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.dependency_id>,
 <Rule '/browser/check_constraints/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.dependency_id>,
 <Rule '/browser/unique_constraint/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.dependency_id>,
 <Rule '/browser/check_constraints/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.dependent_id>,
 <Rule '/browser/unique_constraint/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.dependent_id>,
 <Rule '/browser/check_constraints/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.dependent_id>,
 <Rule '/browser/unique_constraint/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.dependent_id>,
 <Rule '/browser/check_constraints/validate/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.validate_id>,
 <Rule '/browser/check_constraints/children/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.children_id>,
 <Rule '/browser/unique_constraint/children/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.children_id>,
 <Rule '/browser/check_constraints/validate/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.validate_id>,
 <Rule '/browser/check_constraints/children/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.children_id>,
 <Rule '/browser/unique_constraint/children/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.children_id>,
 <Rule '/browser/check_constraints/delete/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (OPTIONS, DELETE) -> NODE-check_constraints.delete_id>,
 <Rule '/browser/unique_constraint/delete/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (OPTIONS, DELETE) -> NODE-unique_constraint.delete_id>,
 <Rule '/browser/check_constraints/delete/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (OPTIONS, DELETE) -> NODE-check_constraints.delete_id>,
 <Rule '/browser/unique_constraint/delete/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (OPTIONS, DELETE) -> NODE-unique_constraint.delete_id>,
 <Rule '/browser/check_constraints/stats/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.stats_id>,
 <Rule '/browser/check_constraints/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.nodes_id>,
 <Rule '/browser/unique_constraint/stats/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.stats_id>,
 <Rule '/browser/unique_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.nodes_id>,
 <Rule '/browser/check_constraints/stats/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.stats_id>,
 <Rule '/browser/check_constraints/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.nodes_id>,
 <Rule '/browser/unique_constraint/stats/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.stats_id>,
 <Rule '/browser/unique_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.nodes_id>,
 <Rule '/browser/check_constraints/msql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.msql_id>,
 <Rule '/browser/unique_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.msql_id>,
 <Rule '/browser/check_constraints/msql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.msql_id>,
 <Rule '/browser/unique_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.msql_id>,
 <Rule '/browser/check_constraints/sql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.sql_id>,
 <Rule '/browser/check_constraints/obj/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-check_constraints.obj_id>,
 <Rule '/browser/unique_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-unique_constraint.obj_id>,
 <Rule '/browser/unique_constraint/sql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.sql_id>,
 <Rule '/browser/check_constraints/sql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.sql_id>,
 <Rule '/browser/check_constraints/obj/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-check_constraints.obj_id>,
 <Rule '/browser/unique_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-unique_constraint.obj_id>,
 <Rule '/browser/unique_constraint/sql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.sql_id>,
 <Rule '/browser/user_mapping/dependency/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.dependency_id>,
 <Rule '/browser/user_mapping/dependent/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.dependent_id>,
 <Rule '/browser/user_mapping/children/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.children_id>,
 <Rule '/browser/user_mapping/delete/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (OPTIONS, DELETE) -> NODE-user_mapping.delete_id>,
 <Rule '/browser/user_mapping/stats/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.stats_id>,
 <Rule '/browser/user_mapping/nodes/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.nodes_id>,
 <Rule '/browser/user_mapping/msql/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.msql_id>,
 <Rule '/browser/user_mapping/obj/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-user_mapping.obj_id>,
 <Rule '/browser/user_mapping/sql/<gid>/<sid>/<did>/<fid>/<fsid>/<umid>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.sql_id>,
 <Rule '/browser/foreign_key/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.dependency_id>,
 <Rule '/browser/primary_key/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.dependency_id>,
 <Rule '/browser/foreign_key/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.dependency_id>,
 <Rule '/browser/primary_key/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.dependency_id>,
 <Rule '/browser/foreign_key/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.dependent_id>,
 <Rule '/browser/primary_key/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.dependent_id>,
 <Rule '/browser/foreign_key/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.dependent_id>,
 <Rule '/browser/primary_key/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.dependent_id>,
 <Rule '/browser/foreign_key/validate/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.validate_id>,
 <Rule '/browser/foreign_key/children/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.children_id>,
 <Rule '/browser/primary_key/children/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.children_id>,
 <Rule '/browser/foreign_key/validate/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.validate_id>,
 <Rule '/browser/foreign_key/children/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.children_id>,
 <Rule '/browser/primary_key/children/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.children_id>,
 <Rule '/browser/foreign_key/delete/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (OPTIONS, DELETE) -> NODE-foreign_key.delete_id>,
 <Rule '/browser/primary_key/delete/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (OPTIONS, DELETE) -> NODE-primary_key.delete_id>,
 <Rule '/browser/foreign_key/delete/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (OPTIONS, DELETE) -> NODE-foreign_key.delete_id>,
 <Rule '/browser/primary_key/delete/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (OPTIONS, DELETE) -> NODE-primary_key.delete_id>,
 <Rule '/browser/foreign_key/stats/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.stats_id>,
 <Rule '/browser/foreign_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.nodes_id>,
 <Rule '/browser/primary_key/stats/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.stats_id>,
 <Rule '/browser/primary_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.nodes_id>,
 <Rule '/browser/foreign_key/stats/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.stats_id>,
 <Rule '/browser/foreign_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.nodes_id>,
 <Rule '/browser/primary_key/stats/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.stats_id>,
 <Rule '/browser/primary_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.nodes_id>,
 <Rule '/browser/foreign_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.msql_id>,
 <Rule '/browser/primary_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.msql_id>,
 <Rule '/browser/foreign_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.msql_id>,
 <Rule '/browser/primary_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.msql_id>,
 <Rule '/browser/foreign_key/sql/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.sql_id>,
 <Rule '/browser/foreign_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-foreign_key.obj_id>,
 <Rule '/browser/primary_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-primary_key.obj_id>,
 <Rule '/browser/primary_key/sql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.sql_id>,
 <Rule '/browser/foreign_key/sql/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.sql_id>,
 <Rule '/browser/foreign_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/<fkid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-foreign_key.obj_id>,
 <Rule '/browser/primary_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-primary_key.obj_id>,
 <Rule '/browser/primary_key/sql/<gid>/<sid>/<did>/<scid>/<tid>/<cid>' (HEAD, OPTIONS, GET) -> NODE-primary_key.sql_id>,
 <Rule '/browser/trigger/get_triggerfunctions/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.get_triggerfunctions_id>,
 <Rule '/browser/trigger/get_triggerfunctions/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.get_triggerfunctions_id>,
 <Rule '/browser/trigger/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.dependency_id>,
 <Rule '/browser/trigger/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.dependency_id>,
 <Rule '/browser/trigger/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.dependent_id>,
 <Rule '/browser/trigger/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.dependent_id>,
 <Rule '/browser/trigger/children/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.children_id>,
 <Rule '/browser/trigger/children/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.children_id>,
 <Rule '/browser/trigger/enable/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (PUT, OPTIONS) -> NODE-trigger.enable_id>,
 <Rule '/browser/trigger/delete/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (OPTIONS, DELETE) -> NODE-trigger.delete_id>,
 <Rule '/browser/trigger/enable/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (PUT, OPTIONS) -> NODE-trigger.enable_id>,
 <Rule '/browser/trigger/delete/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (OPTIONS, DELETE) -> NODE-trigger.delete_id>,
 <Rule '/browser/trigger/stats/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.stats_id>,
 <Rule '/browser/trigger/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.nodes_id>,
 <Rule '/browser/trigger/stats/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.stats_id>,
 <Rule '/browser/trigger/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.nodes_id>,
 <Rule '/browser/trigger/msql/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.msql_id>,
 <Rule '/browser/trigger/msql/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.msql_id>,
 <Rule '/browser/trigger/sql/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.sql_id>,
 <Rule '/browser/trigger/obj/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-trigger.obj_id>,
 <Rule '/browser/trigger/sql/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (HEAD, OPTIONS, GET) -> NODE-trigger.sql_id>,
 <Rule '/browser/trigger/obj/<gid>/<sid>/<did>/<scid>/<tid>/<trid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-trigger.obj_id>,
 <Rule '/browser/column/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.dependency_id>,
 <Rule '/browser/column/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.dependency_id>,
 <Rule '/browser/column/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.dependent_id>,
 <Rule '/browser/column/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.dependent_id>,
 <Rule '/browser/column/children/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.children_id>,
 <Rule '/browser/column/children/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.children_id>,
 <Rule '/browser/column/stats/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.stats_id>,
 <Rule '/browser/column/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.nodes_id>,
 <Rule '/browser/column/stats/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.stats_id>,
 <Rule '/browser/column/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.nodes_id>,
 <Rule '/browser/column/msql/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.msql_id>,
 <Rule '/browser/column/msql/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.msql_id>,
 <Rule '/browser/column/obj/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-column.obj_id>,
 <Rule '/browser/column/sql/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.sql_id>,
 <Rule '/browser/column/obj/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-column.obj_id>,
 <Rule '/browser/column/sql/<gid>/<sid>/<did>/<scid>/<tid>/<clid>' (HEAD, OPTIONS, GET) -> NODE-column.sql_id>,
 <Rule '/browser/index/get_access_methods/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.get_access_methods_id>,
 <Rule '/browser/index/get_access_methods/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.get_access_methods_id>,
 <Rule '/browser/index/get_collations/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.get_collations_id>,
 <Rule '/browser/index/get_collations/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.get_collations_id>,
 <Rule '/browser/index/get_op_class/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.get_op_class_id>,
 <Rule '/browser/index/get_op_class/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.get_op_class_id>,
 <Rule '/browser/index/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.dependency_id>,
 <Rule '/browser/index/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.dependency_id>,
 <Rule '/browser/index/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.dependent_id>,
 <Rule '/browser/index/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.dependent_id>,
 <Rule '/browser/index/children/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.children_id>,
 <Rule '/browser/index/children/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.children_id>,
 <Rule '/browser/index/delete/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (OPTIONS, DELETE) -> NODE-index.delete_id>,
 <Rule '/browser/index/delete/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (OPTIONS, DELETE) -> NODE-index.delete_id>,
 <Rule '/browser/index/stats/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.stats_id>,
 <Rule '/browser/index/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.nodes_id>,
 <Rule '/browser/index/stats/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.stats_id>,
 <Rule '/browser/index/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.nodes_id>,
 <Rule '/browser/index/msql/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.msql_id>,
 <Rule '/browser/index/msql/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.msql_id>,
 <Rule '/browser/index/sql/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.sql_id>,
 <Rule '/browser/index/obj/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-index.obj_id>,
 <Rule '/browser/index/sql/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (HEAD, OPTIONS, GET) -> NODE-index.sql_id>,
 <Rule '/browser/index/obj/<gid>/<sid>/<did>/<scid>/<tid>/<idx>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-index.obj_id>,
 <Rule '/browser/rule/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.dependency_id>,
 <Rule '/browser/rule/dependency/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.dependency_id>,
 <Rule '/browser/rule/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.dependent_id>,
 <Rule '/browser/rule/dependent/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.dependent_id>,
 <Rule '/browser/rule/children/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.children_id>,
 <Rule '/browser/rule/children/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.children_id>,
 <Rule '/browser/rule/configs/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.configs_id>,
 <Rule '/browser/rule/configs/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.configs_id>,
 <Rule '/browser/rule/delete/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (OPTIONS, DELETE) -> NODE-rule.delete_id>,
 <Rule '/browser/rule/delete/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (OPTIONS, DELETE) -> NODE-rule.delete_id>,
 <Rule '/browser/rule/stats/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.stats_id>,
 <Rule '/browser/rule/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.nodes_id>,
 <Rule '/browser/rule/stats/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.stats_id>,
 <Rule '/browser/rule/nodes/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.nodes_id>,
 <Rule '/browser/rule/msql/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.msql_id>,
 <Rule '/browser/rule/msql/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.msql_id>,
 <Rule '/browser/rule/sql/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.sql_id>,
 <Rule '/browser/rule/obj/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-rule.obj_id>,
 <Rule '/browser/rule/sql/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-rule.sql_id>,
 <Rule '/browser/rule/obj/<gid>/<sid>/<did>/<scid>/<tid>/<rid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-rule.obj_id>,
 <Rule '/datagrid/initialize/datagrid/<cmd_type>/<obj_type>/<sid>/<did>/<obj_id>' (PUT, POST, OPTIONS) -> datagrid.initialize_datagrid>,
 <Rule '/browser/catalog_object_column/nodes/<gid>/<sid>/<did>/<scid>/<coid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.nodes>,
 <Rule '/browser/catalog_object_column/nodes/<gid>/<sid>/<did>/<scid>/<coid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.nodes>,
 <Rule '/browser/catalog_object_column/obj/<gid>/<sid>/<did>/<scid>/<coid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.obj>,
 <Rule '/browser/catalog_object_column/obj/<gid>/<sid>/<did>/<scid>/<coid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.obj>,
 <Rule '/browser/exclusion_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.nodes>,
 <Rule '/browser/exclusion_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.nodes>,
 <Rule '/browser/exclusion_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.msql>,
 <Rule '/browser/exclusion_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.msql>,
 <Rule '/browser/exclusion_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-exclusion_constraint.obj>,
 <Rule '/browser/exclusion_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-exclusion_constraint.obj>,
 <Rule '/browser/domain_constraints/nodes/<gid>/<sid>/<did>/<scid>/<doid>/' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.nodes>,
 <Rule '/browser/domain_constraints/nodes/<gid>/<sid>/<did>/<scid>/<doid>/' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.nodes>,
 <Rule '/browser/domain_constraints/msql/<gid>/<sid>/<did>/<scid>/<doid>/' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.msql>,
 <Rule '/browser/domain_constraints/msql/<gid>/<sid>/<did>/<scid>/<doid>/' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.msql>,
 <Rule '/browser/domain_constraints/obj/<gid>/<sid>/<did>/<scid>/<doid>/' (HEAD, POST, OPTIONS, GET) -> NODE-domain_constraints.obj>,
 <Rule '/browser/domain_constraints/obj/<gid>/<sid>/<did>/<scid>/<doid>/' (HEAD, POST, OPTIONS, GET) -> NODE-domain_constraints.obj>,
 <Rule '/browser/fts_configuration/copyConfig/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.copyConfig_id>,
 <Rule '/browser/fts_configuration/dependency/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.dependency_id>,
 <Rule '/browser/fts_configuration/copyConfig/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.copyConfig_id>,
 <Rule '/browser/fts_configuration/dependency/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.dependency_id>,
 <Rule '/browser/fts_configuration/dependent/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.dependent_id>,
 <Rule '/browser/fts_configuration/dependent/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.dependent_id>,
 <Rule '/browser/fts_configuration/children/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.children_id>,
 <Rule '/browser/fts_configuration/children/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.children_id>,
 <Rule '/browser/fts_configuration/parsers/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.parsers_id>,
 <Rule '/browser/fts_configuration/parsers/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.parsers_id>,
 <Rule '/browser/fts_configuration/tokens/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.tokens_id>,
 <Rule '/browser/fts_configuration/delete/<gid>/<sid>/<did>/<scid>/<cfgid>' (OPTIONS, DELETE) -> NODE-fts_configuration.delete_id>,
 <Rule '/browser/fts_configuration/tokens/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.tokens_id>,
 <Rule '/browser/fts_configuration/delete/<gid>/<sid>/<did>/<scid>/<cfgid>' (OPTIONS, DELETE) -> NODE-fts_configuration.delete_id>,
 <Rule '/browser/fts_configuration/stats/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.stats_id>,
 <Rule '/browser/fts_configuration/nodes/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.nodes_id>,
 <Rule '/browser/check_constraints/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-check_constraints.nodes>,
 <Rule '/browser/unique_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.nodes>,
 <Rule '/browser/fts_configuration/stats/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.stats_id>,
 <Rule '/browser/fts_configuration/nodes/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.nodes_id>,
 <Rule '/browser/check_constraints/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-check_constraints.nodes>,
 <Rule '/browser/unique_constraint/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.nodes>,
 <Rule '/browser/fts_configuration/msql/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.msql_id>,
 <Rule '/browser/check_constraints/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-check_constraints.msql>,
 <Rule '/browser/unique_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.msql>,
 <Rule '/browser/fts_configuration/msql/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.msql_id>,
 <Rule '/browser/check_constraints/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-check_constraints.msql>,
 <Rule '/browser/unique_constraint/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.msql>,
 <Rule '/browser/fts_configuration/sql/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.sql_id>,
 <Rule '/browser/fts_configuration/obj/<gid>/<sid>/<did>/<scid>/<cfgid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_configuration.obj_id>,
 <Rule '/browser/check_constraints/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-check_constraints.obj>,
 <Rule '/browser/unique_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-unique_constraint.obj>,
 <Rule '/browser/fts_configuration/sql/<gid>/<sid>/<did>/<scid>/<cfgid>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.sql_id>,
 <Rule '/browser/fts_configuration/obj/<gid>/<sid>/<did>/<scid>/<cfgid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_configuration.obj_id>,
 <Rule '/browser/check_constraints/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-check_constraints.obj>,
 <Rule '/browser/unique_constraint/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-unique_constraint.obj>,
 <Rule '/browser/trigger_function/get_languages/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_languages_id>,
 <Rule '/browser/trigger_function/get_languages/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_languages_id>,
 <Rule '/browser/trigger_function/dependency/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.dependency_id>,
 <Rule '/browser/trigger_function/select_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.select_sql_id>,
 <Rule '/browser/trigger_function/dependency/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.dependency_id>,
 <Rule '/browser/trigger_function/select_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.select_sql_id>,
 <Rule '/browser/trigger_function/dependent/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.dependent_id>,
 <Rule '/browser/trigger_function/get_types/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_types_id>,
 <Rule '/browser/trigger_function/dependent/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.dependent_id>,
 <Rule '/browser/trigger_function/get_types/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_types_id>,
 <Rule '/browser/trigger_function/exec_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.exec_sql_id>,
 <Rule '/browser/trigger_function/children/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.children_id>,
 <Rule '/browser/trigger_function/exec_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.exec_sql_id>,
 <Rule '/browser/trigger_function/children/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.children_id>,
 <Rule '/browser/trigger_function/delete/<gid>/<sid>/<did>/<scid>/<fnid>' (OPTIONS, DELETE) -> NODE-trigger_function.delete_id>,
 <Rule '/browser/trigger_function/delete/<gid>/<sid>/<did>/<scid>/<fnid>' (OPTIONS, DELETE) -> NODE-trigger_function.delete_id>,
 <Rule '/browser/trigger_function/stats/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.stats_id>,
 <Rule '/browser/trigger_function/nodes/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.nodes_id>,
 <Rule '/browser/trigger_function/stats/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.stats_id>,
 <Rule '/browser/trigger_function/nodes/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.nodes_id>,
 <Rule '/browser/trigger_function/msql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.msql_id>,
 <Rule '/browser/trigger_function/msql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.msql_id>,
 <Rule '/browser/trigger_function/sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.sql_id>,
 <Rule '/browser/trigger_function/obj/<gid>/<sid>/<did>/<scid>/<fnid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-trigger_function.obj_id>,
 <Rule '/browser/trigger_function/sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.sql_id>,
 <Rule '/browser/trigger_function/obj/<gid>/<sid>/<did>/<scid>/<fnid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-trigger_function.obj_id>,
 <Rule '/browser/fts_dictionary/fetch_templates/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.fetch_templates_id>,
 <Rule '/browser/fts_dictionary/fetch_templates/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.fetch_templates_id>,
 <Rule '/browser/foreign_server/dependency/<gid>/<sid>/<did>/<fid>/<fsid>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.dependency_id>,
 <Rule '/browser/catalog_object/dependency/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.dependency_id>,
 <Rule '/browser/fts_dictionary/dependency/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.dependency_id>,
 <Rule '/browser/catalog_object/dependency/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.dependency_id>,
 <Rule '/browser/fts_dictionary/dependency/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.dependency_id>,
 <Rule '/browser/foreign_server/dependent/<gid>/<sid>/<did>/<fid>/<fsid>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.dependent_id>,
 <Rule '/browser/catalog_object/dependent/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.dependent_id>,
 <Rule '/browser/fts_dictionary/dependent/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.dependent_id>,
 <Rule '/browser/catalog_object/dependent/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.dependent_id>,
 <Rule '/browser/fts_dictionary/dependent/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.dependent_id>,
 <Rule '/browser/foreign_server/children/<gid>/<sid>/<did>/<fid>/<fsid>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.children_id>,
 <Rule '/browser/catalog_object/children/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.children_id>,
 <Rule '/browser/fts_dictionary/children/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.children_id>,
 <Rule '/browser/catalog_object/children/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.children_id>,
 <Rule '/browser/fts_dictionary/children/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.children_id>,
 <Rule '/browser/foreign_server/delete/<gid>/<sid>/<did>/<fid>/<fsid>' (OPTIONS, DELETE) -> NODE-foreign_server.delete_id>,
 <Rule '/browser/fts_dictionary/delete/<gid>/<sid>/<did>/<scid>/<dcid>' (OPTIONS, DELETE) -> NODE-fts_dictionary.delete_id>,
 <Rule '/browser/fts_dictionary/delete/<gid>/<sid>/<did>/<scid>/<dcid>' (OPTIONS, DELETE) -> NODE-fts_dictionary.delete_id>,
 <Rule '/browser/foreign_server/stats/<gid>/<sid>/<did>/<fid>/<fsid>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.stats_id>,
 <Rule '/browser/foreign_server/nodes/<gid>/<sid>/<did>/<fid>/<fsid>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.nodes_id>,
 <Rule '/browser/catalog_object/nodes/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.nodes_id>,
 <Rule '/browser/fts_dictionary/stats/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.stats_id>,
 <Rule '/browser/fts_dictionary/nodes/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.nodes_id>,
 <Rule '/browser/catalog_object/nodes/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.nodes_id>,
 <Rule '/browser/fts_dictionary/stats/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.stats_id>,
 <Rule '/browser/fts_dictionary/nodes/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.nodes_id>,
 <Rule '/browser/foreign_server/msql/<gid>/<sid>/<did>/<fid>/<fsid>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.msql_id>,
 <Rule '/browser/fts_dictionary/msql/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.msql_id>,
 <Rule '/browser/fts_dictionary/msql/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.msql_id>,
 <Rule '/browser/foreign_server/obj/<gid>/<sid>/<did>/<fid>/<fsid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-foreign_server.obj_id>,
 <Rule '/browser/foreign_server/sql/<gid>/<sid>/<did>/<fid>/<fsid>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.sql_id>,
 <Rule '/browser/catalog_object/obj/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.obj_id>,
 <Rule '/browser/catalog_object/sql/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.sql_id>,
 <Rule '/browser/fts_dictionary/sql/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.sql_id>,
 <Rule '/browser/fts_dictionary/obj/<gid>/<sid>/<did>/<scid>/<dcid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_dictionary.obj_id>,
 <Rule '/browser/catalog_object/obj/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.obj_id>,
 <Rule '/browser/catalog_object/sql/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.sql_id>,
 <Rule '/browser/fts_dictionary/sql/<gid>/<sid>/<did>/<scid>/<dcid>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.sql_id>,
 <Rule '/browser/fts_dictionary/obj/<gid>/<sid>/<did>/<scid>/<dcid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_dictionary.obj_id>,
 <Rule '/browser/foreign-table/get_foreign_servers/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_foreign_servers_id>,
 <Rule '/browser/foreign-table/get_foreign_servers/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_foreign_servers_id>,
 <Rule '/browser/foreign-table/get_collations/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_collations_id>,
 <Rule '/browser/foreign-table/get_collations/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_collations_id>,
 <Rule '/browser/foreign-table/get_columns/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_columns_id>,
 <Rule '/browser/foreign-table/get_columns/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_columns_id>,
 <Rule '/browser/foreign-table/get_tables/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_tables_id>,
 <Rule '/browser/foreign-table/delete_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.delete_sql_id>,
 <Rule '/browser/foreign-table/update_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.update_sql_id>,
 <Rule '/browser/foreign-table/select_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.select_sql_id>,
 <Rule '/browser/foreign-table/insert_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.insert_sql_id>,
 <Rule '/browser/foreign-table/dependency/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.dependency_id>,
 <Rule '/browser/foreign-table/get_tables/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_tables_id>,
 <Rule '/browser/foreign-table/delete_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.delete_sql_id>,
 <Rule '/browser/foreign-table/update_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.update_sql_id>,
 <Rule '/browser/foreign-table/select_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.select_sql_id>,
 <Rule '/browser/foreign-table/insert_sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.insert_sql_id>,
 <Rule '/browser/foreign-table/dependency/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.dependency_id>,
 <Rule '/browser/foreign-table/dependent/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.dependent_id>,
 <Rule '/browser/foreign-table/get_types/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_types_id>,
 <Rule '/browser/foreign-table/dependent/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.dependent_id>,
 <Rule '/browser/foreign-table/get_types/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_types_id>,
 <Rule '/browser/foreign-table/children/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.children_id>,
 <Rule '/browser/foreign-table/children/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.children_id>,
 <Rule '/browser/foreign-table/delete/<gid>/<sid>/<did>/<scid>/<foid>' (OPTIONS, DELETE) -> NODE-foreign-table.delete_id>,
 <Rule '/browser/foreign-table/delete/<gid>/<sid>/<did>/<scid>/<foid>' (OPTIONS, DELETE) -> NODE-foreign-table.delete_id>,
 <Rule '/browser/foreign-table/stats/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.stats_id>,
 <Rule '/browser/foreign-table/nodes/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.nodes_id>,
 <Rule '/browser/foreign-table/stats/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.stats_id>,
 <Rule '/browser/foreign-table/nodes/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.nodes_id>,
 <Rule '/browser/foreign-table/msql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.msql_id>,
 <Rule '/browser/foreign-table/msql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.msql_id>,
 <Rule '/browser/foreign-table/sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.sql_id>,
 <Rule '/browser/foreign-table/obj/<gid>/<sid>/<did>/<scid>/<foid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-foreign-table.obj_id>,
 <Rule '/browser/foreign-table/sql/<gid>/<sid>/<did>/<scid>/<foid>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.sql_id>,
 <Rule '/browser/foreign-table/obj/<gid>/<sid>/<did>/<scid>/<foid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-foreign-table.obj_id>,
 <Rule '/browser/fts_template/dependency/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.dependency_id>,
 <Rule '/browser/fts_template/get_lexize/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_lexize_id>,
 <Rule '/browser/fts_template/dependency/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.dependency_id>,
 <Rule '/browser/fts_template/get_lexize/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_lexize_id>,
 <Rule '/browser/fts_template/dependent/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.dependent_id>,
 <Rule '/browser/fts_template/dependent/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.dependent_id>,
 <Rule '/browser/fts_template/get_init/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_init_id>,
 <Rule '/browser/fts_template/children/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.children_id>,
 <Rule '/browser/fts_template/get_init/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_init_id>,
 <Rule '/browser/fts_template/children/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.children_id>,
 <Rule '/browser/fts_template/delete/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-fts_template.delete_id>,
 <Rule '/browser/fts_template/delete/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-fts_template.delete_id>,
 <Rule '/browser/user_mapping/nodes/<gid>/<sid>/<did>/<fid>/<fsid>/' (HEAD, OPTIONS, GET) -> NODE-user_mapping.nodes>,
 <Rule '/browser/fts_template/stats/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.stats_id>,
 <Rule '/browser/fts_template/nodes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.nodes_id>,
 <Rule '/browser/fts_template/stats/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.stats_id>,
 <Rule '/browser/fts_template/nodes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.nodes_id>,
 <Rule '/browser/user_mapping/msql/<gid>/<sid>/<did>/<fid>/<fsid>/' (HEAD, OPTIONS, GET) -> NODE-user_mapping.msql>,
 <Rule '/browser/fts_template/msql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.msql_id>,
 <Rule '/browser/fts_template/msql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.msql_id>,
 <Rule '/browser/user_mapping/obj/<gid>/<sid>/<did>/<fid>/<fsid>/' (HEAD, POST, OPTIONS, GET) -> NODE-user_mapping.obj>,
 <Rule '/browser/fts_template/sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.sql_id>,
 <Rule '/browser/fts_template/obj/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_template.obj_id>,
 <Rule '/browser/fts_template/sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-fts_template.sql_id>,
 <Rule '/browser/fts_template/obj/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_template.obj_id>,
 <Rule '/browser/foreign_key/get_coveringindex/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.get_coveringindex>,
 <Rule '/browser/foreign_key/get_coveringindex/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.get_coveringindex>,
 <Rule '/browser/foreign_key/indices/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.indices>,
 <Rule '/browser/foreign_key/indices/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.indices>,
 <Rule '/browser/constraints/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-constraints.nodes>,
 <Rule '/browser/foreign_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.nodes>,
 <Rule '/browser/primary_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-primary_key.nodes>,
 <Rule '/browser/constraints/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-constraints.nodes>,
 <Rule '/browser/foreign_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.nodes>,
 <Rule '/browser/primary_key/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-primary_key.nodes>,
 <Rule '/browser/foreign_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.msql>,
 <Rule '/browser/primary_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-primary_key.msql>,
 <Rule '/browser/foreign_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_key.msql>,
 <Rule '/browser/primary_key/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-primary_key.msql>,
 <Rule '/browser/constraints/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-constraints.proplist>,
 <Rule '/browser/foreign_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-foreign_key.obj>,
 <Rule '/browser/primary_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-primary_key.obj>,
 <Rule '/browser/constraints/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-constraints.proplist>,
 <Rule '/browser/foreign_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-foreign_key.obj>,
 <Rule '/browser/primary_key/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-primary_key.obj>,
 <Rule '/browser/fts_parser/headline_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.headline_functions_id>,
 <Rule '/browser/fts_parser/headline_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.headline_functions_id>,
 <Rule '/browser/fts_parser/lextype_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.lextype_functions_id>,
 <Rule '/browser/fts_parser/lextype_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.lextype_functions_id>,
 <Rule '/browser/fts_parser/start_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.start_functions_id>,
 <Rule '/browser/fts_parser/token_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.token_functions_id>,
 <Rule '/browser/fts_parser/start_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.start_functions_id>,
 <Rule '/browser/fts_parser/token_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.token_functions_id>,
 <Rule '/browser/fts_parser/end_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.end_functions_id>,
 <Rule '/browser/fts_parser/end_functions/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.end_functions_id>,
 <Rule '/browser/fts_parser/dependency/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.dependency_id>,
 <Rule '/browser/fts_parser/dependency/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.dependency_id>,
 <Rule '/browser/fts_parser/dependent/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.dependent_id>,
 <Rule '/browser/fts_parser/dependent/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.dependent_id>,
 <Rule '/browser/fts_parser/children/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.children_id>,
 <Rule '/browser/fts_parser/children/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.children_id>,
 <Rule '/browser/fts_parser/delete/<gid>/<sid>/<did>/<scid>/<pid>' (OPTIONS, DELETE) -> NODE-fts_parser.delete_id>,
 <Rule '/browser/fts_parser/delete/<gid>/<sid>/<did>/<scid>/<pid>' (OPTIONS, DELETE) -> NODE-fts_parser.delete_id>,
 <Rule '/browser/fts_parser/stats/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.stats_id>,
 <Rule '/browser/fts_parser/nodes/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.nodes_id>,
 <Rule '/browser/fts_parser/stats/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.stats_id>,
 <Rule '/browser/fts_parser/nodes/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.nodes_id>,
 <Rule '/browser/fts_parser/msql/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.msql_id>,
 <Rule '/browser/fts_parser/msql/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.msql_id>,
 <Rule '/browser/fts_parser/sql/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.sql_id>,
 <Rule '/browser/fts_parser/obj/<gid>/<sid>/<did>/<scid>/<pid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_parser.obj_id>,
 <Rule '/browser/fts_parser/sql/<gid>/<sid>/<did>/<scid>/<pid>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.sql_id>,
 <Rule '/browser/fts_parser/obj/<gid>/<sid>/<did>/<scid>/<pid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-fts_parser.obj_id>,
 <Rule '/browser/collation/get_collations/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.get_collations_id>,
 <Rule '/browser/collation/get_collations/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.get_collations_id>,
 <Rule '/browser/procedure/get_languages/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.get_languages_id>,
 <Rule '/browser/procedure/get_languages/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.get_languages_id>,
 <Rule '/browser/collation/dependency/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.dependency_id>,
 <Rule '/browser/procedure/dependency/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.dependency_id>,
 <Rule '/browser/procedure/select_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.select_sql_id>,
 <Rule '/browser/collation/dependency/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.dependency_id>,
 <Rule '/browser/procedure/dependency/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.dependency_id>,
 <Rule '/browser/procedure/select_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.select_sql_id>,
 <Rule '/browser/collation/dependent/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.dependent_id>,
 <Rule '/browser/procedure/dependent/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.dependent_id>,
 <Rule '/browser/procedure/get_types/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.get_types_id>,
 <Rule '/browser/collation/dependent/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.dependent_id>,
 <Rule '/browser/procedure/dependent/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.dependent_id>,
 <Rule '/browser/procedure/get_types/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.get_types_id>,
 <Rule '/browser/collation/children/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.children_id>,
 <Rule '/browser/procedure/exec_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.exec_sql_id>,
 <Rule '/browser/procedure/children/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.children_id>,
 <Rule '/browser/collation/children/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.children_id>,
 <Rule '/browser/procedure/exec_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.exec_sql_id>,
 <Rule '/browser/procedure/children/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.children_id>,
 <Rule '/browser/collation/delete/<gid>/<sid>/<did>/<scid>/<coid>' (OPTIONS, DELETE) -> NODE-collation.delete_id>,
 <Rule '/browser/procedure/delete/<gid>/<sid>/<did>/<scid>/<fnid>' (OPTIONS, DELETE) -> NODE-procedure.delete_id>,
 <Rule '/browser/collation/delete/<gid>/<sid>/<did>/<scid>/<coid>' (OPTIONS, DELETE) -> NODE-collation.delete_id>,
 <Rule '/browser/procedure/delete/<gid>/<sid>/<did>/<scid>/<fnid>' (OPTIONS, DELETE) -> NODE-procedure.delete_id>,
 <Rule '/browser/collation/stats/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.stats_id>,
 <Rule '/browser/collation/nodes/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.nodes_id>,
 <Rule '/browser/procedure/stats/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.stats_id>,
 <Rule '/browser/procedure/nodes/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.nodes_id>,
 <Rule '/browser/collation/stats/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.stats_id>,
 <Rule '/browser/collation/nodes/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.nodes_id>,
 <Rule '/browser/procedure/stats/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.stats_id>,
 <Rule '/browser/procedure/nodes/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.nodes_id>,
 <Rule '/browser/collation/msql/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.msql_id>,
 <Rule '/browser/procedure/msql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.msql_id>,
 <Rule '/browser/collation/msql/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.msql_id>,
 <Rule '/browser/procedure/msql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.msql_id>,
 <Rule '/browser/collation/sql/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.sql_id>,
 <Rule '/browser/collation/obj/<gid>/<sid>/<did>/<scid>/<coid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-collation.obj_id>,
 <Rule '/browser/procedure/sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.sql_id>,
 <Rule '/browser/procedure/obj/<gid>/<sid>/<did>/<scid>/<fnid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-procedure.obj_id>,
 <Rule '/browser/collation/sql/<gid>/<sid>/<did>/<scid>/<coid>' (HEAD, OPTIONS, GET) -> NODE-collation.sql_id>,
 <Rule '/browser/collation/obj/<gid>/<sid>/<did>/<scid>/<coid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-collation.obj_id>,
 <Rule '/browser/procedure/sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-procedure.sql_id>,
 <Rule '/browser/procedure/obj/<gid>/<sid>/<did>/<scid>/<fnid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-procedure.obj_id>,
 <Rule '/browser/function/get_languages/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.get_languages_id>,
 <Rule '/browser/function/get_languages/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.get_languages_id>,
 <Rule '/browser/function/dependency/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.dependency_id>,
 <Rule '/browser/function/select_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.select_sql_id>,
 <Rule '/browser/sequence/dependency/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.dependency_id>,
 <Rule '/browser/function/dependency/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.dependency_id>,
 <Rule '/browser/function/select_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.select_sql_id>,
 <Rule '/browser/sequence/dependency/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.dependency_id>,
 <Rule '/browser/function/dependent/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.dependent_id>,
 <Rule '/browser/function/get_types/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.get_types_id>,
 <Rule '/browser/sequence/dependent/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.dependent_id>,
 <Rule '/browser/function/dependent/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.dependent_id>,
 <Rule '/browser/function/get_types/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.get_types_id>,
 <Rule '/browser/sequence/dependent/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.dependent_id>,
 <Rule '/browser/function/exec_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.exec_sql_id>,
 <Rule '/browser/function/children/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.children_id>,
 <Rule '/browser/sequence/children/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.children_id>,
 <Rule '/browser/function/exec_sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.exec_sql_id>,
 <Rule '/browser/function/children/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.children_id>,
 <Rule '/browser/sequence/children/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.children_id>,
 <Rule '/browser/function/delete/<gid>/<sid>/<did>/<scid>/<fnid>' (OPTIONS, DELETE) -> NODE-function.delete_id>,
 <Rule '/browser/sequence/delete/<gid>/<sid>/<did>/<scid>/<seid>' (OPTIONS, DELETE) -> NODE-sequence.delete_id>,
 <Rule '/browser/function/delete/<gid>/<sid>/<did>/<scid>/<fnid>' (OPTIONS, DELETE) -> NODE-function.delete_id>,
 <Rule '/browser/sequence/delete/<gid>/<sid>/<did>/<scid>/<seid>' (OPTIONS, DELETE) -> NODE-sequence.delete_id>,
 <Rule '/browser/function/stats/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.stats_id>,
 <Rule '/browser/function/nodes/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.nodes_id>,
 <Rule '/browser/sequence/stats/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.stats_id>,
 <Rule '/browser/sequence/nodes/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.nodes_id>,
 <Rule '/browser/function/stats/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.stats_id>,
 <Rule '/browser/function/nodes/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.nodes_id>,
 <Rule '/browser/sequence/stats/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.stats_id>,
 <Rule '/browser/sequence/nodes/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.nodes_id>,
 <Rule '/browser/function/msql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.msql_id>,
 <Rule '/browser/sequence/msql/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.msql_id>,
 <Rule '/browser/function/msql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.msql_id>,
 <Rule '/browser/sequence/msql/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.msql_id>,
 <Rule '/browser/function/sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.sql_id>,
 <Rule '/browser/function/obj/<gid>/<sid>/<did>/<scid>/<fnid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-function.obj_id>,
 <Rule '/browser/sequence/obj/<gid>/<sid>/<did>/<scid>/<seid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-sequence.obj_id>,
 <Rule '/browser/sequence/sql/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.sql_id>,
 <Rule '/browser/function/sql/<gid>/<sid>/<did>/<scid>/<fnid>' (HEAD, OPTIONS, GET) -> NODE-function.sql_id>,
 <Rule '/browser/function/obj/<gid>/<sid>/<did>/<scid>/<fnid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-function.obj_id>,
 <Rule '/browser/sequence/obj/<gid>/<sid>/<did>/<scid>/<seid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-sequence.obj_id>,
 <Rule '/browser/sequence/sql/<gid>/<sid>/<did>/<scid>/<seid>' (HEAD, OPTIONS, GET) -> NODE-sequence.sql_id>,
 <Rule '/browser/trigger/get_triggerfunctions/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-trigger.get_triggerfunctions>,
 <Rule '/browser/trigger/get_triggerfunctions/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-trigger.get_triggerfunctions>,
 <Rule '/browser/trigger/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-trigger.nodes>,
 <Rule '/browser/trigger/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-trigger.nodes>,
 <Rule '/browser/trigger/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-trigger.msql>,
 <Rule '/browser/trigger/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-trigger.msql>,
 <Rule '/browser/trigger/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-trigger.obj>,
 <Rule '/browser/trigger/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-trigger.obj>,
 <Rule '/browser/domain/get_collations/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.get_collations_id>,
 <Rule '/browser/domain/get_collations/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.get_collations_id>,
 <Rule '/browser/domain/dependency/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.dependency_id>,
 <Rule '/browser/domain/dependency/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.dependency_id>,
 <Rule '/browser/domain/dependent/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.dependent_id>,
 <Rule '/browser/domain/get_types/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.get_types_id>,
 <Rule '/browser/domain/dependent/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.dependent_id>,
 <Rule '/browser/domain/get_types/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.get_types_id>,
 <Rule '/browser/domain/children/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.children_id>,
 <Rule '/browser/domain/children/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.children_id>,
 <Rule '/browser/domain/delete/<gid>/<sid>/<did>/<scid>/<doid>' (OPTIONS, DELETE) -> NODE-domain.delete_id>,
 <Rule '/browser/domain/delete/<gid>/<sid>/<did>/<scid>/<doid>' (OPTIONS, DELETE) -> NODE-domain.delete_id>,
 <Rule '/browser/domain/stats/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.stats_id>,
 <Rule '/browser/domain/nodes/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.nodes_id>,
 <Rule '/browser/column/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-column.nodes>,
 <Rule '/browser/domain/stats/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.stats_id>,
 <Rule '/browser/domain/nodes/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.nodes_id>,
 <Rule '/browser/column/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-column.nodes>,
 <Rule '/browser/domain/msql/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.msql_id>,
 <Rule '/browser/column/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-column.msql>,
 <Rule '/browser/domain/msql/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.msql_id>,
 <Rule '/browser/column/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-column.msql>,
 <Rule '/browser/domain/sql/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.sql_id>,
 <Rule '/browser/domain/obj/<gid>/<sid>/<did>/<scid>/<doid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-domain.obj_id>,
 <Rule '/browser/column/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-column.obj>,
 <Rule '/browser/domain/sql/<gid>/<sid>/<did>/<scid>/<doid>' (HEAD, OPTIONS, GET) -> NODE-domain.sql_id>,
 <Rule '/browser/domain/obj/<gid>/<sid>/<did>/<scid>/<doid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-domain.obj_id>,
 <Rule '/browser/column/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-column.obj>,
 <Rule '/browser/mview/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.get_toast_table_vacuum_id>,
 <Rule '/browser/mview/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.get_toast_table_vacuum_id>,
 <Rule '/browser/index/get_access_methods/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.get_access_methods>,
 <Rule '/browser/index/get_access_methods/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.get_access_methods>,
 <Rule '/browser/mview/get_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.get_table_vacuum_id>,
 <Rule '/browser/mview/get_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.get_table_vacuum_id>,
 <Rule '/browser/index/get_collations/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.get_collations>,
 <Rule '/browser/index/get_collations/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.get_collations>,
 <Rule '/browser/table/get_relations/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_relations_id>,
 <Rule '/browser/table/get_relations/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_relations_id>,
 <Rule '/browser/table/get_inherits/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_inherits_id>,
 <Rule '/browser/index/get_op_class/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.get_op_class>,
 <Rule '/browser/mview/refresh_data/<gid>/<sid>/<did>/<scid>/<vid>' (PUT, OPTIONS) -> NODE-mview.refresh_data_id>,
 <Rule '/browser/table/get_inherits/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_inherits_id>,
 <Rule '/browser/index/get_op_class/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.get_op_class>,
 <Rule '/browser/mview/refresh_data/<gid>/<sid>/<did>/<scid>/<vid>' (PUT, OPTIONS) -> NODE-mview.refresh_data_id>,
 <Rule '/browser/table/set_trigger/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, OPTIONS) -> NODE-table.set_trigger_id>,
 <Rule '/browser/table/get_columns/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_columns_id>,
 <Rule '/browser/table/set_trigger/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, OPTIONS) -> NODE-table.set_trigger_id>,
 <Rule '/browser/table/get_columns/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_columns_id>,
 <Rule '/browser/table/get_oftype/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_oftype_id>,
 <Rule '/browser/table/update_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.update_sql_id>,
 <Rule '/browser/table/insert_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.insert_sql_id>,
 <Rule '/browser/table/select_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.select_sql_id>,
 <Rule '/browser/table/delete_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.delete_sql_id>,
 <Rule '/browser/table/dependency/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.dependency_id>,
 <Rule '/browser/mview/get_tblspc/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.get_tblspc_id>,
 <Rule '/browser/mview/select_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.select_sql_id>,
 <Rule '/browser/mview/dependency/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.dependency_id>,
 <Rule '/browser/mview/insert_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.insert_sql_id>,
 <Rule '/browser/table/get_oftype/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_oftype_id>,
 <Rule '/browser/table/update_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.update_sql_id>,
 <Rule '/browser/table/insert_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.insert_sql_id>,
 <Rule '/browser/table/select_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.select_sql_id>,
 <Rule '/browser/table/delete_sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.delete_sql_id>,
 <Rule '/browser/table/dependency/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.dependency_id>,
 <Rule '/browser/mview/get_tblspc/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.get_tblspc_id>,
 <Rule '/browser/mview/select_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.select_sql_id>,
 <Rule '/browser/mview/dependency/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.dependency_id>,
 <Rule '/browser/mview/insert_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.insert_sql_id>,
 <Rule '/browser/table/dependent/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.dependent_id>,
 <Rule '/browser/table/get_types/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_types_id>,
 <Rule '/browser/mview/dependent/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.dependent_id>,
 <Rule '/browser/table/dependent/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.dependent_id>,
 <Rule '/browser/table/get_types/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.get_types_id>,
 <Rule '/browser/mview/dependent/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.dependent_id>,
 <Rule '/browser/table/children/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.children_id>,
 <Rule '/browser/table/truncate/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, OPTIONS) -> NODE-table.truncate_id>,
 <Rule '/browser/mview/children/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.children_id>,
 <Rule '/browser/table/children/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.children_id>,
 <Rule '/browser/table/truncate/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, OPTIONS) -> NODE-table.truncate_id>,
 <Rule '/browser/mview/children/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.children_id>,
 <Rule '/browser/mview/configs/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.configs_id>,
 <Rule '/browser/mview/configs/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.configs_id>,
 <Rule '/browser/table/delete/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-table.delete_id>,
 <Rule '/browser/mview/delete/<gid>/<sid>/<did>/<scid>/<vid>' (OPTIONS, DELETE) -> NODE-mview.delete_id>,
 <Rule '/browser/table/delete/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-table.delete_id>,
 <Rule '/browser/mview/delete/<gid>/<sid>/<did>/<scid>/<vid>' (OPTIONS, DELETE) -> NODE-mview.delete_id>,
 <Rule '/browser/table/reset/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-table.reset_id>,
 <Rule '/browser/table/stats/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.stats_id>,
 <Rule '/browser/table/nodes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.nodes_id>,
 <Rule '/browser/index/stats/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.stats>,
 <Rule '/browser/index/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.nodes>,
 <Rule '/browser/mview/stats/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.stats_id>,
 <Rule '/browser/mview/nodes/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.nodes_id>,
 <Rule '/browser/table/reset/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-table.reset_id>,
 <Rule '/browser/table/stats/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.stats_id>,
 <Rule '/browser/table/nodes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.nodes_id>,
 <Rule '/browser/index/stats/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.stats>,
 <Rule '/browser/index/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.nodes>,
 <Rule '/browser/mview/stats/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.stats_id>,
 <Rule '/browser/mview/nodes/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.nodes_id>,
 <Rule '/browser/table/msql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.msql_id>,
 <Rule '/browser/index/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.msql>,
 <Rule '/browser/mview/msql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.msql_id>,
 <Rule '/browser/table/msql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.msql_id>,
 <Rule '/browser/index/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-index.msql>,
 <Rule '/browser/mview/msql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.msql_id>,
 <Rule '/browser/table/sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.sql_id>,
 <Rule '/browser/table/obj/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-table.obj_id>,
 <Rule '/browser/index/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-index.obj>,
 <Rule '/browser/mview/sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.sql_id>,
 <Rule '/browser/mview/obj/<gid>/<sid>/<did>/<scid>/<vid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-mview.obj_id>,
 <Rule '/browser/table/sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-table.sql_id>,
 <Rule '/browser/table/obj/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-table.obj_id>,
 <Rule '/browser/index/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-index.obj>,
 <Rule '/browser/mview/sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-mview.sql_id>,
 <Rule '/browser/mview/obj/<gid>/<sid>/<did>/<scid>/<vid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-mview.obj_id>,
 <Rule '/browser/type/get_external_functions/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_external_functions_id>,
 <Rule '/browser/view/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.get_toast_table_vacuum_id>,
 <Rule '/browser/type/get_external_functions/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_external_functions_id>,
 <Rule '/browser/view/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.get_toast_table_vacuum_id>,
 <Rule '/browser/view/get_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.get_table_vacuum_id>,
 <Rule '/browser/view/get_table_vacuum/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.get_table_vacuum_id>,
 <Rule '/browser/type/get_collations/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_collations_id>,
 <Rule '/browser/type/get_subopclass/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_subopclass_id>,
 <Rule '/browser/type/get_collations/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_collations_id>,
 <Rule '/browser/type/get_subopclass/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_subopclass_id>,
 <Rule '/browser/type/get_canonical/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_canonical_id>,
 <Rule '/browser/type/get_stypediff/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_stypediff_id>,
 <Rule '/browser/type/get_canonical/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_canonical_id>,
 <Rule '/browser/type/get_stypediff/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_stypediff_id>,
 <Rule '/browser/type/get_stypes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_stypes_id>,
 <Rule '/browser/type/dependency/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.dependency_id>,
 <Rule '/browser/view/get_tblspc/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.get_tblspc_id>,
 <Rule '/browser/view/select_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.select_sql_id>,
 <Rule '/browser/view/insert_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.insert_sql_id>,
 <Rule '/browser/view/dependency/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.dependency_id>,
 <Rule '/browser/type/get_stypes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_stypes_id>,
 <Rule '/browser/type/dependency/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.dependency_id>,
 <Rule '/browser/view/get_tblspc/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.get_tblspc_id>,
 <Rule '/browser/view/select_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.select_sql_id>,
 <Rule '/browser/view/insert_sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.insert_sql_id>,
 <Rule '/browser/view/dependency/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.dependency_id>,
 <Rule '/browser/type/dependent/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.dependent_id>,
 <Rule '/browser/type/get_types/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_types_id>,
 <Rule '/browser/view/dependent/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.dependent_id>,
 <Rule '/browser/type/dependent/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.dependent_id>,
 <Rule '/browser/type/get_types/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.get_types_id>,
 <Rule '/browser/view/dependent/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.dependent_id>,
 <Rule '/browser/type/children/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.children_id>,
 <Rule '/browser/view/children/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.children_id>,
 <Rule '/browser/type/children/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.children_id>,
 <Rule '/browser/view/children/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.children_id>,
 <Rule '/browser/view/configs/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.configs_id>,
 <Rule '/browser/view/configs/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.configs_id>,
 <Rule '/browser/type/delete/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-type.delete_id>,
 <Rule '/browser/view/delete/<gid>/<sid>/<did>/<scid>/<vid>' (OPTIONS, DELETE) -> NODE-view.delete_id>,
 <Rule '/browser/type/delete/<gid>/<sid>/<did>/<scid>/<tid>' (OPTIONS, DELETE) -> NODE-type.delete_id>,
 <Rule '/browser/view/delete/<gid>/<sid>/<did>/<scid>/<vid>' (OPTIONS, DELETE) -> NODE-view.delete_id>,
 <Rule '/browser/rule/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-rule.nodes>,
 <Rule '/browser/type/stats/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.stats_id>,
 <Rule '/browser/type/nodes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.nodes_id>,
 <Rule '/browser/view/stats/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.stats_id>,
 <Rule '/browser/view/nodes/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.nodes_id>,
 <Rule '/browser/rule/nodes/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-rule.nodes>,
 <Rule '/browser/type/stats/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.stats_id>,
 <Rule '/browser/type/nodes/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.nodes_id>,
 <Rule '/browser/view/stats/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.stats_id>,
 <Rule '/browser/view/nodes/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.nodes_id>,
 <Rule '/browser/rule/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-rule.msql>,
 <Rule '/browser/type/msql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.msql_id>,
 <Rule '/browser/view/msql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.msql_id>,
 <Rule '/browser/rule/msql/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, OPTIONS, GET) -> NODE-rule.msql>,
 <Rule '/browser/type/msql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.msql_id>,
 <Rule '/browser/view/msql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.msql_id>,
 <Rule '/browser/rule/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-rule.obj>,
 <Rule '/browser/type/sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.sql_id>,
 <Rule '/browser/type/obj/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-type.obj_id>,
 <Rule '/browser/view/sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.sql_id>,
 <Rule '/browser/view/obj/<gid>/<sid>/<did>/<scid>/<vid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-view.obj_id>,
 <Rule '/browser/rule/obj/<gid>/<sid>/<did>/<scid>/<tid>/' (HEAD, POST, OPTIONS, GET) -> NODE-rule.obj>,
 <Rule '/browser/type/sql/<gid>/<sid>/<did>/<scid>/<tid>' (HEAD, OPTIONS, GET) -> NODE-type.sql_id>,
 <Rule '/browser/type/obj/<gid>/<sid>/<did>/<scid>/<tid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-type.obj_id>,
 <Rule '/browser/view/sql/<gid>/<sid>/<did>/<scid>/<vid>' (HEAD, OPTIONS, GET) -> NODE-view.sql_id>,
 <Rule '/browser/view/obj/<gid>/<sid>/<did>/<scid>/<vid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-view.obj_id>,
 <Rule '/grant_wizard/properties/<gid>/<sid>/<did>/<node_id>/<node_type>/' (HEAD, POST, OPTIONS, GET) -> grant_wizard.properties>,
 <Rule '/debugger/initialize_target/<debug_type>/<sid>/<did>/<scid>/<func_id>' (HEAD, POST, OPTIONS, GET) -> debugger.initialize_target>,
 <Rule '/debugger/init/<node_type>/<sid>/<did>/<scid>/<fid>' (HEAD, OPTIONS, GET) -> debugger.init_function>,
 <Rule '/browser/foreign_data_wrapper/dependency/<gid>/<sid>/<did>/<fid>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.dependency_id>,
 <Rule '/browser/foreign_data_wrapper/dependent/<gid>/<sid>/<did>/<fid>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.dependent_id>,
 <Rule '/browser/foreign_data_wrapper/children/<gid>/<sid>/<did>/<fid>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.children_id>,
 <Rule '/browser/foreign_data_wrapper/delete/<gid>/<sid>/<did>/<fid>' (OPTIONS, DELETE) -> NODE-foreign_data_wrapper.delete_id>,
 <Rule '/browser/foreign_data_wrapper/stats/<gid>/<sid>/<did>/<fid>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.stats_id>,
 <Rule '/browser/foreign_data_wrapper/nodes/<gid>/<sid>/<did>/<fid>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.nodes_id>,
 <Rule '/browser/foreign_data_wrapper/msql/<gid>/<sid>/<did>/<fid>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.msql_id>,
 <Rule '/browser/foreign_data_wrapper/sql/<gid>/<sid>/<did>/<fid>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.sql_id>,
 <Rule '/browser/foreign_data_wrapper/obj/<gid>/<sid>/<did>/<fid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-foreign_data_wrapper.obj_id>,
 <Rule '/browser/fts_configuration/dictionaries/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.dictionaries>,
 <Rule '/browser/fts_configuration/dictionaries/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.dictionaries>,
 <Rule '/browser/fts_configuration/copyConfig/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.copyConfig>,
 <Rule '/browser/fts_configuration/copyConfig/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.copyConfig>,
 <Rule '/browser/fts_configuration/parsers/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.parsers>,
 <Rule '/browser/fts_configuration/parsers/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.parsers>,
 <Rule '/browser/fts_configuration/tokens/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.tokens>,
 <Rule '/browser/fts_configuration/tokens/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.tokens>,
 <Rule '/browser/fts_configuration/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.nodes>,
 <Rule '/browser/fts_configuration/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.nodes>,
 <Rule '/browser/fts_configuration/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.msql>,
 <Rule '/browser/fts_configuration/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.msql>,
 <Rule '/browser/fts_configuration/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_configuration.obj>,
 <Rule '/browser/fts_configuration/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_configuration.obj>,
 <Rule '/browser/trigger_function/get_languages/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_languages>,
 <Rule '/browser/trigger_function/get_languages/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_languages>,
 <Rule '/browser/trigger_function/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_types>,
 <Rule '/browser/trigger_function/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.get_types>,
 <Rule '/browser/trigger_function/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.stats>,
 <Rule '/browser/trigger_function/vopts/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.vopts>,
 <Rule '/browser/trigger_function/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.nodes>,
 <Rule '/browser/trigger_function/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.stats>,
 <Rule '/browser/trigger_function/vopts/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.vopts>,
 <Rule '/browser/trigger_function/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.nodes>,
 <Rule '/browser/trigger_function/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.msql>,
 <Rule '/browser/trigger_function/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-trigger_function.msql>,
 <Rule '/browser/trigger_function/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-trigger_function.obj>,
 <Rule '/browser/trigger_function/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-trigger_function.obj>,
 <Rule '/browser/fts_dictionary/fetch_templates/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.fetch_templates>,
 <Rule '/browser/fts_dictionary/fetch_templates/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.fetch_templates>,
 <Rule '/browser/foreign_server/nodes/<gid>/<sid>/<did>/<fid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_server.nodes>,
 <Rule '/browser/catalog_object/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object.nodes>,
 <Rule '/browser/fts_dictionary/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.nodes>,
 <Rule '/browser/catalog_object/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object.nodes>,
 <Rule '/browser/fts_dictionary/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.nodes>,
 <Rule '/browser/foreign_server/msql/<gid>/<sid>/<did>/<fid>/' (HEAD, OPTIONS, GET) -> NODE-foreign_server.msql>,
 <Rule '/browser/fts_dictionary/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.msql>,
 <Rule '/browser/fts_dictionary/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.msql>,
 <Rule '/browser/foreign_server/obj/<gid>/<sid>/<did>/<fid>/' (HEAD, POST, OPTIONS, GET) -> NODE-foreign_server.obj>,
 <Rule '/browser/catalog_object/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object.obj>,
 <Rule '/browser/fts_dictionary/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_dictionary.obj>,
 <Rule '/browser/catalog_object/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-catalog_object.obj>,
 <Rule '/browser/fts_dictionary/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_dictionary.obj>,
 <Rule '/browser/foreign-table/get_foreign_servers/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_foreign_servers>,
 <Rule '/browser/foreign-table/get_foreign_servers/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_foreign_servers>,
 <Rule '/browser/foreign-table/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_collations>,
 <Rule '/browser/foreign-table/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_collations>,
 <Rule '/browser/foreign-table/get_columns/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_columns>,
 <Rule '/browser/foreign-table/get_columns/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_columns>,
 <Rule '/browser/event_trigger/dependency/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.dependency_id>,
 <Rule '/browser/foreign-table/get_tables/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_tables>,
 <Rule '/browser/foreign-table/get_tables/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_tables>,
 <Rule '/browser/event_trigger/dependent/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.dependent_id>,
 <Rule '/browser/foreign-table/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_types>,
 <Rule '/browser/foreign-table/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.get_types>,
 <Rule '/browser/event_trigger/children/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.children_id>,
 <Rule '/browser/event_trigger/fopts/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.fopts_id>,
 <Rule '/browser/event_trigger/stats/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.stats_id>,
 <Rule '/browser/event_trigger/nodes/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.nodes_id>,
 <Rule '/browser/foreign-table/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.nodes>,
 <Rule '/browser/foreign-table/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.nodes>,
 <Rule '/browser/event_trigger/msql/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.msql_id>,
 <Rule '/browser/foreign-table/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.msql>,
 <Rule '/browser/foreign-table/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-foreign-table.msql>,
 <Rule '/browser/event_trigger/obj/<gid>/<sid>/<did>/<etid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-event_trigger.obj_id>,
 <Rule '/browser/event_trigger/sql/<gid>/<sid>/<did>/<etid>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.sql_id>,
 <Rule '/browser/foreign-table/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-foreign-table.obj>,
 <Rule '/browser/foreign-table/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-foreign-table.obj>,
 <Rule '/browser/fts_template/get_lexize/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_lexize>,
 <Rule '/browser/fts_template/get_lexize/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_lexize>,
 <Rule '/browser/fts_template/get_init/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_init>,
 <Rule '/browser/fts_template/get_init/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.get_init>,
 <Rule '/browser/fts_template/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.nodes>,
 <Rule '/browser/fts_template/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.nodes>,
 <Rule '/browser/fts_template/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.msql>,
 <Rule '/browser/fts_template/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_template.msql>,
 <Rule '/browser/fts_template/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_template.obj>,
 <Rule '/browser/fts_template/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_template.obj>,
 <Rule '/browser/fts_parser/headline_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.headline_functions>,
 <Rule '/browser/fts_parser/headline_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.headline_functions>,
 <Rule '/browser/fts_parser/lextype_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.lextype_functions>,
 <Rule '/browser/fts_parser/lextype_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.lextype_functions>,
 <Rule '/browser/fts_parser/start_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.start_functions>,
 <Rule '/browser/fts_parser/token_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.token_functions>,
 <Rule '/browser/fts_parser/start_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.start_functions>,
 <Rule '/browser/fts_parser/token_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.token_functions>,
 <Rule '/browser/fts_parser/end_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.end_functions>,
 <Rule '/browser/fts_parser/end_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.end_functions>,
 <Rule '/browser/fts_parser/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.nodes>,
 <Rule '/browser/fts_parser/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.nodes>,
 <Rule '/browser/fts_parser/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.msql>,
 <Rule '/browser/fts_parser/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-fts_parser.msql>,
 <Rule '/browser/fts_parser/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_parser.obj>,
 <Rule '/browser/fts_parser/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-fts_parser.obj>,
 <Rule '/browser/collation/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-collation.get_collations>,
 <Rule '/browser/collation/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-collation.get_collations>,
 <Rule '/browser/procedure/get_languages/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.get_languages>,
 <Rule '/browser/procedure/get_languages/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.get_languages>,
 <Rule '/browser/extension/dependency/<gid>/<sid>/<did>/<eid>' (HEAD, OPTIONS, GET) -> NODE-extension.dependency_id>,
 <Rule '/browser/extension/dependent/<gid>/<sid>/<did>/<eid>' (HEAD, OPTIONS, GET) -> NODE-extension.dependent_id>,
 <Rule '/browser/procedure/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.get_types>,
 <Rule '/browser/procedure/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.get_types>,
 <Rule '/browser/extension/children/<gid>/<sid>/<did>/<eid>' (HEAD, OPTIONS, GET) -> NODE-extension.children_id>,
 <Rule '/browser/extension/delete/<gid>/<sid>/<did>/<eid>' (OPTIONS, DELETE) -> NODE-extension.delete_id>,
 <Rule '/browser/extension/stats/<gid>/<sid>/<did>/<eid>' (HEAD, OPTIONS, GET) -> NODE-extension.stats_id>,
 <Rule '/browser/extension/nodes/<gid>/<sid>/<did>/<eid>' (HEAD, OPTIONS, GET) -> NODE-extension.nodes_id>,
 <Rule '/browser/collation/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-collation.nodes>,
 <Rule '/browser/procedure/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.stats>,
 <Rule '/browser/procedure/vopts/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.vopts>,
 <Rule '/browser/procedure/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.nodes>,
 <Rule '/browser/collation/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-collation.nodes>,
 <Rule '/browser/procedure/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.stats>,
 <Rule '/browser/procedure/vopts/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.vopts>,
 <Rule '/browser/procedure/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.nodes>,
 <Rule '/browser/extension/msql/<gid>/<sid>/<did>/<eid>' (HEAD, OPTIONS, GET) -> NODE-extension.msql_id>,
 <Rule '/browser/collation/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-collation.msql>,
 <Rule '/browser/procedure/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.msql>,
 <Rule '/browser/collation/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-collation.msql>,
 <Rule '/browser/procedure/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-procedure.msql>,
 <Rule '/browser/extension/sql/<gid>/<sid>/<did>/<eid>' (HEAD, OPTIONS, GET) -> NODE-extension.sql_id>,
 <Rule '/browser/extension/obj/<gid>/<sid>/<did>/<eid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-extension.obj_id>,
 <Rule '/browser/collation/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-collation.obj>,
 <Rule '/browser/procedure/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-procedure.obj>,
 <Rule '/browser/collation/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-collation.obj>,
 <Rule '/browser/procedure/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-procedure.obj>,
 <Rule '/browser/function/get_languages/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.get_languages>,
 <Rule '/browser/function/get_languages/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.get_languages>,
 <Rule '/browser/language/dependency/<gid>/<sid>/<did>/<lid>' (HEAD, OPTIONS, GET) -> NODE-language.dependency_id>,
 <Rule '/browser/language/dependent/<gid>/<sid>/<did>/<lid>' (HEAD, OPTIONS, GET) -> NODE-language.dependent_id>,
 <Rule '/browser/function/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.get_types>,
 <Rule '/browser/function/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.get_types>,
 <Rule '/browser/language/stats/<gid>/<sid>/<did>/<lid>' (HEAD, OPTIONS, GET) -> NODE-language.stats_id>,
 <Rule '/browser/language/nodes/<gid>/<sid>/<did>/<lid>' (HEAD, OPTIONS, GET) -> NODE-language.nodes_id>,
 <Rule '/browser/function/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.stats>,
 <Rule '/browser/function/vopts/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.vopts>,
 <Rule '/browser/function/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.nodes>,
 <Rule '/browser/sequence/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-sequence.stats>,
 <Rule '/browser/sequence/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-sequence.nodes>,
 <Rule '/browser/function/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.stats>,
 <Rule '/browser/function/vopts/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.vopts>,
 <Rule '/browser/function/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.nodes>,
 <Rule '/browser/sequence/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-sequence.stats>,
 <Rule '/browser/sequence/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-sequence.nodes>,
 <Rule '/browser/language/msql/<gid>/<sid>/<did>/<lid>' (HEAD, OPTIONS, GET) -> NODE-language.msql_id>,
 <Rule '/browser/function/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.msql>,
 <Rule '/browser/sequence/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-sequence.msql>,
 <Rule '/browser/function/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-function.msql>,
 <Rule '/browser/sequence/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-sequence.msql>,
 <Rule '/browser/language/obj/<gid>/<sid>/<did>/<lid>' (PUT, HEAD, OPTIONS, GET) -> NODE-language.obj_id>,
 <Rule '/browser/language/sql/<gid>/<sid>/<did>/<lid>' (HEAD, OPTIONS, GET) -> NODE-language.sql_id>,
 <Rule '/browser/function/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-function.obj>,
 <Rule '/browser/sequence/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-sequence.obj>,
 <Rule '/browser/function/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-function.obj>,
 <Rule '/browser/sequence/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-sequence.obj>,
 <Rule '/browser/catalog/dependency/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-catalog.dependency_id>,
 <Rule '/browser/catalog/dependent/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-catalog.dependent_id>,
 <Rule '/browser/catalog/children/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-catalog.children_id>,
 <Rule '/browser/catalog/delete/<gid>/<sid>/<did>/<scid>' (OPTIONS, DELETE) -> NODE-catalog.delete_id>,
 <Rule '/browser/catalog/stats/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-catalog.stats_id>,
 <Rule '/browser/catalog/nodes/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-catalog.nodes_id>,
 <Rule '/browser/catalog/msql/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-catalog.msql_id>,
 <Rule '/browser/catalog/obj/<gid>/<sid>/<did>/<scid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-catalog.obj_id>,
 <Rule '/browser/catalog/sql/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-catalog.sql_id>,
 <Rule '/browser/domain/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.get_collations>,
 <Rule '/browser/domain/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.get_collations>,
 <Rule '/browser/schema/dependency/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-schema.dependency_id>,
 <Rule '/browser/schema/dependent/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-schema.dependent_id>,
 <Rule '/browser/domain/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.get_types>,
 <Rule '/browser/domain/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.get_types>,
 <Rule '/browser/schema/children/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-schema.children_id>,
 <Rule '/browser/schema/delete/<gid>/<sid>/<did>/<scid>' (OPTIONS, DELETE) -> NODE-schema.delete_id>,
 <Rule '/browser/schema/stats/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-schema.stats_id>,
 <Rule '/browser/schema/nodes/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-schema.nodes_id>,
 <Rule '/browser/domain/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.nodes>,
 <Rule '/browser/domain/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.nodes>,
 <Rule '/browser/schema/msql/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-schema.msql_id>,
 <Rule '/browser/domain/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.msql>,
 <Rule '/browser/domain/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-domain.msql>,
 <Rule '/browser/schema/obj/<gid>/<sid>/<did>/<scid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-schema.obj_id>,
 <Rule '/browser/schema/sql/<gid>/<sid>/<did>/<scid>' (HEAD, OPTIONS, GET) -> NODE-schema.sql_id>,
 <Rule '/browser/domain/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-domain.obj>,
 <Rule '/browser/domain/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-domain.obj>,
 <Rule '/browser/table/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_toast_table_vacuum>,
 <Rule '/browser/mview/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.get_toast_table_vacuum>,
 <Rule '/browser/table/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_toast_table_vacuum>,
 <Rule '/browser/mview/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.get_toast_table_vacuum>,
 <Rule '/browser/table/get_access_methods/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_access_methods>,
 <Rule '/browser/table/get_access_methods/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_access_methods>,
 <Rule '/browser/table/get_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_table_vacuum>,
 <Rule '/browser/mview/get_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.get_table_vacuum>,
 <Rule '/browser/table/get_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_table_vacuum>,
 <Rule '/browser/mview/get_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.get_table_vacuum>,
 <Rule '/browser/table/get_oper_class/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_oper_class>,
 <Rule '/browser/table/get_oper_class/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_oper_class>,
 <Rule '/browser/table/get_relations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_relations>,
 <Rule '/browser/table/get_relations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_relations>,
 <Rule '/browser/table/get_operator/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_operator>,
 <Rule '/browser/table/get_inherits/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_inherits>,
 <Rule '/browser/table/get_operator/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_operator>,
 <Rule '/browser/table/get_inherits/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_inherits>,
 <Rule '/browser/table/get_columns/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_columns>,
 <Rule '/browser/table/get_columns/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_columns>,
 <Rule '/browser/table/get_oftype/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_oftype>,
 <Rule '/browser/table/all_tables/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.all_tables>,
 <Rule '/browser/mview/get_tblspc/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.get_tblspc>,
 <Rule '/browser/mview/select_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.select_sql>,
 <Rule '/browser/mview/insert_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.insert_sql>,
 <Rule '/browser/table/get_oftype/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_oftype>,
 <Rule '/browser/table/all_tables/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.all_tables>,
 <Rule '/browser/mview/get_tblspc/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.get_tblspc>,
 <Rule '/browser/mview/select_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.select_sql>,
 <Rule '/browser/mview/insert_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.insert_sql>,
 <Rule '/browser/table/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_types>,
 <Rule '/browser/table/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.get_types>,
 <Rule '/browser/table/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.stats>,
 <Rule '/browser/table/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.nodes>,
 <Rule '/browser/mview/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.nodes>,
 <Rule '/browser/table/stats/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.stats>,
 <Rule '/browser/table/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.nodes>,
 <Rule '/browser/mview/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.nodes>,
 <Rule '/browser/table/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.msql>,
 <Rule '/browser/mview/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.msql>,
 <Rule '/browser/table/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-table.msql>,
 <Rule '/browser/mview/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-mview.msql>,
 <Rule '/browser/table/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-table.obj>,
 <Rule '/browser/mview/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-mview.obj>,
 <Rule '/browser/table/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-table.obj>,
 <Rule '/browser/mview/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-mview.obj>,
 <Rule '/browser/type/get_external_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_external_functions>,
 <Rule '/browser/view/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.get_toast_table_vacuum>,
 <Rule '/browser/type/get_external_functions/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_external_functions>,
 <Rule '/browser/view/get_toast_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.get_toast_table_vacuum>,
 <Rule '/browser/view/get_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.get_table_vacuum>,
 <Rule '/browser/view/get_table_vacuum/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.get_table_vacuum>,
 <Rule '/browser/type/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_collations>,
 <Rule '/browser/type/get_subopclass/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_subopclass>,
 <Rule '/browser/type/get_collations/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_collations>,
 <Rule '/browser/type/get_subopclass/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_subopclass>,
 <Rule '/browser/cast/get_functions/<gid>/<sid>/<did>/<cid>' (POST, OPTIONS) -> NODE-cast.get_functions_id>,
 <Rule '/browser/type/get_canonical/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_canonical>,
 <Rule '/browser/type/get_stypediff/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_stypediff>,
 <Rule '/browser/type/get_canonical/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_canonical>,
 <Rule '/browser/type/get_stypediff/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_stypediff>,
 <Rule '/browser/cast/dependency/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.dependency_id>,
 <Rule '/browser/type/get_stypes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_stypes>,
 <Rule '/browser/view/get_tblspc/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.get_tblspc>,
 <Rule '/browser/view/select_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.select_sql>,
 <Rule '/browser/view/insert_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.insert_sql>,
 <Rule '/browser/type/get_stypes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_stypes>,
 <Rule '/browser/view/get_tblspc/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.get_tblspc>,
 <Rule '/browser/view/select_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.select_sql>,
 <Rule '/browser/view/insert_sql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.insert_sql>,
 <Rule '/browser/cast/dependent/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.dependent_id>,
 <Rule '/browser/type/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_types>,
 <Rule '/browser/type/get_types/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.get_types>,
 <Rule '/browser/cast/get_type/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.get_type_id>,
 <Rule '/browser/cast/children/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.children_id>,
 <Rule '/browser/cast/delete/<gid>/<sid>/<did>/<cid>' (OPTIONS, DELETE) -> NODE-cast.delete_id>,
 <Rule '/browser/cast/stats/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.stats_id>,
 <Rule '/browser/cast/nodes/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.nodes_id>,
 <Rule '/browser/type/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.nodes>,
 <Rule '/browser/view/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.nodes>,
 <Rule '/browser/type/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.nodes>,
 <Rule '/browser/view/nodes/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.nodes>,
 <Rule '/browser/cast/msql/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.msql_id>,
 <Rule '/browser/type/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.msql>,
 <Rule '/browser/view/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.msql>,
 <Rule '/browser/type/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-type.msql>,
 <Rule '/browser/view/msql/<gid>/<sid>/<did>/<scid>/' (HEAD, OPTIONS, GET) -> NODE-view.msql>,
 <Rule '/browser/cast/sql/<gid>/<sid>/<did>/<cid>' (HEAD, OPTIONS, GET) -> NODE-cast.sql_id>,
 <Rule '/browser/cast/obj/<gid>/<sid>/<did>/<cid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-cast.obj_id>,
 <Rule '/browser/type/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-type.obj>,
 <Rule '/browser/view/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-view.obj>,
 <Rule '/browser/type/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-type.obj>,
 <Rule '/browser/view/obj/<gid>/<sid>/<did>/<scid>/' (HEAD, POST, OPTIONS, GET) -> NODE-view.obj>,
 <Rule '/debugger/get_arguments/<sid>/<did>/<scid>/<func_id>' (HEAD, OPTIONS, GET) -> debugger.get_arguments_sqlite>,
 <Rule '/debugger/set_arguments/<sid>/<did>/<scid>/<func_id>' (POST, OPTIONS) -> debugger.set_arguments_sqlite>,
 <Rule '/datagrid/filter/validate/<sid>/<did>/<obj_id>' (PUT, POST, OPTIONS) -> datagrid.validate_filter>,
 <Rule '/browser/foreign_data_wrapper/get_validators/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.get_validators>,
 <Rule '/browser/foreign_data_wrapper/get_handlers/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.get_handlers>,
 <Rule '/browser/foreign_data_wrapper/nodes/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.nodes>,
 <Rule '/browser/foreign_data_wrapper/msql/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.msql>,
 <Rule '/browser/foreign_data_wrapper/obj/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> NODE-foreign_data_wrapper.obj>,
 <Rule '/browser/resource_group/dependency/<gid>/<sid>/<rg_id>' (HEAD, OPTIONS, GET) -> NODE-resource_group.dependency_id>,
 <Rule '/browser/resource_group/dependent/<gid>/<sid>/<rg_id>' (HEAD, OPTIONS, GET) -> NODE-resource_group.dependent_id>,
 <Rule '/browser/resource_group/stats/<gid>/<sid>/<rg_id>' (HEAD, OPTIONS, GET) -> NODE-resource_group.stats_id>,
 <Rule '/browser/resource_group/nodes/<gid>/<sid>/<rg_id>' (HEAD, OPTIONS, GET) -> NODE-resource_group.nodes_id>,
 <Rule '/browser/resource_group/msql/<gid>/<sid>/<rg_id>' (HEAD, OPTIONS, GET) -> NODE-resource_group.msql_id>,
 <Rule '/browser/resource_group/obj/<gid>/<sid>/<rg_id>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-resource_group.obj_id>,
 <Rule '/browser/resource_group/sql/<gid>/<sid>/<rg_id>' (HEAD, OPTIONS, GET) -> NODE-resource_group.sql_id>,
 <Rule '/browser/event_trigger/fopts/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-event_trigger.fopts>,
 <Rule '/browser/event_trigger/nodes/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-event_trigger.nodes>,
 <Rule '/browser/event_trigger/msql/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-event_trigger.msql>,
 <Rule '/browser/event_trigger/obj/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> NODE-event_trigger.obj>,
 <Rule '/browser/tablespace/move_objects_sql/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.move_objects_sql_id>,
 <Rule '/browser/tablespace/move_objects/<gid>/<sid>/<tsid>' (PUT, OPTIONS) -> NODE-tablespace.move_objects_id>,
 <Rule '/browser/tablespace/dependency/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.dependency_id>,
 <Rule '/browser/tablespace/dependent/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.dependent_id>,
 <Rule '/browser/tablespace/children/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.children_id>,
 <Rule '/browser/tablespace/stats/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.stats_id>,
 <Rule '/browser/tablespace/nodes/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.nodes_id>,
 <Rule '/browser/tablespace/msql/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.msql_id>,
 <Rule '/browser/tablespace/sql/<gid>/<sid>/<tsid>' (HEAD, OPTIONS, GET) -> NODE-tablespace.sql_id>,
 <Rule '/browser/tablespace/obj/<gid>/<sid>/<tsid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-tablespace.obj_id>,
 <Rule '/browser/extension/schemas/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-extension.schemas>,
 <Rule '/browser/extension/avails/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-extension.avails>,
 <Rule '/browser/extension/nodes/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-extension.nodes>,
 <Rule '/browser/extension/msql/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-extension.msql>,
 <Rule '/browser/extension/obj/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> NODE-extension.obj>,
 <Rule '/browser/database/get_encodings/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.get_encodings_id>,
 <Rule '/browser/language/get_functions/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-language.get_functions>,
 <Rule '/browser/database/dependency/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.dependency_id>,
 <Rule '/browser/database/get_ctypes/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.get_ctypes_id>,
 <Rule '/browser/database/dependent/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.dependent_id>,
 <Rule '/browser/database/children/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.children_id>,
 <Rule '/browser/database/connect/<gid>/<sid>/<did>' (HEAD, POST, DELETE, OPTIONS, GET) -> NODE-database.connect_id>,
 <Rule '/browser/database/stats/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.stats_id>,
 <Rule '/browser/database/nodes/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.nodes_id>,
 <Rule '/browser/language/nodes/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-language.nodes>,
 <Rule '/browser/database/msql/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.msql_id>,
 <Rule '/browser/language/msql/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-language.msql>,
 <Rule '/browser/database/sql/<gid>/<sid>/<did>' (HEAD, OPTIONS, GET) -> NODE-database.sql_id>,
 <Rule '/browser/database/obj/<gid>/<sid>/<did>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-database.obj_id>,
 <Rule '/browser/language/obj/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-language.obj>,
 <Rule '/browser/catalog/nodes/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-catalog.nodes>,
 <Rule '/browser/catalog/msql/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-catalog.msql>,
 <Rule '/browser/catalog/obj/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> NODE-catalog.obj>,
 <Rule '/browser/schema/nodes/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-schema.nodes>,
 <Rule '/browser/schema/msql/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-schema.msql>,
 <Rule '/browser/schema/obj/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> NODE-schema.obj>,
 <Rule '/browser/cast/get_functions/<gid>/<sid>/<did>/' (POST, OPTIONS) -> NODE-cast.get_functions>,
 <Rule '/browser/role/dependency/<gid>/<sid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-role.dependency_id>,
 <Rule '/browser/role/dependent/<gid>/<sid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-role.dependent_id>,
 <Rule '/browser/role/variables/<gid>/<sid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-role.variables_id>,
 <Rule '/browser/cast/get_type/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-cast.get_type>,
 <Rule '/browser/role/children/<gid>/<sid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-role.children_id>,
 <Rule '/browser/cast/nodes/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-cast.nodes>,
 <Rule '/browser/role/nodes/<gid>/<sid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-role.nodes_id>,
 <Rule '/browser/cast/msql/<gid>/<sid>/<did>/' (HEAD, OPTIONS, GET) -> NODE-cast.msql>,
 <Rule '/browser/role/msql/<gid>/<sid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-role.msql_id>,
 <Rule '/browser/cast/obj/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> NODE-cast.obj>,
 <Rule '/browser/role/obj/<gid>/<sid>/<rid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-role.obj_id>,
 <Rule '/browser/role/sql/<gid>/<sid>/<rid>' (HEAD, OPTIONS, GET) -> NODE-role.sql_id>,
 <Rule '/misc/bgprocess/status/<pid>/<out>/<err>/' (HEAD, OPTIONS, GET) -> bgprocess.status>,
 <Rule '/grant_wizard/msql/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> grant_wizard.msql>,
 <Rule '/grant_wizard/save/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> grant_wizard.save>,
 <Rule '/grant_wizard/acl/<gid>/<sid>/<did>/' (HEAD, POST, OPTIONS, GET) -> grant_wizard.acl_list>,
 <Rule '/debugger/set_breakpoint/<trans_id>/<line_no>/<set_type>' (HEAD, OPTIONS, GET) -> debugger.set_clear_breakpoint>,
 <Rule '/datagrid/initialize/query_tool/<sid>/<did>' (POST, OPTIONS) -> datagrid.initialize_query_tool>,
 <Rule '/datagrid/panel/<trans_id>/<is_query_tool>/<editor_title>' (HEAD, OPTIONS, GET) -> datagrid.panel>,
 <Rule '/browser/resource_group/nodes/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-resource_group.nodes>,
 <Rule '/browser/resource_group/msql/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-resource_group.msql>,
 <Rule '/browser/resource_group/obj/<gid>/<sid>/' (HEAD, POST, OPTIONS, GET) -> NODE-resource_group.obj>,
 <Rule '/browser/tablespace/stats/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-tablespace.stats>,
 <Rule '/browser/tablespace/vopts/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-tablespace.vopts>,
 <Rule '/browser/tablespace/nodes/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-tablespace.nodes>,
 <Rule '/browser/tablespace/msql/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-tablespace.msql>,
 <Rule '/browser/tablespace/obj/<gid>/<sid>/' (HEAD, POST, OPTIONS, GET) -> NODE-tablespace.obj>,
 <Rule '/browser/database/get_encodings/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-database.get_encodings>,
 <Rule '/browser/database/get_ctypes/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-database.get_ctypes>,
 <Rule '/browser/database/stats/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-database.stats>,
 <Rule '/browser/database/vopts/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-database.vopts>,
 <Rule '/browser/database/nodes/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-database.nodes>,
 <Rule '/browser/database/msql/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-database.msql>,
 <Rule '/browser/database/obj/<gid>/<sid>/' (HEAD, POST, OPTIONS, GET) -> NODE-database.obj>,
 <Rule '/browser/server/change_password/<gid>/<sid>' (POST, OPTIONS) -> NODE-server.change_password_id>,
 <Rule '/browser/server/restore_point/<gid>/<sid>' (POST, OPTIONS) -> NODE-server.restore_point_id>,
 <Rule '/browser/server/wal_replay/<gid>/<sid>' (PUT, OPTIONS, DELETE) -> NODE-server.wal_replay_id>,
 <Rule '/browser/server/dependency/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.dependency_id>,
 <Rule '/browser/server/dependent/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.dependent_id>,
 <Rule '/browser/server/children/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.children_id>,
 <Rule '/browser/server/connect/<gid>/<sid>' (HEAD, POST, DELETE, OPTIONS, GET) -> NODE-server.connect_id>,
 <Rule '/browser/server/reload/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.reload_id>,
 <Rule '/browser/server/stats/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.stats_id>,
 <Rule '/browser/server/nodes/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.nodes_id>,
 <Rule '/browser/server/msql/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.msql_id>,
 <Rule '/browser/server/obj/<gid>/<sid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-server.obj_id>,
 <Rule '/browser/server/sql/<gid>/<sid>' (HEAD, OPTIONS, GET) -> NODE-server.sql_id>,
 <Rule '/browser/role/vopts/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-role.vopts>,
 <Rule '/browser/role/nodes/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-role.nodes>,
 <Rule '/browser/role/msql/<gid>/<sid>/' (HEAD, OPTIONS, GET) -> NODE-role.msql>,
 <Rule '/browser/role/obj/<gid>/<sid>/' (HEAD, POST, OPTIONS, GET) -> NODE-role.obj>,
 <Rule '/maintenance/create_job/<sid>/<did>' (POST, OPTIONS) -> maintenance.create_maintenance_job>,
 <Rule '/dashboard/session_stats/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.session_stats>,
 <Rule '/sqleditor/query_tool/preferences/<trans_id>' (PUT, HEAD, OPTIONS, GET) -> sqleditor.preferences>,
 <Rule '/sqleditor/query_tool/start/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.start_query_tool>,
 <Rule '/sqleditor/view_data/start/<trans_id>' (HEAD, OPTIONS, GET) -> sqleditor.start_view_data>,
 <Rule '/dashboard/tps_stats/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.tps_stats>,
 <Rule '/dashboard/bio_stats/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.bio_stats>,
 <Rule '/dashboard/ti_stats/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.ti_stats>,
 <Rule '/dashboard/to_stats/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.to_stats>,
 <Rule '/dashboard/activity/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.activity>,
 <Rule '/dashboard/prepared/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.prepared>,
 <Rule '/sqleditor/filter/inclusive/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.append_filter_inclusive>,
 <Rule '/sqleditor/filter/exclusive/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.append_filter_exclusive>,
 <Rule '/sqleditor/filter/remove/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.remove_filter>,
 <Rule '/sqleditor/filter/apply/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.apply_filter>,
 <Rule '/sqleditor/filter/get/<trans_id>' (HEAD, OPTIONS, GET) -> sqleditor.get_filter>,
 <Rule '/sqleditor/object/get/<trans_id>' (HEAD, OPTIONS, GET) -> sqleditor.get_object_name>,
 <Rule '/sqleditor/fetch/types/<trans_id>' (HEAD, OPTIONS, GET) -> sqleditor.fetch_pg_types>,
 <Rule '/dashboard/locks/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.locks>,
 <Rule '/debugger/start_execution/<trans_id>/<port_num>' (HEAD, OPTIONS, GET) -> debugger.start_execution>,
 <Rule '/debugger/execute_query/<trans_id>/<query_type>' (HEAD, OPTIONS, GET) -> debugger.execute_debugger_query>,
 <Rule '/debugger/select_frame/<trans_id>/<frame_id>' (HEAD, OPTIONS, GET) -> debugger.select_frame>,
 <Rule '/datagrid/initialize/query_tool/<sid>' (POST, OPTIONS) -> datagrid.initialize_query_tool>,
 <Rule '/settings/store/<setting>/<value>' (HEAD, OPTIONS, GET) -> settings.store>,
 <Rule '/settings/get/<setting>/<default>' (HEAD, OPTIONS, GET) -> settings.get>,
 <Rule '/browser/catalog_object_column/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.static>,
 <Rule '/browser/catalog_object_column/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-catalog_object_column.static>,
 <Rule '/browser/foreign_data_wrapper/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-foreign_data_wrapper.static>,
 <Rule '/browser/exclusion_constraint/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.static>,
 <Rule '/browser/exclusion_constraint/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-exclusion_constraint.static>,
 <Rule '/browser/domain_constraints/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.static>,
 <Rule '/browser/domain_constraints/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-domain_constraints.static>,
 <Rule '/browser/fts_configuration/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.static>,
 <Rule '/browser/check_constraints/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.static>,
 <Rule '/browser/unique_constraint/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.static>,
 <Rule '/browser/fts_configuration/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_configuration.static>,
 <Rule '/browser/check_constraints/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-check_constraints.static>,
 <Rule '/browser/unique_constraint/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-unique_constraint.static>,
 <Rule '/browser/trigger_function/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.static>,
 <Rule '/browser/trigger_function/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-trigger_function.static>,
 <Rule '/browser/foreign_server/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-foreign_server.static>,
 <Rule '/browser/catalog_object/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.static>,
 <Rule '/browser/fts_dictionary/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.static>,
 <Rule '/browser/catalog_object/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-catalog_object.static>,
 <Rule '/browser/fts_dictionary/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_dictionary.static>,
 <Rule '/browser/resource_group/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-resource_group.static>,
 <Rule '/browser/event_trigger/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-event_trigger.static>,
 <Rule '/browser/foreign-table/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.static>,
 <Rule '/browser/foreign-table/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-foreign-table.static>,
 <Rule '/browser/server-group/dependency/<gid>' (HEAD, OPTIONS, GET) -> NODE-server-group.dependency_id>,
 <Rule '/browser/server-group/dependent/<gid>' (HEAD, OPTIONS, GET) -> NODE-server-group.dependent_id>,
 <Rule '/browser/server-group/children/<gid>' (HEAD, OPTIONS, GET) -> NODE-server-group.children_id>,
 <Rule '/browser/user_mapping/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-user_mapping.static>,
 <Rule '/browser/fts_template/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_template.static>,
 <Rule '/browser/fts_template/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_template.static>,
 <Rule '/browser/server-group/stats/<gid>' (HEAD, OPTIONS, GET) -> NODE-server-group.stats_id>,
 <Rule '/browser/server-group/nodes/<gid>' (HEAD, OPTIONS, GET) -> NODE-server-group.nodes_id>,
 <Rule '/browser/server-group/msql/<gid>' (HEAD, OPTIONS, GET) -> NODE-server-group.msql_id>,
 <Rule '/browser/server-group/obj/<gid>' (PUT, HEAD, DELETE, OPTIONS, GET) -> NODE-server-group.obj_id>,
 <Rule '/browser/server-group/sql/<gid>' (HEAD, OPTIONS, GET) -> NODE-server-group.sql_id>,
 <Rule '/browser/constraints/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-constraints.static>,
 <Rule '/browser/foreign_key/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.static>,
 <Rule '/browser/primary_key/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-primary_key.static>,
 <Rule '/browser/constraints/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-constraints.static>,
 <Rule '/browser/foreign_key/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-foreign_key.static>,
 <Rule '/browser/primary_key/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-primary_key.static>,
 <Rule '/browser/fts_parser/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.static>,
 <Rule '/browser/fts_parser/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-fts_parser.static>,
 <Rule '/browser/tablespace/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-tablespace.static>,
 <Rule '/browser/extension/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-extension.static>,
 <Rule '/browser/collation/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-collation.static>,
 <Rule '/browser/procedure/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-procedure.static>,
 <Rule '/browser/collation/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-collation.static>,
 <Rule '/browser/procedure/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-procedure.static>,
 <Rule '/browser/database/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-database.static>,
 <Rule '/browser/language/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-language.static>,
 <Rule '/browser/function/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-function.static>,
 <Rule '/browser/sequence/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-sequence.static>,
 <Rule '/browser/function/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-function.static>,
 <Rule '/browser/sequence/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-sequence.static>,
 <Rule '/browser/trigger/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-trigger.static>,
 <Rule '/browser/catalog/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-catalog.static>,
 <Rule '/browser/trigger/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-trigger.static>,
 <Rule '/browser/server/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-server.static>,
 <Rule '/browser/schema/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-schema.static>,
 <Rule '/browser/domain/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-domain.static>,
 <Rule '/browser/column/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-column.static>,
 <Rule '/browser/domain/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-domain.static>,
 <Rule '/browser/column/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-column.static>,
 <Rule '/browser/server/nodes/<gid>/' (HEAD, OPTIONS, GET) -> NODE-server.nodes>,
 <Rule '/browser/server/obj/<gid>/' (HEAD, POST, OPTIONS, GET) -> NODE-server.obj>,
 <Rule '/browser/table/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-table.static>,
 <Rule '/browser/index/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-index.static>,
 <Rule '/browser/mview/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-mview.static>,
 <Rule '/browser/table/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-table.static>,
 <Rule '/browser/index/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-index.static>,
 <Rule '/browser/mview/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-mview.static>,
 <Rule '/browser/cast/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-cast.static>,
 <Rule '/browser/rule/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-rule.static>,
 <Rule '/browser/type/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-type.static>,
 <Rule '/browser/view/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-view.static>,
 <Rule '/browser/rule/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-rule.static>,
 <Rule '/browser/type/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-type.static>,
 <Rule '/browser/view/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-view.static>,
 <Rule '/browser/role/static/<filename>' (HEAD, OPTIONS, GET) -> NODE-role.static>,
 <Rule '/backup/create_job/backup_object/<sid>' (POST, OPTIONS) -> backup.create_backup_objects_job>,
 <Rule '/misc/statistics/static/<filename>' (HEAD, OPTIONS, GET) -> statistics.static>,
 <Rule '/misc/bgprocess/acknowledge/<pid>/' (PUT, OPTIONS) -> bgprocess.acknowledge>,
 <Rule '/misc/bgprocess/status/<pid>/' (HEAD, OPTIONS, GET) -> bgprocess.status>,
 <Rule '/misc/bgprocess/static/<filename>' (HEAD, OPTIONS, GET) -> bgprocess.static>,
 <Rule '/misc/depends/static/<filename>' (HEAD, OPTIONS, GET) -> depends.static>,
 <Rule '/misc/sql/static/<filename>' (HEAD, OPTIONS, GET) -> sql.static>,
 <Rule '/user_management/user/<uid>' (HEAD, OPTIONS, GET) -> user_management.user>,
 <Rule '/user_management/user/<uid>' (OPTIONS, DELETE) -> user_management.delete>,
 <Rule '/user_management/user/<uid>' (PUT, OPTIONS) -> user_management.update>,
 <Rule '/user_management/role/<rid>' (HEAD, OPTIONS, GET) -> user_management.role>,
 <Rule '/import_export/create_job/<sid>' (POST, OPTIONS) -> import_export.create_import_export_job>,
 <Rule '/import_export/static/<filename>' (HEAD, OPTIONS, GET) -> import_export.static>,
 <Rule '/file_manager/del_trans_id/<trans_id>' (HEAD, POST, OPTIONS, GET) -> file_manager.delete_trans_id>,
 <Rule '/file_manager/filemanager/<trans_id>/' (HEAD, POST, OPTIONS, GET) -> file_manager.file_manager>,
 <Rule '/file_manager/static/<filename>' (HEAD, OPTIONS, GET) -> file_manager.static>,
 <Rule '/file_manager/<trans_id>/file_manager_config.json' (HEAD, OPTIONS, GET) -> file_manager.file_manager_config>,
 <Rule '/preferences/preferences/<pid>' (PUT, OPTIONS) -> preferences.save>,
 <Rule '/preferences/static/<filename>' (HEAD, OPTIONS, GET) -> preferences.static>,
 <Rule '/maintenance/static/<filename>' (HEAD, OPTIONS, GET) -> maintenance.static>,
 <Rule '/dashboard/session_stats/<sid>' (HEAD, OPTIONS, GET) -> dashboard.session_stats>,
 <Rule '/sqleditor/auto_rollback/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.set_auto_rollback>,
 <Rule '/sqleditor/autocomplete/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.auto_complete>,
 <Rule '/sqleditor/auto_commit/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.set_auto_commit>,
 <Rule '/dashboard/tps_stats/<sid>' (HEAD, OPTIONS, GET) -> dashboard.tps_stats>,
 <Rule '/dashboard/bio_stats/<sid>' (HEAD, OPTIONS, GET) -> dashboard.bio_stats>,
 <Rule '/dashboard/ti_stats/<sid>' (HEAD, OPTIONS, GET) -> dashboard.ti_stats>,
 <Rule '/dashboard/to_stats/<sid>' (HEAD, OPTIONS, GET) -> dashboard.to_stats>,
 <Rule '/dashboard/activity/<sid>' (HEAD, OPTIONS, GET) -> dashboard.activity>,
 <Rule '/dashboard/prepared/<sid>' (HEAD, OPTIONS, GET) -> dashboard.prepared>,
 <Rule '/dashboard/config/<sid>' (HEAD, OPTIONS, GET) -> dashboard.config>,
 <Rule '/sqleditor/cancel/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.cancel_transaction>,
 <Rule '/dashboard/static/<filename>' (HEAD, OPTIONS, GET) -> dashboard.static>,
 <Rule '/sqleditor/static/<filename>' (HEAD, OPTIONS, GET) -> sqleditor.static>,
 <Rule '/dashboard/locks/<sid>' (HEAD, OPTIONS, GET) -> dashboard.locks>,
 <Rule '/sqleditor/limit/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.set_limit>,
 <Rule '/sqleditor/poll/<trans_id>' (HEAD, OPTIONS, GET) -> sqleditor.poll>,
 <Rule '/sqleditor/save/<trans_id>' (PUT, POST, OPTIONS) -> sqleditor.save>,
 <Rule '/dashboard/<sid>/<did>' (HEAD, OPTIONS, GET) -> dashboard.index>,
 <Rule '/debugger/poll_end_execution_result/<trans_id>/' (HEAD, OPTIONS, GET) -> debugger.poll_end_execution_result>,
 <Rule '/debugger/clear_all_breakpoint/<trans_id>' (POST, OPTIONS) -> debugger.clear_all_breakpoint>,
 <Rule '/debugger/start_listener/<trans_id>' (HEAD, POST, OPTIONS, GET) -> debugger.start_debugger_listener>,
 <Rule '/debugger/deposit_value/<trans_id>' (POST, OPTIONS) -> debugger.deposit_parameter_value>,
 <Rule '/debugger/poll_result/<trans_id>/' (HEAD, OPTIONS, GET) -> debugger.poll_result>,
 <Rule '/debugger/messages/<trans_id>/' (HEAD, OPTIONS, GET) -> debugger.messages>,
 <Rule '/debugger/restart/<trans_id>' (HEAD, OPTIONS, GET) -> debugger.restart_debugging>,
 <Rule '/debugger/direct/<trans_id>' (HEAD, OPTIONS, GET) -> debugger.direct_new>,
 <Rule '/settings/static/<filename>' (HEAD, OPTIONS, GET) -> settings.static>,
 <Rule '/datagrid/static/<filename>' (HEAD, OPTIONS, GET) -> datagrid.static>,
 <Rule '/debugger/static/<filename>' (HEAD, OPTIONS, GET) -> debugger.static>,
 <Rule '/datagrid/close/<trans_id>' (HEAD, OPTIONS, GET) -> datagrid.close>,
 <Rule '/debugger/close/<trans_id>' (HEAD, OPTIONS, GET) -> debugger.close>,
 <Rule '/settings/get/<setting>' (HEAD, OPTIONS, GET) -> settings.get>,
 <Rule '/browser/server-group/<filename>' (HEAD, OPTIONS, GET) -> NODE-server-group.static>,
 <Rule '/restore/create_job/<sid>' (POST, OPTIONS) -> restore.create_restore_job>,
 <Rule '/browser/static/<filename>' (HEAD, OPTIONS, GET) -> browser.static>,
 <Rule '/backup/create_job/<sid>' (POST, OPTIONS) -> backup.create_backup_job>,
 <Rule '/tools/static/<filename>' (HEAD, OPTIONS, GET) -> tools.static>,
 <Rule '/misc/static/<filename>' (HEAD, OPTIONS, GET) -> misc.static>,
 <Rule '/help/help/<filename>' (HEAD, OPTIONS, GET) -> help.static>,
 <Rule '/user_management/user/' (HEAD, OPTIONS, GET) -> user_management.user>,
 <Rule '/user_management/role/' (HEAD, OPTIONS, GET) -> user_management.role>,
 <Rule '/user_management/<filename>' (HEAD, OPTIONS, GET) -> user_management.static>,
 <Rule '/grant_wizard/<filename>' (HEAD, OPTIONS, GET) -> grant_wizard.static>,
 <Rule '/dashboard/<sid>' (HEAD, OPTIONS, GET) -> dashboard.index>,
 <Rule '/restore/<filename>' (HEAD, OPTIONS, GET) -> restore.static>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
 <Rule '//static/<filename>' (HEAD, OPTIONS, GET) -> redirects.static>,
 <Rule '/backup/<filename>' (HEAD, OPTIONS, GET) -> backup.static>,
 <Rule '/reset/<token>' (HEAD, POST, OPTIONS, GET) -> security.reset_password>,
 <Rule '/about/<filename>' (HEAD, OPTIONS, GET) -> about.static>])
Please check output in file: logger.log placed at .../pgadmin4/web/regression
send: 'ehlo 22.0.168.192.in-addr.arpa\r\n'
reply: '250-smtp.gmail.com at your service, [2a02:c7f:6c05:9c00:fc72:48f0:30fb:fe27]\r\n'
reply: '250-SIZE 35882577\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-CHUNKING\r\n'
reply: '250 SMTPUTF8\r\n'
reply: retcode (250); Msg: smtp.gmail.com at your service, [2a02:c7f:6c05:9c00:fc72:48f0:30fb:fe27]
SIZE 35882577
8BITMIME
AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
ENHANCEDSTATUSCODES
PIPELINING
CHUNKING
SMTPUTF8
send: 'AUTH PLAIN AGRhdmUucGFnZUBlbnRlcnByaXNlZGIuY29tAFAwd2VyQ29ubmVjdA==\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: u'mail FROM:<no-reply@localhost> size=1118\r\n'
reply: '250 2.1.0 OK q6sm5053521wjt.46 - gsmtp\r\n'
reply: retcode (250); Msg: 2.1.0 OK q6sm5053521wjt.46 - gsmtp
send: u'rcpt TO:<[email protected]>\r\n'
reply: '250 2.1.5 OK q6sm5053521wjt.46 - gsmtp\r\n'
reply: retcode (250); Msg: 2.1.5 OK q6sm5053521wjt.46 - gsmtp
send: 'data\r\n'
reply: '354  Go ahead q6sm5053521wjt.46 - gsmtp\r\n'
reply: retcode (354); Msg: Go ahead q6sm5053521wjt.46 - gsmtp
data: (354, 'Go ahead q6sm5053521wjt.46 - gsmtp')
send: 'Content-Type: multipart/mixed; boundary="===============8112721885542338143=="\r\nMIME-Version: 1.0\r\nSubject: Password reset instructions for pgAdmin 4\r\nFrom: no-reply@localhost\r\nTo: [email protected]\r\nDate: Wed, 29 Jun 2016 20:12:45 +0100\r\nMessage-ID: <[email protected]>\r\n\r\n--===============8112721885542338143==\r\nContent-Type: multipart/alternative;\r\n boundary="===============2051661191218566762=="\r\nMIME-Version: 1.0\r\n\r\n--===============2051661191218566762==\r\nContent-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\nClick the link below to reset your password:\r\n\r\nhttp://localhost/reset/WyIxIiwiOTBkYWVjMThhYjhjNzdiZDlkMTBlZDg2NzlhOGUwOTYiXQ.ClWvLA.O9lqPpblE2PQrCi4vPkPttblsQU\r\n--===============2051661191218566762==\r\nContent-Type: text/html; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n<p><a href="http://localhost/reset/WyIxIiwiOTBkYWVjMThhYjhjNzdiZDlkMTBlZDg2NzlhOGUwOTYiXQ.ClWvLA.O9lqPpblE2PQrCi... here to reset your password</a></p>\r\n--===============2051661191218566762==--\r\n\r\n--===============8112721885542338143==--\r\n.\r\n'
reply: '250 2.0.0 OK 1467227566 q6sm5053521wjt.46 - gsmtp\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1467227566 q6sm5053521wjt.46 - gsmtp
data: (250, '2.0.0 OK 1467227566 q6sm5053521wjt.46 - gsmtp')
send: 'quit\r\n'
reply: '221 2.0.0 closing connection q6sm5053521wjt.46 - gsmtp\r\n'
reply: retcode (221); Msg: 2.0.0 closing connection q6sm5053521wjt.46 - gsmtp
send: 'ehlo 22.0.168.192.in-addr.arpa\r\n'
reply: '250-smtp.gmail.com at your service, [2a02:c7f:6c05:9c00:fc72:48f0:30fb:fe27]\r\n'
reply: '250-SIZE 35882577\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-CHUNKING\r\n'
reply: '250 SMTPUTF8\r\n'
reply: retcode (250); Msg: smtp.gmail.com at your service, [2a02:c7f:6c05:9c00:fc72:48f0:30fb:fe27]
SIZE 35882577
8BITMIME
AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
ENHANCEDSTATUSCODES
PIPELINING
CHUNKING
SMTPUTF8
send: 'AUTH PLAIN AGRhdmUucGFnZUBlbnRlcnByaXNlZGIuY29tAFAwd2VyQ29ubmVjdA==\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: u'mail FROM:<no-reply@localhost> size=1065\r\n'
reply: '250 2.1.0 OK x194sm2818814wmf.13 - gsmtp\r\n'
reply: retcode (250); Msg: 2.1.0 OK x194sm2818814wmf.13 - gsmtp
send: u'rcpt TO:<[email protected]>\r\n'
reply: '250 2.1.5 OK x194sm2818814wmf.13 - gsmtp\r\n'
reply: retcode (250); Msg: 2.1.5 OK x194sm2818814wmf.13 - gsmtp
send: 'data\r\n'
reply: '354  Go ahead x194sm2818814wmf.13 - gsmtp\r\n'
reply: retcode (354); Msg: Go ahead x194sm2818814wmf.13 - gsmtp
data: (354, 'Go ahead x194sm2818814wmf.13 - gsmtp')
send: 'Content-Type: multipart/mixed; boundary="===============1543246453746814732=="\r\nMIME-Version: 1.0\r\nSubject: Your password for pgAdmin 4 has been changed\r\nFrom: no-reply@localhost\r\nTo: [email protected]\r\nDate: Wed, 29 Jun 2016 20:12:47 +0100\r\nMessage-ID: <[email protected]>\r\n\r\n--===============1543246453746814732==\r\nContent-Type: multipart/alternative;\r\n boundary="===============5956468165144037350=="\r\nMIME-Version: 1.0\r\n\r\n--===============5956468165144037350==\r\nContent-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\nYour password has been changed\r\nIf you did not change your password, click the link below to reset it.\r\nhttp://localhost/reset\r\n\r\n--===============5956468165144037350==\r\nContent-Type: text/html; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n<p>Your password has been changed.</p>\r\n<p>If you did not change your password, <a href="http://localhost/reset">click here to reset it</a>.</p>\r\n\r\n--===============5956468165144037350==--\r\n\r\n--===============1543246453746814732==--\r\n.\r\n'
reply: '250 2.0.0 OK 1467227568 x194sm2818814wmf.13 - gsmtp\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1467227568 x194sm2818814wmf.13 - gsmtp
data: (250, '2.0.0 OK 1467227568 x194sm2818814wmf.13 - gsmtp')
send: 'quit\r\n'
reply: '221 2.0.0 closing connection x194sm2818814wmf.13 - gsmtp\r\n'
reply: retcode (221); Msg: 2.0.0 closing connection x194sm2818814wmf.13 - gsmtp
send: 'ehlo 22.0.168.192.in-addr.arpa\r\n'
reply: '250-smtp.gmail.com at your service, [2a02:c7f:6c05:9c00:fc72:48f0:30fb:fe27]\r\n'
reply: '250-SIZE 35882577\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-CHUNKING\r\n'
reply: '250 SMTPUTF8\r\n'
reply: retcode (250); Msg: smtp.gmail.com at your service, [2a02:c7f:6c05:9c00:fc72:48f0:30fb:fe27]
SIZE 35882577
8BITMIME
AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
ENHANCEDSTATUSCODES
PIPELINING
CHUNKING
SMTPUTF8
send: 'AUTH PLAIN AGRhdmUucGFnZUBlbnRlcnByaXNlZGIuY29tAFAwd2VyQ29ubmVjdA==\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: u'mail FROM:<no-reply@localhost> size=1065\r\n'
reply: '250 2.1.0 OK j4sm5081037wjg.20 - gsmtp\r\n'
reply: retcode (250); Msg: 2.1.0 OK j4sm5081037wjg.20 - gsmtp
send: u'rcpt TO:<[email protected]>\r\n'
reply: '250 2.1.5 OK j4sm5081037wjg.20 - gsmtp\r\n'
reply: retcode (250); Msg: 2.1.5 OK j4sm5081037wjg.20 - gsmtp
send: 'data\r\n'
reply: '354  Go ahead j4sm5081037wjg.20 - gsmtp\r\n'
reply: retcode (354); Msg: Go ahead j4sm5081037wjg.20 - gsmtp
data: (354, 'Go ahead j4sm5081037wjg.20 - gsmtp')
send: 'Content-Type: multipart/mixed; boundary="===============2557152597075911208=="\r\nMIME-Version: 1.0\r\nSubject: Your password for pgAdmin 4 has been changed\r\nFrom: no-reply@localhost\r\nTo: [email protected]\r\nDate: Wed, 29 Jun 2016 20:12:49 +0100\r\nMessage-ID: <[email protected]>\r\n\r\n--===============2557152597075911208==\r\nContent-Type: multipart/alternative;\r\n boundary="===============6228397783242031757=="\r\nMIME-Version: 1.0\r\n\r\n--===============6228397783242031757==\r\nContent-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\nYour password has been changed\r\nIf you did not change your password, click the link below to reset it.\r\nhttp://localhost/reset\r\n\r\n--===============6228397783242031757==\r\nContent-Type: text/html; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 7bit\r\n\r\n<p>Your password has been changed.</p>\r\n<p>If you did not change your password, <a href="http://localhost/reset">click here to reset it</a>.</p>\r\n\r\n--===============6228397783242031757==--\r\n\r\n--===============2557152597075911208==--\r\n.\r\n'
reply: '250 2.0.0 OK 1467227570 j4sm5081037wjg.20 - gsmtp\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1467227570 j4sm5081037wjg.20 - gsmtp
data: (250, '2.0.0 OK 1467227570 j4sm5081037wjg.20 - gsmtp')
send: 'quit\r\n'
reply: '221 2.0.0 closing connection j4sm5081037wjg.20 - gsmtp\r\n'
reply: retcode (221); Msg: 2.0.0 closing connection j4sm5081037wjg.20 - gsmtp
2016-06-29 20:12:50,299: INFO	pgadmin:	Connection Request for server#3
2016-06-29 20:12:50,307: SQL	pgadmin:	Execute (scalar) for server #3 - DB:postgres (Query-id: 6379209):

SET DateStyle=ISO;
SET client_min_messages=notice;
SET bytea_output=escape;
SET client_encoding='UNICODE';
2016-06-29 20:12:50,307: SQL	pgadmin:	Execute (scalar) for server #3 - DB:postgres (Query-id: 6224014):
SELECT version()
2016-06-29 20:12:50,308: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 9082267):

SELECT
    db.oid as did, db.datname, db.datallowconn, pg_encoding_to_char(db.encoding) AS serverencoding,
    has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
FROM
    pg_database db
WHERE db.datname = current_database()
2016-06-29 20:12:50,309: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 4390393):

SELECT
    oid as id, rolname as name, rolsuper as is_superuser,
    rolcreaterole as can_create_role, rolcreatedb as can_create_db
FROM
    pg_catalog.pg_roles
WHERE
    rolname = current_user
2016-06-29 20:12:50,311: INFO	pgadmin:	Connection Established for server:                 3 - PostgreSQL 9.4
2016-06-29 20:12:50,311: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 8447701):

                    SELECT CASE WHEN usesuper
                           THEN pg_is_in_recovery()
                           ELSE FALSE
                           END as inrecovery,
                           CASE WHEN usesuper AND pg_is_in_recovery()
                           THEN pg_is_xlog_replay_paused()
                           ELSE FALSE
                           END as isreplaypaused
                    FROM pg_user WHERE usename=current_user
2016-06-29 20:12:50,319: INFO	pgadmin:	Connection Request for server#3
2016-06-29 20:12:50,321: INFO	pgadmin:	Connection Established for server:                 3 - PostgreSQL 9.4
2016-06-29 20:12:50,321: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 1727388):

                    SELECT CASE WHEN usesuper
                           THEN pg_is_in_recovery()
                           ELSE FALSE
                           END as inrecovery,
                           CASE WHEN usesuper AND pg_is_in_recovery()
                           THEN pg_is_xlog_replay_paused()
                           ELSE FALSE
                           END as isreplaypaused
                    FROM pg_user WHERE usename=current_user
2016-06-29 20:12:50,339: SQL	pgadmin:	Execute (scalar) for server #3 - DB:postgres (Query-id: 8901265):
CREATE DATABASE efe08e1
    WITH 
    OWNER = postgres
    ENCODING = 'UTF8'
    CONNECTION LIMIT = -1;

2016-06-29 20:12:50,616: SQL	pgadmin:	Execute (scalar) for server #3 - DB:postgres (Query-id: 2154944):
GRANT TEMPORARY ON DATABASE efe08e1 TO postgres;
2016-06-29 20:12:50,619: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 3496660):
SELECT
    db.oid as did, db.datname as name, db.dattablespace AS spcoid,
    spcname, datallowconn, pg_encoding_to_char(encoding) AS encoding,
    pg_get_userbyid(datdba) AS datowner, datcollate, datctype, datconnlimit,
    has_database_privilege(db.oid, 'CREATE') as cancreate,
    current_setting('default_tablespace') AS default_tablespace,
    descr.description as comments,
    (SELECT array_agg(provider || '=' || label) FROM pg_shseclabel sl1 WHERE sl1.objoid=db.oid) AS seclabels,
    array_to_string(datacl::text[], ', ') AS acl
FROM pg_database db
    LEFT OUTER JOIN pg_tablespace ta ON db.dattablespace=ta.OID
    LEFT OUTER JOIN pg_shdescription descr ON (
        db.oid=descr.objoid AND descr.classoid='pg_database'::regclass
    )
WHERE db.datname = 'efe08e1'::text
ORDER BY datname
2016-06-29 20:12:50,628: INFO	pgadmin:	Connection Request for server#3
2016-06-29 20:12:50,631: INFO	pgadmin:	Connection Established for server:                 3 - PostgreSQL 9.4
2016-06-29 20:12:50,631: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 5099329):

                    SELECT CASE WHEN usesuper
                           THEN pg_is_in_recovery()
                           ELSE FALSE
                           END as inrecovery,
                           CASE WHEN usesuper AND pg_is_in_recovery()
                           THEN pg_is_xlog_replay_paused()
                           ELSE FALSE
                           END as isreplaypaused
                    FROM pg_user WHERE usename=current_user
2016-06-29 20:12:50,638: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 590129):

SELECT
    db.oid as did, db.datname, db.datallowconn,
    pg_encoding_to_char(db.encoding) AS serverencoding,
    has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
FROM
    pg_database db
WHERE db.oid = 158545
2016-06-29 20:12:50,646: INFO	pgadmin:	Connection Request for server#3
2016-06-29 20:12:50,648: INFO	pgadmin:	Connection Established for server:                 3 - PostgreSQL 9.4
2016-06-29 20:12:50,648: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 6138710):

                    SELECT CASE WHEN usesuper
                           THEN pg_is_in_recovery()
                           ELSE FALSE
                           END as inrecovery,
                           CASE WHEN usesuper AND pg_is_in_recovery()
                           THEN pg_is_xlog_replay_paused()
                           ELSE FALSE
                           END as isreplaypaused
                    FROM pg_user WHERE usename=current_user
2016-06-29 20:12:50,657: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 4052321):

SELECT
    db.oid as did, db.datname, db.datallowconn,
    pg_encoding_to_char(db.encoding) AS serverencoding,
    has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
FROM
    pg_database db
WHERE db.oid = 158545
2016-06-29 20:12:50,663: INFO	pgadmin:	Connection Request for server#3
2016-06-29 20:12:50,665: INFO	pgadmin:	Connection Established for server:                 3 - PostgreSQL 9.4
2016-06-29 20:12:50,666: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 6504564):

                    SELECT CASE WHEN usesuper
                           THEN pg_is_in_recovery()
                           ELSE FALSE
                           END as inrecovery,
                           CASE WHEN usesuper AND pg_is_in_recovery()
                           THEN pg_is_xlog_replay_paused()
                           ELSE FALSE
                           END as isreplaypaused
                    FROM pg_user WHERE usename=current_user
2016-06-29 20:12:50,672: SQL	pgadmin:	Execute (dict) for server #3 - DB:postgres (Query-id: 361546):

SELECT
    db.oid as did, db.datname, db.datallowconn,
    pg_encoding_to_char(db.encoding) AS serverencoding,
    has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
FROM
    pg_database db
WHERE db.oid = 158545
(pgadmin4)piranha:pgadmin4 dpage$ 

diff --git a/.gitignore b/.gitignore
index ec82803..b58ab47 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,7 @@ runtime/ui_BrowserWindow.h
 runtime/.qmake.stash
 web/config_local.py
 web/regression/test_config.json
+web/regression/test_advanced_config.json
 pgadmin4.log
 *.swp
 *.swo
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..60ed4c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,16 @@
+# ##########################################################################
+#
+# #pgAdmin 4 - PostgreSQL Tools
+#
+# #Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# #This software is released under the PostgreSQL Licence
+#
+# ##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DatabaseGenerateTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..4278383
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,101 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, advance_config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import uuid
+import os
+from regression.test_utils import get_ids
+
+
+class DatabaseAddTestCase(LoginTestCase):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+    priority = 7
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        self.assertEquals(response.status_code, 200)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                     "datacl": advance_config_data['test_add_database_data'][0]
+                     ['test_privileges_acl'],
+                     "datconnlimit": advance_config_data
+                     ['test_add_database_data'][0]['test_conn_limit'],
+                     "datowner": advance_config_data
+                     ['test_add_database_data'][0]['test_owner'],
+                     "deffuncacl": advance_config_data
+                     ['test_add_database_data'][0]['test_fun_acl'],
+                     "defseqacl": advance_config_data
+                     ['test_add_database_data'][0]['test_seq_acl'],
+                     "deftblacl": advance_config_data
+                     ['test_add_database_data'][0]['test_tbl_acl'],
+                     "deftypeacl": advance_config_data
+                     ['test_add_database_data'][0]['test_type_acl'],
+                     "encoding": advance_config_data
+                     ['test_add_database_data'][0]['test_encoding'],
+                     "name": str(uuid.uuid4())[1:8],
+                     "privileges": advance_config_data
+                     ['test_add_database_data'][0]['test_privileges'],
+                     "securities": advance_config_data
+                     ['test_add_database_data'][0]['test_securities'],
+                     "variables": advance_config_data
+                     ['test_add_database_data'][0]['test_variables']
+                    }
+
+            db_response = self.tester.post(self.url + str(srv_grp) + "/" +
+                                           server_id + "/",
+                                           data=json.dumps(data),
+                                           content_type='html/json')
+
+            self.assertTrue(db_response.status_code, 200)
+
+            respdata = json.loads(db_response.data.decode())
+
+            db_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+
+                exst_server_id = open(pickle_path, 'rb')
+
+                tol_server_id = pickle.load(exst_server_id)
+                pickle_id_dict = tol_server_id
+
+                pickle_id_dict["did"].append(db_id)
+
+                db_output = open(pickle_path, 'wb')
+                pickle.dump(pickle_id_dict, db_output)
+                db_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
new file mode 100644
index 0000000..ca8ed9b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -0,0 +1,45 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabaseDeleteTestCase(LoginTestCase):
+    """ This class will delete the database under last added server. """
+
+    priority = 98
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if len(db_con) == 0:
+            raise Exception("No database(s) to delete.")
+
+        response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                      str(server_id) + '/' + str(db_id),
+                                      follow_redirects=True)
+
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..e931985
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,43 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(LoginTestCase):
+    """
+    This class will fetch added database under server node.
+    """
+    priority = 8
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..ad83603
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,51 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data,  advance_config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class DatabasesUpdateTestCase(LoginTestCase):
+    """
+    This class will update the database under last added server.
+    """
+    priority = 9
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = {
+                "comments": advance_config_data["test_db_update_data"][0]
+                ["test_comment"],
+                "id": db_id
+                   }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 28cdb94..4fd2066 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class ServerGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In ServerGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..7499b85 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -8,16 +8,14 @@
 # ##########################################################################
 
 import json
-
+import pickle
+import os
 from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
+from regression.config import config_data, pickle_path
 
 
 class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
+    """ This class will add the servers under default server group. """
 
     priority = 4
 
@@ -27,14 +25,19 @@ class ServersAddTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
-        """
+        """ This function will add the server under default server group."""
+
+        # Storing parent id's into pickle dict
+        pickle_id_dict = \
+            {
+                "sid": [],  # server
+                "did": []   # database
+            }
 
         srv_grp = config_data['test_server_group']
 
         for srv in config_data['test_server_credentials']:
+
             data = {"name": srv['test_name'],
                     "comment": "",
                     "host": srv['test_host'],
@@ -44,10 +47,20 @@ class ServersAddTestCase(LoginTestCase):
                     "role": "",
                     "sslmode": srv['test_sslmode']}
 
-            url = self.url + str(srv_grp) + "/"
-
-            response = self.tester.post(url, data=json.dumps(data),
+            response = self.tester.post(self.url + str(srv_grp) + "/",
+                                        data=json.dumps(data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+            respdata = json.loads(response.data.decode())
+
+            server_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                pickle_id_dict = pickle.load(exst_server_id)
+
+            pickle_id_dict["sid"].append(server_id)
+            output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, output)
+            output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..997308e 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -8,17 +8,14 @@
 # ##################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
-    priority = 7
+class ServerDeleteTestCase(LoginTestCase):
+    """ This class will delete the last server present under tree node."""
+
+    priority = 99
 
     scenarios = [
         # Fetching the default url for server node
@@ -26,32 +23,22 @@ class ServersDeleteTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
-        """
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        url = self.url + str(srv_grp) + "/"
 
-            url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        respdata = json.loads(response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        if len(respdata) == 0:
+            raise Exception("No server(s) to delete.")
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        # delete last server
+        server = respdata[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..163fef3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,15 +7,14 @@
 #
 # ##########################################################################
 
-import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
 class ServersGetTestCase(LoginTestCase):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
@@ -27,23 +26,16 @@ class ServersGetTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers present under
-        object browser.
-        """
+        """ This function will fetch the added servers to object browser. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
+        for srv in server_id:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(srv),
                                        content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..f8cef24 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -8,16 +8,13 @@
 # ##########################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerUpdateTestCase(LoginTestCase):
+    """ This class will update server's comment field. """
 
     priority = 6
 
@@ -27,39 +24,41 @@ class ServersUpdateTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
-        """
+        """ This function will update the server's comment field. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
+        response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                   str(server_id),
+                                   follow_redirects=True)
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        con_response = self.tester.post('browser/server/connect/{0}/{1}'.format
+                                        (srv_grp, server_id),
+                                        data=dict(password=
+                                                  config_data
+                                                  ['test_server_credentials'][0]
+                                                  ['test_db_password']),
+                                        follow_redirects=True)
 
-            url = self.url + str(srv_grp) + "/"
+        srv_con = json.loads(con_response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        if len(srv_con) == 0:
+            raise Exception("No Server(s) connected to update.")
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        data = \
+            {
+                "comment": config_data
+                ['test_server_update_data']['test_comment'],
+                "id": server_id
+            }
 
-            for server in respdata:
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id), data=json.dumps(data),
+                                       content_type='html/json')
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        self.assertEquals(put_response.status_code, 200)
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        respdata = json.loads(put_response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_add.py b/web/pgadmin/browser/server_groups/tests/test_sg_add.py
deleted file mode 100644
index e70bb65..0000000
--- a/web/pgadmin/browser/server_groups/tests/test_sg_add.py
+++ /dev/null
@@ -1,36 +0,0 @@
-###########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2016, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-###########################################################################
-
-import json
-
-from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
-
-
-class SgNodeTestCase(LoginTestCase):
-    """
-     This class will check available server groups in pgAdmin.
-    """
-
-    priority = 1
-
-    scenarios = [
-        # Fetching the default url for server group node
-        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
-    ]
-
-    def runTest(self):
-        """This function will check available server groups."""
-
-        i = config_data['test_server_group']
-
-        response = self.tester.get(self.url + str(i), content_type='html/json')
-        self.assertTrue(response.status_code, 200)
-        respdata = json.loads(response.data)
-        self.assertTrue(respdata['id'], i)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
new file mode 100644
index 0000000..c552d8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -0,0 +1,36 @@
+###########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
+
+import json
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.config import config_data
+
+
+class SgGetTestCase(LoginTestCase):
+    """
+     This class will check available server groups in pgAdmin.
+    """
+
+    priority = 3
+
+    scenarios = [
+        # Fetching the default url for server group node
+        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
+    ]
+
+    def runTest(self):
+        """This function will check available server groups."""
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.get(self.url + str(srv_grp),
+                                   content_type='html/json')
+        self.assertEquals(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['id'], srv_grp)
diff --git a/web/pgadmin/browser/tests/__init__.py b/web/pgadmin/browser/tests/__init__.py
index 2381efd..4470711 100644
--- a/web/pgadmin/browser/tests/__init__.py
+++ b/web/pgadmin/browser/tests/__init__.py
@@ -11,5 +11,6 @@ from pgadmin.utils.route import BaseTestGenerator
 
 
 class BrowserGenerateTestCase(BaseTestGenerator):
+
     def runTest(self):
-        print ("In BrowserGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index dedb7d9..5c4930d 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -85,10 +85,10 @@ class ChangePasswordTestCase(LoginTestCase):
         """This function will check change password functionality."""
 
         response = self.tester.get('/change', follow_redirects=True)
-        self.assertIn('pgAdmin 4 Password Change', response.data)
+        self.assertIn('pgAdmin 4 Password Change', response.data.decode('utf8'))
         response = self.tester.post('/change', data=dict(
             password=self.password,
             new_password=self.new_password,
             new_password_confirm=self.new_password_confirm),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..d272a63 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,7 +8,6 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
@@ -67,7 +66,9 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
     def runTest(self):
@@ -76,4 +77,4 @@ class LoginTestCase(BaseTestGenerator):
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index 8971e72..d9611ae 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -14,14 +14,13 @@ from regression.config import config_data
 class LogoutTest(LoginTestCase):
     """
     This class verifies the logout functionality; provided the user is already
-    logged-in. Dictionary parameters define the scenario appended by test
-    name.
+    logged-in.
     """
 
-    priority = 3
+    priority = 100
 
     scenarios = [
-        # This test case validate the logout page
+        # This test case validate the logout page.
         ('Logging Out', dict(respdata='Redirecting...'))
     ]
 
@@ -29,7 +28,7 @@ class LogoutTest(LoginTestCase):
         """This function checks the logout functionality."""
 
         response = self.tester.get('/logout')
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
 
     def tearDown(self):
         """
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index 030b182..31a3992 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -41,8 +41,9 @@ class ResetPasswordTestCase(BaseTestGenerator):
         """This function checks reset password functionality."""
 
         response = self.tester.get('/reset')
-        self.assertIn('Recover pgAdmin 4 Password', response.data)
+        self.assertIn('Recover pgAdmin 4 Password',
+                      response.data.decode('utf8'))
         response = self.tester.post(
             '/reset', data=dict(email=self.email),
             follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index fb9de69..e439965 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -52,7 +52,10 @@ class TestsGeneratorRegistry(ABCMeta):
         from werkzeug.utils import find_modules
 
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 
 import six
diff --git a/web/regression/README b/web/regression/README
index e0003e4..0751661 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -40,23 +40,25 @@ General Information
     3. test_server_get.py
     4. test_server_update.py
 
-2) The pgAdmin4 source tree includes a file template for the server configuration
-   named ‘test_config.json.in' in the ‘pgAdmin4/web/regression’ directory. After
-   completing the pgAdmin4 configuration, you must make a working copy of the
-   template called test_config.json before modifying the file contents.
+2) The pgAdmin4 source tree includes 2 different configuration file templates.
+   One file template for the server configuration named ‘test_config.json.in'
+   and another for test configuration named 'test_advanced_config.json.in' in
+   the ‘pgAdmin4/web/regression’ directory. After completing the pgAdmin4
+   configuration, you must make a working copy of the templates called
+   test_config.json and test_advance_config.json before modifying the file contents.
 
 	2a) The following command copies the test_config.json.in file, creating a
-	    configuration file named test_config.json
+	    configuration file named test_config.json (same way user can copy
+	    test_advance_config.json.in file into test_advance_config.json)
 
             # cp pgadmin4/web/regression/test_config.json.in \
               pgadmin4/web/regression/test_config.json
 
-	2b) After creating the server configuration file, add (or modify)
-	    parameter values as per requirements. The configuration
-	    files are owned by root/user. The pgAdmin4 regression framework expects
-	    to find the files in the  directory '/<installation dir>/web/regression/'.
-	    If you move the file to another location, you must create a symbolic link
-	    that specifies the new location.
+	2b) After creating the server and test configuration file, add (or modify)
+	    parameter values as per requirements. The pgAdmin4 regression framework
+	    expects to find the files in the  directory
+	    '/<installation dir>/web/regression/'. If you move the file to another
+	    location, you must create a symbolic link that specifies the new location.
 
 	2c) Specifying Server Configuration file:
 
@@ -64,6 +66,13 @@ General Information
 	    server details and connection properties as per their local setup. The
 	    test_config file is in json format and property values are case-sensitive.
 
+	2d) Specifying the Test Configuration file:
+
+	    The user can add/change test data as per their need. The
+	    test_advanced_config file is in json format and property values are
+	    case-sensitive.
+
+
 Test Data Details
 -----------------
 
diff --git a/web/regression/config.py b/web/regression/config.py
index bef65fb..80686a1 100644
--- a/web/regression/config.py
+++ b/web/regression/config.py
@@ -14,3 +14,8 @@ root = os.path.dirname(os.path.realpath(__file__))
 
 with open(root + '/test_config.json') as data_file:
     config_data = json.load(data_file)
+
+with open(root + '/test_advanced_config.json') as data_file:
+    advance_config_data = json.load(data_file)
+
+pickle_path = os.path.join(root, 'parent_id.pkl')
diff --git a/web/regression/parent_id.pkl b/web/regression/parent_id.pkl
new file mode 100644
index 0000000..f4ab4ee
--- /dev/null
+++ b/web/regression/parent_id.pkl
@@ -0,0 +1,14 @@
+(dp0
+S'did'
+p1
+(lp2
+I158545
+aI158546
+asS'sid'
+p3
+(lp4
+V3
+p5
+aV5
+p6
+as.
\ No newline at end of file
diff --git a/web/regression/test_advanced_config.json.in b/web/regression/test_advanced_config.json.in
new file mode 100644
index 0000000..3729bcb
--- /dev/null
+++ b/web/regression/test_advanced_config.json.in
@@ -0,0 +1,105 @@
+{
+  "test_add_database_data": [
+   {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  }
+ ],
+
+  "test_db_update_data": [
+  {
+      "test_comment": "This is db update comment"
+  }
+ ]
+
+}
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..b3fd5ef
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,42 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    srv_grp = config_data['test_server_group']
+
+    # Connect to server
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    # Connect to database
+    con_response = node.tester.post('browser/database/connect/'
+                                    '{0}/{1}/{2}'.format
+                                    (srv_grp, server_id, db_id),
+                                    follow_redirects=True)
+
+    db_con = json.loads(con_response.data.decode())
+
+    return db_con
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..c68744f
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,20 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import pickle
+from regression.config import pickle_path
+
+
+def get_ids(url=pickle_path):
+    # This function will read parent nodes id's from pickle and return it.
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+    return ids
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 6e6fb0c..9f076c2 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -13,7 +13,8 @@ them to TestSuite. """
 import os
 import sys
 import unittest
-
+import operator
+import logging
 from testscenarios.scenarios import generate_scenarios
 
 # We need to include the root directory in sys.path to ensure that we can
@@ -24,6 +25,13 @@ root = os.path.dirname(current_path)
 if sys.path[0] != root:
     sys.path.insert(0, root)
 
+import config
+
+# Get the config database schema version. We store this in pgadmin.model
+# as it turns out that putting it in the config files isn't a great idea
+from pgadmin.model import SCHEMA_VERSION
+config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION
+
 from pgadmin import create_app
 
 # Create the app!
@@ -45,6 +53,22 @@ TestsGeneratorRegistry.load_generators('pgadmin')
 # application. We can trigger test request to the application.
 test_client = app.test_client()
 
+class StreamToLogger(object):
+    """
+    Fake file-like stream object that redirects writes to a logger instance.
+    """
+    def __init__(self, logger, log_level=logging.INFO):
+        self.logger = logger
+        self.log_level = log_level
+        self.linebuf = ''
+
+    def write(self, buf):
+        for line in buf.rstrip().splitlines():
+            self.logger.log(self.log_level, line.rstrip())
+
+    def flush(self):
+        pass
+
 
 def suite():
     """ Defining test suite which will execute all the testcases present in
@@ -59,6 +83,8 @@ def suite():
 
         modules.insert(gen.priority, gen)
 
+    modules.sort(key=operator.attrgetter('priority'))
+
     for m in modules:
         obj = m()
         obj.setTestClient(test_client)
@@ -69,5 +95,25 @@ def suite():
 
 
 if __name__ == '__main__':
+
+    print("Please check output in file: logger.log placed at "
+          ".../pgadmin4/web/regression")
+
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w'
+                        )
+
+    stdout_logger = logging.getLogger('STDOUT')
+    sl = StreamToLogger(stdout_logger, logging.INFO)
+    sys.stdout = sl
+
+    stderr_logger = logging.getLogger('STDERR')
+    sl = StreamToLogger(stderr_logger, logging.ERROR)
+    sys.stderr = sl
+
     suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    tests = unittest.TextTestRunner(descriptions=True, verbosity=2,
+                                    stream=sys.stdout).run(suite)
+    os.remove("parent_id.pkl")


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [text/plain] stdout.txt (186.3K, 2-stdout.txt)
  download

  [application/octet-stream] logger.log (30.7K, 3-logger.log)
  download

  [text/plain] regression.diff (41.1K, 4-regression.diff)
  download | inline diff:
diff --git a/.gitignore b/.gitignore
index ec82803..b58ab47 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,7 @@ runtime/ui_BrowserWindow.h
 runtime/.qmake.stash
 web/config_local.py
 web/regression/test_config.json
+web/regression/test_advanced_config.json
 pgadmin4.log
 *.swp
 *.swo
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..60ed4c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,16 @@
+# ##########################################################################
+#
+# #pgAdmin 4 - PostgreSQL Tools
+#
+# #Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# #This software is released under the PostgreSQL Licence
+#
+# ##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DatabaseGenerateTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..4278383
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,101 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, advance_config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import uuid
+import os
+from regression.test_utils import get_ids
+
+
+class DatabaseAddTestCase(LoginTestCase):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+    priority = 7
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        self.assertEquals(response.status_code, 200)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                     "datacl": advance_config_data['test_add_database_data'][0]
+                     ['test_privileges_acl'],
+                     "datconnlimit": advance_config_data
+                     ['test_add_database_data'][0]['test_conn_limit'],
+                     "datowner": advance_config_data
+                     ['test_add_database_data'][0]['test_owner'],
+                     "deffuncacl": advance_config_data
+                     ['test_add_database_data'][0]['test_fun_acl'],
+                     "defseqacl": advance_config_data
+                     ['test_add_database_data'][0]['test_seq_acl'],
+                     "deftblacl": advance_config_data
+                     ['test_add_database_data'][0]['test_tbl_acl'],
+                     "deftypeacl": advance_config_data
+                     ['test_add_database_data'][0]['test_type_acl'],
+                     "encoding": advance_config_data
+                     ['test_add_database_data'][0]['test_encoding'],
+                     "name": str(uuid.uuid4())[1:8],
+                     "privileges": advance_config_data
+                     ['test_add_database_data'][0]['test_privileges'],
+                     "securities": advance_config_data
+                     ['test_add_database_data'][0]['test_securities'],
+                     "variables": advance_config_data
+                     ['test_add_database_data'][0]['test_variables']
+                    }
+
+            db_response = self.tester.post(self.url + str(srv_grp) + "/" +
+                                           server_id + "/",
+                                           data=json.dumps(data),
+                                           content_type='html/json')
+
+            self.assertTrue(db_response.status_code, 200)
+
+            respdata = json.loads(db_response.data.decode())
+
+            db_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+
+                exst_server_id = open(pickle_path, 'rb')
+
+                tol_server_id = pickle.load(exst_server_id)
+                pickle_id_dict = tol_server_id
+
+                pickle_id_dict["did"].append(db_id)
+
+                db_output = open(pickle_path, 'wb')
+                pickle.dump(pickle_id_dict, db_output)
+                db_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
new file mode 100644
index 0000000..ca8ed9b
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -0,0 +1,45 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabaseDeleteTestCase(LoginTestCase):
+    """ This class will delete the database under last added server. """
+
+    priority = 98
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if len(db_con) == 0:
+            raise Exception("No database(s) to delete.")
+
+        response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                      str(server_id) + '/' + str(db_id),
+                                      follow_redirects=True)
+
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..e931985
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,43 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(LoginTestCase):
+    """
+    This class will fetch added database under server node.
+    """
+    priority = 8
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..ad83603
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,51 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data,  advance_config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class DatabasesUpdateTestCase(LoginTestCase):
+    """
+    This class will update the database under last added server.
+    """
+    priority = 9
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = {
+                "comments": advance_config_data["test_db_update_data"][0]
+                ["test_comment"],
+                "id": db_id
+                   }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 28cdb94..4fd2066 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class ServerGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In ServerGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..7499b85 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -8,16 +8,14 @@
 # ##########################################################################
 
 import json
-
+import pickle
+import os
 from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
+from regression.config import config_data, pickle_path
 
 
 class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
+    """ This class will add the servers under default server group. """
 
     priority = 4
 
@@ -27,14 +25,19 @@ class ServersAddTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
-        """
+        """ This function will add the server under default server group."""
+
+        # Storing parent id's into pickle dict
+        pickle_id_dict = \
+            {
+                "sid": [],  # server
+                "did": []   # database
+            }
 
         srv_grp = config_data['test_server_group']
 
         for srv in config_data['test_server_credentials']:
+
             data = {"name": srv['test_name'],
                     "comment": "",
                     "host": srv['test_host'],
@@ -44,10 +47,20 @@ class ServersAddTestCase(LoginTestCase):
                     "role": "",
                     "sslmode": srv['test_sslmode']}
 
-            url = self.url + str(srv_grp) + "/"
-
-            response = self.tester.post(url, data=json.dumps(data),
+            response = self.tester.post(self.url + str(srv_grp) + "/",
+                                        data=json.dumps(data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+            respdata = json.loads(response.data.decode())
+
+            server_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                pickle_id_dict = pickle.load(exst_server_id)
+
+            pickle_id_dict["sid"].append(server_id)
+            output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, output)
+            output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..997308e 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -8,17 +8,14 @@
 # ##################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
-    priority = 7
+class ServerDeleteTestCase(LoginTestCase):
+    """ This class will delete the last server present under tree node."""
+
+    priority = 99
 
     scenarios = [
         # Fetching the default url for server node
@@ -26,32 +23,22 @@ class ServersDeleteTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
-        """
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        url = self.url + str(srv_grp) + "/"
 
-            url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        respdata = json.loads(response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        if len(respdata) == 0:
+            raise Exception("No server(s) to delete.")
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        # delete last server
+        server = respdata[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..163fef3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,15 +7,14 @@
 #
 # ##########################################################################
 
-import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
 class ServersGetTestCase(LoginTestCase):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
@@ -27,23 +26,16 @@ class ServersGetTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers present under
-        object browser.
-        """
+        """ This function will fetch the added servers to object browser. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
+        for srv in server_id:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(srv),
                                        content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..f8cef24 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -8,16 +8,13 @@
 # ##########################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerUpdateTestCase(LoginTestCase):
+    """ This class will update server's comment field. """
 
     priority = 6
 
@@ -27,39 +24,41 @@ class ServersUpdateTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
-        """
+        """ This function will update the server's comment field. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
+        response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                   str(server_id),
+                                   follow_redirects=True)
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        con_response = self.tester.post('browser/server/connect/{0}/{1}'.format
+                                        (srv_grp, server_id),
+                                        data=dict(password=
+                                                  config_data
+                                                  ['test_server_credentials'][0]
+                                                  ['test_db_password']),
+                                        follow_redirects=True)
 
-            url = self.url + str(srv_grp) + "/"
+        srv_con = json.loads(con_response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        if len(srv_con) == 0:
+            raise Exception("No Server(s) connected to update.")
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        data = \
+            {
+                "comment": config_data
+                ['test_server_update_data']['test_comment'],
+                "id": server_id
+            }
 
-            for server in respdata:
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id), data=json.dumps(data),
+                                       content_type='html/json')
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        self.assertEquals(put_response.status_code, 200)
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        respdata = json.loads(put_response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_add.py b/web/pgadmin/browser/server_groups/tests/test_sg_add.py
deleted file mode 100644
index e70bb65..0000000
--- a/web/pgadmin/browser/server_groups/tests/test_sg_add.py
+++ /dev/null
@@ -1,36 +0,0 @@
-###########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2016, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-###########################################################################
-
-import json
-
-from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
-
-
-class SgNodeTestCase(LoginTestCase):
-    """
-     This class will check available server groups in pgAdmin.
-    """
-
-    priority = 1
-
-    scenarios = [
-        # Fetching the default url for server group node
-        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
-    ]
-
-    def runTest(self):
-        """This function will check available server groups."""
-
-        i = config_data['test_server_group']
-
-        response = self.tester.get(self.url + str(i), content_type='html/json')
-        self.assertTrue(response.status_code, 200)
-        respdata = json.loads(response.data)
-        self.assertTrue(respdata['id'], i)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
new file mode 100644
index 0000000..c552d8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -0,0 +1,36 @@
+###########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
+
+import json
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.config import config_data
+
+
+class SgGetTestCase(LoginTestCase):
+    """
+     This class will check available server groups in pgAdmin.
+    """
+
+    priority = 3
+
+    scenarios = [
+        # Fetching the default url for server group node
+        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
+    ]
+
+    def runTest(self):
+        """This function will check available server groups."""
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.get(self.url + str(srv_grp),
+                                   content_type='html/json')
+        self.assertEquals(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['id'], srv_grp)
diff --git a/web/pgadmin/browser/tests/__init__.py b/web/pgadmin/browser/tests/__init__.py
index 2381efd..4470711 100644
--- a/web/pgadmin/browser/tests/__init__.py
+++ b/web/pgadmin/browser/tests/__init__.py
@@ -11,5 +11,6 @@ from pgadmin.utils.route import BaseTestGenerator
 
 
 class BrowserGenerateTestCase(BaseTestGenerator):
+
     def runTest(self):
-        print ("In BrowserGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index dedb7d9..5c4930d 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -85,10 +85,10 @@ class ChangePasswordTestCase(LoginTestCase):
         """This function will check change password functionality."""
 
         response = self.tester.get('/change', follow_redirects=True)
-        self.assertIn('pgAdmin 4 Password Change', response.data)
+        self.assertIn('pgAdmin 4 Password Change', response.data.decode('utf8'))
         response = self.tester.post('/change', data=dict(
             password=self.password,
             new_password=self.new_password,
             new_password_confirm=self.new_password_confirm),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..d272a63 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,7 +8,6 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
@@ -67,7 +66,9 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
     def runTest(self):
@@ -76,4 +77,4 @@ class LoginTestCase(BaseTestGenerator):
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index 8971e72..d9611ae 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -14,14 +14,13 @@ from regression.config import config_data
 class LogoutTest(LoginTestCase):
     """
     This class verifies the logout functionality; provided the user is already
-    logged-in. Dictionary parameters define the scenario appended by test
-    name.
+    logged-in.
     """
 
-    priority = 3
+    priority = 100
 
     scenarios = [
-        # This test case validate the logout page
+        # This test case validate the logout page.
         ('Logging Out', dict(respdata='Redirecting...'))
     ]
 
@@ -29,7 +28,7 @@ class LogoutTest(LoginTestCase):
         """This function checks the logout functionality."""
 
         response = self.tester.get('/logout')
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
 
     def tearDown(self):
         """
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index 030b182..31a3992 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -41,8 +41,9 @@ class ResetPasswordTestCase(BaseTestGenerator):
         """This function checks reset password functionality."""
 
         response = self.tester.get('/reset')
-        self.assertIn('Recover pgAdmin 4 Password', response.data)
+        self.assertIn('Recover pgAdmin 4 Password',
+                      response.data.decode('utf8'))
         response = self.tester.post(
             '/reset', data=dict(email=self.email),
             follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index fb9de69..e439965 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -52,7 +52,10 @@ class TestsGeneratorRegistry(ABCMeta):
         from werkzeug.utils import find_modules
 
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 
 import six
diff --git a/web/regression/README b/web/regression/README
index e0003e4..0751661 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -40,23 +40,25 @@ General Information
     3. test_server_get.py
     4. test_server_update.py
 
-2) The pgAdmin4 source tree includes a file template for the server configuration
-   named ‘test_config.json.in' in the ‘pgAdmin4/web/regression’ directory. After
-   completing the pgAdmin4 configuration, you must make a working copy of the
-   template called test_config.json before modifying the file contents.
+2) The pgAdmin4 source tree includes 2 different configuration file templates.
+   One file template for the server configuration named ‘test_config.json.in'
+   and another for test configuration named 'test_advanced_config.json.in' in
+   the ‘pgAdmin4/web/regression’ directory. After completing the pgAdmin4
+   configuration, you must make a working copy of the templates called
+   test_config.json and test_advance_config.json before modifying the file contents.
 
 	2a) The following command copies the test_config.json.in file, creating a
-	    configuration file named test_config.json
+	    configuration file named test_config.json (same way user can copy
+	    test_advance_config.json.in file into test_advance_config.json)
 
             # cp pgadmin4/web/regression/test_config.json.in \
               pgadmin4/web/regression/test_config.json
 
-	2b) After creating the server configuration file, add (or modify)
-	    parameter values as per requirements. The configuration
-	    files are owned by root/user. The pgAdmin4 regression framework expects
-	    to find the files in the  directory '/<installation dir>/web/regression/'.
-	    If you move the file to another location, you must create a symbolic link
-	    that specifies the new location.
+	2b) After creating the server and test configuration file, add (or modify)
+	    parameter values as per requirements. The pgAdmin4 regression framework
+	    expects to find the files in the  directory
+	    '/<installation dir>/web/regression/'. If you move the file to another
+	    location, you must create a symbolic link that specifies the new location.
 
 	2c) Specifying Server Configuration file:
 
@@ -64,6 +66,13 @@ General Information
 	    server details and connection properties as per their local setup. The
 	    test_config file is in json format and property values are case-sensitive.
 
+	2d) Specifying the Test Configuration file:
+
+	    The user can add/change test data as per their need. The
+	    test_advanced_config file is in json format and property values are
+	    case-sensitive.
+
+
 Test Data Details
 -----------------
 
diff --git a/web/regression/config.py b/web/regression/config.py
index bef65fb..80686a1 100644
--- a/web/regression/config.py
+++ b/web/regression/config.py
@@ -14,3 +14,8 @@ root = os.path.dirname(os.path.realpath(__file__))
 
 with open(root + '/test_config.json') as data_file:
     config_data = json.load(data_file)
+
+with open(root + '/test_advanced_config.json') as data_file:
+    advance_config_data = json.load(data_file)
+
+pickle_path = os.path.join(root, 'parent_id.pkl')
diff --git a/web/regression/parent_id.pkl b/web/regression/parent_id.pkl
new file mode 100644
index 0000000..f4ab4ee
--- /dev/null
+++ b/web/regression/parent_id.pkl
@@ -0,0 +1,14 @@
+(dp0
+S'did'
+p1
+(lp2
+I158545
+aI158546
+asS'sid'
+p3
+(lp4
+V3
+p5
+aV5
+p6
+as.
\ No newline at end of file
diff --git a/web/regression/test_advanced_config.json.in b/web/regression/test_advanced_config.json.in
new file mode 100644
index 0000000..3729bcb
--- /dev/null
+++ b/web/regression/test_advanced_config.json.in
@@ -0,0 +1,105 @@
+{
+  "test_add_database_data": [
+   {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  }
+ ],
+
+  "test_db_update_data": [
+  {
+      "test_comment": "This is db update comment"
+  }
+ ]
+
+}
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..b3fd5ef
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,42 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    srv_grp = config_data['test_server_group']
+
+    # Connect to server
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    # Connect to database
+    con_response = node.tester.post('browser/database/connect/'
+                                    '{0}/{1}/{2}'.format
+                                    (srv_grp, server_id, db_id),
+                                    follow_redirects=True)
+
+    db_con = json.loads(con_response.data.decode())
+
+    return db_con
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..c68744f
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,20 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import pickle
+from regression.config import pickle_path
+
+
+def get_ids(url=pickle_path):
+    # This function will read parent nodes id's from pickle and return it.
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+    return ids
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 6e6fb0c..9f076c2 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -13,7 +13,8 @@ them to TestSuite. """
 import os
 import sys
 import unittest
-
+import operator
+import logging
 from testscenarios.scenarios import generate_scenarios
 
 # We need to include the root directory in sys.path to ensure that we can
@@ -24,6 +25,13 @@ root = os.path.dirname(current_path)
 if sys.path[0] != root:
     sys.path.insert(0, root)
 
+import config
+
+# Get the config database schema version. We store this in pgadmin.model
+# as it turns out that putting it in the config files isn't a great idea
+from pgadmin.model import SCHEMA_VERSION
+config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION
+
 from pgadmin import create_app
 
 # Create the app!
@@ -45,6 +53,22 @@ TestsGeneratorRegistry.load_generators('pgadmin')
 # application. We can trigger test request to the application.
 test_client = app.test_client()
 
+class StreamToLogger(object):
+    """
+    Fake file-like stream object that redirects writes to a logger instance.
+    """
+    def __init__(self, logger, log_level=logging.INFO):
+        self.logger = logger
+        self.log_level = log_level
+        self.linebuf = ''
+
+    def write(self, buf):
+        for line in buf.rstrip().splitlines():
+            self.logger.log(self.log_level, line.rstrip())
+
+    def flush(self):
+        pass
+
 
 def suite():
     """ Defining test suite which will execute all the testcases present in
@@ -59,6 +83,8 @@ def suite():
 
         modules.insert(gen.priority, gen)
 
+    modules.sort(key=operator.attrgetter('priority'))
+
     for m in modules:
         obj = m()
         obj.setTestClient(test_client)
@@ -69,5 +95,25 @@ def suite():
 
 
 if __name__ == '__main__':
+
+    print("Please check output in file: logger.log placed at "
+          ".../pgadmin4/web/regression")
+
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w'
+                        )
+
+    stdout_logger = logging.getLogger('STDOUT')
+    sl = StreamToLogger(stdout_logger, logging.INFO)
+    sys.stdout = sl
+
+    stderr_logger = logging.getLogger('STDERR')
+    sl = StreamToLogger(stderr_logger, logging.ERROR)
+    sys.stderr = sl
+
     suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    tests = unittest.TextTestRunner(descriptions=True, verbosity=2,
+                                    stream=sys.stdout).run(suite)
+    os.remove("parent_id.pkl")


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-07-04 11:16                         ` Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-07-04 11:16 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi Dave,

I am unable to reproduce issue on my side; tried on Python 2.7 and Python
3.4.
Could you please provide me DEBUG logs and test data using for database
node?

Thank you.

On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:

> Hi,
>
> That's better. I tweaked a few things and fixed a bug related to
> recent changes to the schema version config. Patch attached.
>
> However, there are still issues:
>
> 1) The testsuite doesn't run to completion. See the attached
> stdout.txt and logger.txt files.
> 2) stdout should only display the test summary - what tests are
> currently running (and pass/fail), and a summary at the end - even if
> there's a crash like I saw.
> 3) The output log file should contain the full output, including
> what's sent to stdout.
> 4) The output advises the user to check ".../pgadmin4/web/regression".
> This should be in the summary at the end, and should be corrected to
> show the correct (full) path.
>
> Thanks.
>
>
> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
> <[email protected]> wrote:
> > Hi Dave,
> >
> > As per discussion over mail i have created separate config files for
> > credentials and test data.
> >
> > PFA patch for same. Kindly, review and let me know for modifications.
> >
> > On 27 June 2016 at 15:10, Priyanka Shendge
> > <[email protected]> wrote:
> >>
> >>
> >>
> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
> >>>
> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
> >>> <[email protected]> wrote:
> >>> >
> >>> >
> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
> >>> >>
> >>> >> Hi
> >>> >>
> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
> >>> >> <[email protected]> wrote:
> >>> >> >
> >>> >> >
> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
> >>> >> > <[email protected]> wrote:
> >>> >> >>
> >>> >> >> Thanks a lot Dave.
> >>> >> >>
> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
> >>> >> >>>
> >>> >> >>> Hi
> >>> >> >>>
> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> >>> >> >>> <[email protected]> wrote:
> >>> >> >>> > Hi Dave,
> >>> >> >>> >
> >>> >> >>> > PFA updated patch. I have made changes suggested by you.
> >>> >> >>> >
> >>> >> >>> > Kindly, review and let me know for more changes.
> >>> >> >>>
> >>> >> >>> OK, I got a bit further this time, but not there yet.
> >>> >> >>>
> >>> >> >>> 1) The patch overwrote my test_config.json file. That should
> never
> >>> >> >>> happen (that file shouldn't be in the source tree).
> >>> >> >>> test_config.json.in should be the file that's included in the
> >>> >> >>> patch.
> >>> >> >>
> >>> >> >>
> >>> >> >> OK.
> >>> >> >>>
> >>> >> >>>
> >>> >> >>> 2) The updated test_config.json file is huge.
> >>> >> >
> >>> >> >
> >>> >> > Current configuration file web/regression/test_config.json
> contains
> >>> >> > test
> >>> >> > data(credentials) for each tree node;
> >>> >> > which is used while adding and updating the respective node.
> >>> >>
> >>> >> Why would we need that?
> >>> >
> >>> >
> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses
> respective
> >>> > credentials test data  from
> >>> > test_config.json while execution.
> >>>
> >>> That doesn't answer my question - why do we need separate credentials
> >>> for each node?
> >>
> >>
> >> Sorry for typo, its test data not credentials.
> >>
> >>>
> >>>
> >>> >> We should have just one set of credentials for
> >>> >> everything.
> >>> >
> >>> >
> >>> > Let me know if my understanding is clear:
> >>> >
> >>> > Should i keep basic credentials of each node (database, schema) into
> >>> > test_config.json
> >>> > instead  taking care of each field?
> >>>
> >>> You should have one set of credentials that's used for the entire test
> >>> run.
> >>
> >>
> >> Sure.  I'll separate the credentials and test data into 2 different
> files.
> >> So, a normal user can run the tests into one go after some minor
> >> credentials changes.
> >> And an advanced user can have an option to change the test data if he
> >> wants.
> >>>
> >>>
> >>> >> >>> I should only need to
> >>> >> >>> define one or more connections, then be able to run the tests.
> If
> >>> >> >>> you
> >>> >> >>> need to keep configuration info for "advanced users", let's put
> it
> >>> >> >>> in
> >>> >> >>> a different file to avoid confusing/scaring everyone else. Maybe
> >>> >> >>> split
> >>> >> >>> it into config.json for the stuff the user needs to edit
> >>> >> >>> (config.json.in would go in git), and test_config.json for the
> >>> >> >>> test
> >>> >> >>> configuration.
> >>> >> >
> >>> >> >
> >>> >> > Should i keep login and server credentials into
> >>> >> > web/regression/test_config.json file and
> >>> >> > put respective node details into config.json file of respective
> >>> >> > node's
> >>> >> > tests
> >>> >> > directory?
> >>> >>
> >>> >> Not if you expect users to need to edit them - and if not, why are
> the
> >>> >> values not just hard-coded?
> >>> >>
> >>> >> > e.g. for database node:
> >>> >> > I'll create config.json file into .../databases/tests/ directory
> >>> >> > put database add and update credentials into config.json
> >>> >>
> >>> >> The key here is to make it simple for users.
> >>> >>
> >>> >> - To run the default tests, they should be able to copy/edit a
> simple
> >>> >> file, and just add database server details for the server to run
> >>> >> against.
> >>> >>
> >>> >> - If we have configurable tests (because making them configurable
> adds
> >>> >> genuine value), then we can use an "advanced" config file to allow
> the
> >>> >> user to adjust settings as they want.
> >>> >>
> >>> >> In the simple case, the user should be able to run the tests
> >>> >> successfully within a minute or two from starting.
> >>> >>
> >>> >> In designing the layout for files etc, remember the following:
> >>> >>
> >>> >> - Users should never edit a file that is in our source control.
> That's
> >>> >> why we have .in files that we expect them to copy.
> >>> >>
> >>> >> - Unless they're an advanced user, they shouldn't need to copy the
> >>> >> config file for advanced options. That means that the tests should
> >>> >> have defaults that match what is in the template advanced config
> file
> >>> >> (or, the tests could read advanced.json.in if advanced.json doesn't
> >>> >> exist, though that does seem a little icky). Of course, those are
> >>> >> example filenames, not necessarily what you may choose.
> >>> >>
> >>> >> --
> >>> >> Dave Page
> >>> >> Blog: http://pgsnake.blogspot.com
> >>> >> Twitter: @pgsnake
> >>> >>
> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
> >>> >> The Enterprise PostgreSQL Company
> >>> >
> >>> >
> >>> >
> >>> >
> >>> > --
> >>> > Best,
> >>> > Priyanka
> >>> >
> >>> > EnterpriseDB Corporation
> >>> > The Enterprise PostgreSQL Company
> >>>
> >>>
> >>>
> >>> --
> >>> Dave Page
> >>> Blog: http://pgsnake.blogspot.com
> >>> Twitter: @pgsnake
> >>>
> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >>> The Enterprise PostgreSQL Company
> >>>
> >>>
> >>> --
> >>> Sent via pgadmin-hackers mailing list ([email protected])
> >>> To make changes to your subscription:
> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
> >>
> >>
> >>
> >>
> >> --
> >> Best,
> >> Priyanka
> >>
> >> EnterpriseDB Corporation
> >> The Enterprise PostgreSQL Company
> >
> >
> >
> >
> > --
> > Best,
> > Priyanka
> >
> > EnterpriseDB Corporation
> > The Enterprise PostgreSQL Company
>
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-07-04 12:00                           ` Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-07-04 12:00 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi

The test data was the default, and I ran against PG 9.4. All other logs were attached to my previous email.

-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK:http://www.enterprisedb.com
The Enterprise PostgreSQL Company

> On 4 Jul 2016, at 12:16, Priyanka Shendge <[email protected]> wrote:
> 
> Hi Dave,
> 
> I am unable to reproduce issue on my side; tried on Python 2.7 and Python 3.4.
> Could you please provide me DEBUG logs and test data using for database node? 
> 
> Thank you.
> 
>> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
>> Hi,
>> 
>> That's better. I tweaked a few things and fixed a bug related to
>> recent changes to the schema version config. Patch attached.
>> 
>> However, there are still issues:
>> 
>> 1) The testsuite doesn't run to completion. See the attached
>> stdout.txt and logger.txt files.
>> 2) stdout should only display the test summary - what tests are
>> currently running (and pass/fail), and a summary at the end - even if
>> there's a crash like I saw.
>> 3) The output log file should contain the full output, including
>> what's sent to stdout.
>> 4) The output advises the user to check ".../pgadmin4/web/regression".
>> This should be in the summary at the end, and should be corrected to
>> show the correct (full) path.
>> 
>> Thanks.
>> 
>> 
>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
>> <[email protected]> wrote:
>> > Hi Dave,
>> >
>> > As per discussion over mail i have created separate config files for
>> > credentials and test data.
>> >
>> > PFA patch for same. Kindly, review and let me know for modifications.
>> >
>> > On 27 June 2016 at 15:10, Priyanka Shendge
>> > <[email protected]> wrote:
>> >>
>> >>
>> >>
>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
>> >>>
>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>> >>> <[email protected]> wrote:
>> >>> >
>> >>> >
>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
>> >>> >>
>> >>> >> Hi
>> >>> >>
>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>> >>> >> <[email protected]> wrote:
>> >>> >> >
>> >>> >> >
>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>> >>> >> > <[email protected]> wrote:
>> >>> >> >>
>> >>> >> >> Thanks a lot Dave.
>> >>> >> >>
>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>> >>> >> >>>
>> >>> >> >>> Hi
>> >>> >> >>>
>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> >>> >> >>> <[email protected]> wrote:
>> >>> >> >>> > Hi Dave,
>> >>> >> >>> >
>> >>> >> >>> > PFA updated patch. I have made changes suggested by you.
>> >>> >> >>> >
>> >>> >> >>> > Kindly, review and let me know for more changes.
>> >>> >> >>>
>> >>> >> >>> OK, I got a bit further this time, but not there yet.
>> >>> >> >>>
>> >>> >> >>> 1) The patch overwrote my test_config.json file. That should never
>> >>> >> >>> happen (that file shouldn't be in the source tree).
>> >>> >> >>> test_config.json.in should be the file that's included in the
>> >>> >> >>> patch.
>> >>> >> >>
>> >>> >> >>
>> >>> >> >> OK.
>> >>> >> >>>
>> >>> >> >>>
>> >>> >> >>> 2) The updated test_config.json file is huge.
>> >>> >> >
>> >>> >> >
>> >>> >> > Current configuration file web/regression/test_config.json contains
>> >>> >> > test
>> >>> >> > data(credentials) for each tree node;
>> >>> >> > which is used while adding and updating the respective node.
>> >>> >>
>> >>> >> Why would we need that?
>> >>> >
>> >>> >
>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses respective
>> >>> > credentials test data  from
>> >>> > test_config.json while execution.
>> >>>
>> >>> That doesn't answer my question - why do we need separate credentials
>> >>> for each node?
>> >>
>> >>
>> >> Sorry for typo, its test data not credentials.
>> >>
>> >>>
>> >>>
>> >>> >> We should have just one set of credentials for
>> >>> >> everything.
>> >>> >
>> >>> >
>> >>> > Let me know if my understanding is clear:
>> >>> >
>> >>> > Should i keep basic credentials of each node (database, schema) into
>> >>> > test_config.json
>> >>> > instead  taking care of each field?
>> >>>
>> >>> You should have one set of credentials that's used for the entire test
>> >>> run.
>> >>
>> >>
>> >> Sure.  I'll separate the credentials and test data into 2 different files.
>> >> So, a normal user can run the tests into one go after some minor
>> >> credentials changes.
>> >> And an advanced user can have an option to change the test data if he
>> >> wants.
>> >>>
>> >>>
>> >>> >> >>> I should only need to
>> >>> >> >>> define one or more connections, then be able to run the tests. If
>> >>> >> >>> you
>> >>> >> >>> need to keep configuration info for "advanced users", let's put it
>> >>> >> >>> in
>> >>> >> >>> a different file to avoid confusing/scaring everyone else. Maybe
>> >>> >> >>> split
>> >>> >> >>> it into config.json for the stuff the user needs to edit
>> >>> >> >>> (config.json.in would go in git), and test_config.json for the
>> >>> >> >>> test
>> >>> >> >>> configuration.
>> >>> >> >
>> >>> >> >
>> >>> >> > Should i keep login and server credentials into
>> >>> >> > web/regression/test_config.json file and
>> >>> >> > put respective node details into config.json file of respective
>> >>> >> > node's
>> >>> >> > tests
>> >>> >> > directory?
>> >>> >>
>> >>> >> Not if you expect users to need to edit them - and if not, why are the
>> >>> >> values not just hard-coded?
>> >>> >>
>> >>> >> > e.g. for database node:
>> >>> >> > I'll create config.json file into .../databases/tests/ directory
>> >>> >> > put database add and update credentials into config.json
>> >>> >>
>> >>> >> The key here is to make it simple for users.
>> >>> >>
>> >>> >> - To run the default tests, they should be able to copy/edit a simple
>> >>> >> file, and just add database server details for the server to run
>> >>> >> against.
>> >>> >>
>> >>> >> - If we have configurable tests (because making them configurable adds
>> >>> >> genuine value), then we can use an "advanced" config file to allow the
>> >>> >> user to adjust settings as they want.
>> >>> >>
>> >>> >> In the simple case, the user should be able to run the tests
>> >>> >> successfully within a minute or two from starting.
>> >>> >>
>> >>> >> In designing the layout for files etc, remember the following:
>> >>> >>
>> >>> >> - Users should never edit a file that is in our source control. That's
>> >>> >> why we have .in files that we expect them to copy.
>> >>> >>
>> >>> >> - Unless they're an advanced user, they shouldn't need to copy the
>> >>> >> config file for advanced options. That means that the tests should
>> >>> >> have defaults that match what is in the template advanced config file
>> >>> >> (or, the tests could read advanced.json.in if advanced.json doesn't
>> >>> >> exist, though that does seem a little icky). Of course, those are
>> >>> >> example filenames, not necessarily what you may choose.
>> >>> >>
>> >>> >> --
>> >>> >> Dave Page
>> >>> >> Blog: http://pgsnake.blogspot.com
>> >>> >> Twitter: @pgsnake
>> >>> >>
>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >>> >> The Enterprise PostgreSQL Company
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> > --
>> >>> > Best,
>> >>> > Priyanka
>> >>> >
>> >>> > EnterpriseDB Corporation
>> >>> > The Enterprise PostgreSQL Company
>> >>>
>> >>>
>> >>>
>> >>> --
>> >>> Dave Page
>> >>> Blog: http://pgsnake.blogspot.com
>> >>> Twitter: @pgsnake
>> >>>
>> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >>> The Enterprise PostgreSQL Company
>> >>>
>> >>>
>> >>> --
>> >>> Sent via pgadmin-hackers mailing list ([email protected])
>> >>> To make changes to your subscription:
>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
>> >>
>> >>
>> >>
>> >>
>> >> --
>> >> Best,
>> >> Priyanka
>> >>
>> >> EnterpriseDB Corporation
>> >> The Enterprise PostgreSQL Company
>> >
>> >
>> >
>> >
>> > --
>> > Best,
>> > Priyanka
>> >
>> > EnterpriseDB Corporation
>> > The Enterprise PostgreSQL Company
>> 
>> 
>> 
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>> 
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
> 
> 
> 
> -- 
> Best,
> Priyanka
> 
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-07-05 08:00                             ` Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-07-05 08:00 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi Dave,

I tried running the testsuite against PG9.4 and unable to reproduce the
failures.
I have added debug statements to previous patch. Patch attached.
Could you please re-run the same and send me the logs and output?

Thank you.

On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:

> Hi
>
> The test data was the default, and I ran against PG 9.4. All other logs
> were attached to my previous email.
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK:http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
> On 4 Jul 2016, at 12:16, Priyanka Shendge <
> [email protected]> wrote:
>
> Hi Dave,
>
> I am unable to reproduce issue on my side; tried on Python 2.7 and Python
> 3.4.
> Could you please provide me DEBUG logs and test data using for database
> node?
>
> Thank you.
>
> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
>
>> Hi,
>>
>> That's better. I tweaked a few things and fixed a bug related to
>> recent changes to the schema version config. Patch attached.
>>
>> However, there are still issues:
>>
>> 1) The testsuite doesn't run to completion. See the attached
>> stdout.txt and logger.txt files.
>> 2) stdout should only display the test summary - what tests are
>> currently running (and pass/fail), and a summary at the end - even if
>> there's a crash like I saw.
>> 3) The output log file should contain the full output, including
>> what's sent to stdout.
>> 4) The output advises the user to check ".../pgadmin4/web/regression".
>> This should be in the summary at the end, and should be corrected to
>> show the correct (full) path.
>>
>> Thanks.
>>
>>
>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
>> <[email protected]> wrote:
>> > Hi Dave,
>> >
>> > As per discussion over mail i have created separate config files for
>> > credentials and test data.
>> >
>> > PFA patch for same. Kindly, review and let me know for modifications.
>> >
>> > On 27 June 2016 at 15:10, Priyanka Shendge
>> > <[email protected]> wrote:
>> >>
>> >>
>> >>
>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
>> >>>
>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>> >>> <[email protected]> wrote:
>> >>> >
>> >>> >
>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
>> >>> >>
>> >>> >> Hi
>> >>> >>
>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>> >>> >> <[email protected]> wrote:
>> >>> >> >
>> >>> >> >
>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>> >>> >> > <[email protected]> wrote:
>> >>> >> >>
>> >>> >> >> Thanks a lot Dave.
>> >>> >> >>
>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>> >>> >> >>>
>> >>> >> >>> Hi
>> >>> >> >>>
>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> >>> >> >>> <[email protected]> wrote:
>> >>> >> >>> > Hi Dave,
>> >>> >> >>> >
>> >>> >> >>> > PFA updated patch. I have made changes suggested by you.
>> >>> >> >>> >
>> >>> >> >>> > Kindly, review and let me know for more changes.
>> >>> >> >>>
>> >>> >> >>> OK, I got a bit further this time, but not there yet.
>> >>> >> >>>
>> >>> >> >>> 1) The patch overwrote my test_config.json file. That should
>> never
>> >>> >> >>> happen (that file shouldn't be in the source tree).
>> >>> >> >>> test_config.json.in should be the file that's included in the
>> >>> >> >>> patch.
>> >>> >> >>
>> >>> >> >>
>> >>> >> >> OK.
>> >>> >> >>>
>> >>> >> >>>
>> >>> >> >>> 2) The updated test_config.json file is huge.
>> >>> >> >
>> >>> >> >
>> >>> >> > Current configuration file web/regression/test_config.json
>> contains
>> >>> >> > test
>> >>> >> > data(credentials) for each tree node;
>> >>> >> > which is used while adding and updating the respective node.
>> >>> >>
>> >>> >> Why would we need that?
>> >>> >
>> >>> >
>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses
>> respective
>> >>> > credentials test data  from
>> >>> > test_config.json while execution.
>> >>>
>> >>> That doesn't answer my question - why do we need separate credentials
>> >>> for each node?
>> >>
>> >>
>> >> Sorry for typo, its test data not credentials.
>> >>
>> >>>
>> >>>
>> >>> >> We should have just one set of credentials for
>> >>> >> everything.
>> >>> >
>> >>> >
>> >>> > Let me know if my understanding is clear:
>> >>> >
>> >>> > Should i keep basic credentials of each node (database, schema) into
>> >>> > test_config.json
>> >>> > instead  taking care of each field?
>> >>>
>> >>> You should have one set of credentials that's used for the entire test
>> >>> run.
>> >>
>> >>
>> >> Sure.  I'll separate the credentials and test data into 2 different
>> files.
>> >> So, a normal user can run the tests into one go after some minor
>> >> credentials changes.
>> >> And an advanced user can have an option to change the test data if he
>> >> wants.
>> >>>
>> >>>
>> >>> >> >>> I should only need to
>> >>> >> >>> define one or more connections, then be able to run the tests.
>> If
>> >>> >> >>> you
>> >>> >> >>> need to keep configuration info for "advanced users", let's
>> put it
>> >>> >> >>> in
>> >>> >> >>> a different file to avoid confusing/scaring everyone else.
>> Maybe
>> >>> >> >>> split
>> >>> >> >>> it into config.json for the stuff the user needs to edit
>> >>> >> >>> (config.json.in would go in git), and test_config.json for the
>> >>> >> >>> test
>> >>> >> >>> configuration.
>> >>> >> >
>> >>> >> >
>> >>> >> > Should i keep login and server credentials into
>> >>> >> > web/regression/test_config.json file and
>> >>> >> > put respective node details into config.json file of respective
>> >>> >> > node's
>> >>> >> > tests
>> >>> >> > directory?
>> >>> >>
>> >>> >> Not if you expect users to need to edit them - and if not, why are
>> the
>> >>> >> values not just hard-coded?
>> >>> >>
>> >>> >> > e.g. for database node:
>> >>> >> > I'll create config.json file into .../databases/tests/ directory
>> >>> >> > put database add and update credentials into config.json
>> >>> >>
>> >>> >> The key here is to make it simple for users.
>> >>> >>
>> >>> >> - To run the default tests, they should be able to copy/edit a
>> simple
>> >>> >> file, and just add database server details for the server to run
>> >>> >> against.
>> >>> >>
>> >>> >> - If we have configurable tests (because making them configurable
>> adds
>> >>> >> genuine value), then we can use an "advanced" config file to allow
>> the
>> >>> >> user to adjust settings as they want.
>> >>> >>
>> >>> >> In the simple case, the user should be able to run the tests
>> >>> >> successfully within a minute or two from starting.
>> >>> >>
>> >>> >> In designing the layout for files etc, remember the following:
>> >>> >>
>> >>> >> - Users should never edit a file that is in our source control.
>> That's
>> >>> >> why we have .in files that we expect them to copy.
>> >>> >>
>> >>> >> - Unless they're an advanced user, they shouldn't need to copy the
>> >>> >> config file for advanced options. That means that the tests should
>> >>> >> have defaults that match what is in the template advanced config
>> file
>> >>> >> (or, the tests could read advanced.json.in if advanced.json
>> doesn't
>> >>> >> exist, though that does seem a little icky). Of course, those are
>> >>> >> example filenames, not necessarily what you may choose.
>> >>> >>
>> >>> >> --
>> >>> >> Dave Page
>> >>> >> Blog: http://pgsnake.blogspot.com
>> >>> >> Twitter: @pgsnake
>> >>> >>
>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >>> >> The Enterprise PostgreSQL Company
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> > --
>> >>> > Best,
>> >>> > Priyanka
>> >>> >
>> >>> > EnterpriseDB Corporation
>> >>> > The Enterprise PostgreSQL Company
>> >>>
>> >>>
>> >>>
>> >>> --
>> >>> Dave Page
>> >>> Blog: http://pgsnake.blogspot.com
>> >>> Twitter: @pgsnake
>> >>>
>> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >>> The Enterprise PostgreSQL Company
>> >>>
>> >>>
>> >>> --
>> >>> Sent via pgadmin-hackers mailing list ([email protected]
>> )
>> >>> To make changes to your subscription:
>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
>> >>
>> >>
>> >>
>> >>
>> >> --
>> >> Best,
>> >> Priyanka
>> >>
>> >> EnterpriseDB Corporation
>> >> The Enterprise PostgreSQL Company
>> >
>> >
>> >
>> >
>> > --
>> > Best,
>> > Priyanka
>> >
>> > EnterpriseDB Corporation
>> > The Enterprise PostgreSQL Company
>>
>>
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company
>
>


-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [application/octet-stream] pgadmin_api_debug.patch (35.8K, 3-pgadmin_api_debug.patch)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..60ed4c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,16 @@
+# ##########################################################################
+#
+# #pgAdmin 4 - PostgreSQL Tools
+#
+# #Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# #This software is released under the PostgreSQL Licence
+#
+# ##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DatabaseGenerateTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..8bbe9b2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,102 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, advance_config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import uuid
+import os
+from regression.test_utils import get_ids
+
+
+class DatabaseAddTestCase(LoginTestCase):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+    priority = 7
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        self.assertEquals(response.status_code, 200)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                     "datacl": advance_config_data['test_add_database_data']
+                     ['test_privileges_acl'],
+                     "datconnlimit": advance_config_data
+                     ['test_add_database_data']['test_conn_limit'],
+                     "datowner": advance_config_data
+                     ['test_add_database_data']['test_owner'],
+                     "deffuncacl": advance_config_data
+                     ['test_add_database_data']['test_fun_acl'],
+                     "defseqacl": advance_config_data
+                     ['test_add_database_data']['test_seq_acl'],
+                     "deftblacl": advance_config_data
+                     ['test_add_database_data']['test_tbl_acl'],
+                     "deftypeacl": advance_config_data
+                     ['test_add_database_data']['test_type_acl'],
+                     "encoding": advance_config_data
+                     ['test_add_database_data']['test_encoding'],
+                     "name": str(uuid.uuid4())[1:8],
+                     "privileges": advance_config_data
+                     ['test_add_database_data']['test_privileges'],
+                     "securities": advance_config_data
+                     ['test_add_database_data']['test_securities'],
+                     "variables": advance_config_data
+                     ['test_add_database_data']['test_variables']
+                    }
+
+            db_response = self.tester.post(self.url + str(srv_grp) + "/" +
+                                           server_id + "/",
+                                           data=json.dumps(data),
+                                           content_type='html/json')
+
+            self.assertTrue(db_response.status_code, 200)
+
+            respdata = json.loads(db_response.data.decode())
+
+            db_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+
+                exst_server_id = open(pickle_path, 'rb')
+
+                tol_server_id = pickle.load(exst_server_id)
+                pickle_id_dict = tol_server_id
+
+                pickle_id_dict["did"].append(db_id)
+                print("\ndb id in db add", pickle_id_dict["did"][0])
+
+                db_output = open(pickle_path, 'wb')
+                pickle.dump(pickle_id_dict, db_output)
+                db_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
new file mode 100644
index 0000000..d0fc93d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_delete.py
@@ -0,0 +1,48 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabaseDeleteTestCase(LoginTestCase):
+    """ This class will delete the database under last added server. """
+
+    priority = 98
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will delete the added database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        print("\ndb id in delete database:", db_id)
+
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if len(db_con) == 0:
+            raise Exception("No database(s) to delete.")
+
+        response = self.tester.delete(self.url + str(srv_grp) + '/' +
+                                      str(server_id) + '/' + str(db_id),
+                                      follow_redirects=True)
+
+        respdata = json.loads(response.data.decode())
+        print("database delete response", respdata)
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..984a99e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,46 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(LoginTestCase):
+    """
+    This class will fetch added database under server node.
+    """
+    priority = 8
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        print("\ndb id in get database:", db_id)
+
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+            print("database get response", response.data.decode())
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..3d9f867
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,55 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data,  advance_config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class DatabasesUpdateTestCase(LoginTestCase):
+    """
+    This class will update the database under last added server.
+    """
+    priority = 9
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        print("\ndb id in update database:", db_id)
+
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = {
+                "comments": advance_config_data["test_db_update_data"]
+                ["test_comment"],
+                "id": db_id
+                   }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+            print("database put response", put_response.data.decode())
+
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 28cdb94..4fd2066 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class ServerGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In ServerGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..499c0a0 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -8,16 +8,14 @@
 # ##########################################################################
 
 import json
-
+import pickle
+import os
 from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
+from regression.config import config_data, pickle_path
 
 
 class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
+    """ This class will add the servers under default server group. """
 
     priority = 4
 
@@ -27,14 +25,19 @@ class ServersAddTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
-        """
+        """ This function will add the server under default server group."""
+
+        # Storing parent id's into pickle dict
+        pickle_id_dict = \
+            {
+                "sid": [],  # server
+                "did": []   # database
+            }
 
         srv_grp = config_data['test_server_group']
 
         for srv in config_data['test_server_credentials']:
+
             data = {"name": srv['test_name'],
                     "comment": "",
                     "host": srv['test_host'],
@@ -44,10 +47,22 @@ class ServersAddTestCase(LoginTestCase):
                     "role": "",
                     "sslmode": srv['test_sslmode']}
 
-            url = self.url + str(srv_grp) + "/"
-
-            response = self.tester.post(url, data=json.dumps(data),
+            response = self.tester.post(self.url + str(srv_grp) + "/",
+                                        data=json.dumps(data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+            respdata = json.loads(response.data.decode())
+
+            server_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                pickle_id_dict = pickle.load(exst_server_id)
+
+            pickle_id_dict["sid"].append(server_id)
+            print("\nServer id in server add", pickle_id_dict["sid"][0])
+
+            output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, output)
+            output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..997308e 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -8,17 +8,14 @@
 # ##################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
-    priority = 7
+class ServerDeleteTestCase(LoginTestCase):
+    """ This class will delete the last server present under tree node."""
+
+    priority = 99
 
     scenarios = [
         # Fetching the default url for server node
@@ -26,32 +23,22 @@ class ServersDeleteTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
-        """
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        url = self.url + str(srv_grp) + "/"
 
-            url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        respdata = json.loads(response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        if len(respdata) == 0:
+            raise Exception("No server(s) to delete.")
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        # delete last server
+        server = respdata[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..163fef3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,15 +7,14 @@
 #
 # ##########################################################################
 
-import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
 class ServersGetTestCase(LoginTestCase):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
@@ -27,23 +26,16 @@ class ServersGetTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers present under
-        object browser.
-        """
+        """ This function will fetch the added servers to object browser. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
+        for srv in server_id:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(srv),
                                        content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..35d7c03 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -8,16 +8,13 @@
 # ##########################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerUpdateTestCase(LoginTestCase):
+    """ This class will update server's comment field. """
 
     priority = 6
 
@@ -27,39 +24,41 @@ class ServersUpdateTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
-        """
+        """ This function will update the server's comment field. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
+        response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                   str(server_id),
+                                   follow_redirects=True)
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        con_response = self.tester.post('browser/server/connect/{0}/{1}'.format
+                                        (srv_grp, server_id),
+                                        data=dict(password=
+                                                  config_data
+                                                  ['test_server_credentials'][0]
+                                                  ['test_db_password']),
+                                        follow_redirects=True)
 
-            url = self.url + str(srv_grp) + "/"
+        srv_con = json.loads(con_response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        if len(srv_con) == 0:
+            raise Exception("No Server(s) connected to update.")
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        data = \
+            {
+                "comment": config_data
+                ['test_server_update_data'][0]['test_comment'],
+                "id": server_id
+            }
 
-            for server in respdata:
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id), data=json.dumps(data),
+                                       content_type='html/json')
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        self.assertEquals(put_response.status_code, 200)
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        respdata = json.loads(put_response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
new file mode 100644
index 0000000..c552d8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -0,0 +1,36 @@
+###########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
+
+import json
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.config import config_data
+
+
+class SgGetTestCase(LoginTestCase):
+    """
+     This class will check available server groups in pgAdmin.
+    """
+
+    priority = 3
+
+    scenarios = [
+        # Fetching the default url for server group node
+        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
+    ]
+
+    def runTest(self):
+        """This function will check available server groups."""
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.get(self.url + str(srv_grp),
+                                   content_type='html/json')
+        self.assertEquals(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['id'], srv_grp)
diff --git a/web/pgadmin/browser/tests/__init__.py b/web/pgadmin/browser/tests/__init__.py
index 2381efd..4470711 100644
--- a/web/pgadmin/browser/tests/__init__.py
+++ b/web/pgadmin/browser/tests/__init__.py
@@ -11,5 +11,6 @@ from pgadmin.utils.route import BaseTestGenerator
 
 
 class BrowserGenerateTestCase(BaseTestGenerator):
+
     def runTest(self):
-        print ("In BrowserGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index dedb7d9..5c4930d 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -85,10 +85,10 @@ class ChangePasswordTestCase(LoginTestCase):
         """This function will check change password functionality."""
 
         response = self.tester.get('/change', follow_redirects=True)
-        self.assertIn('pgAdmin 4 Password Change', response.data)
+        self.assertIn('pgAdmin 4 Password Change', response.data.decode('utf8'))
         response = self.tester.post('/change', data=dict(
             password=self.password,
             new_password=self.new_password,
             new_password_confirm=self.new_password_confirm),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..d272a63 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,7 +8,6 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
@@ -67,7 +66,9 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
     def runTest(self):
@@ -76,4 +77,4 @@ class LoginTestCase(BaseTestGenerator):
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index 8971e72..d9611ae 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -14,14 +14,13 @@ from regression.config import config_data
 class LogoutTest(LoginTestCase):
     """
     This class verifies the logout functionality; provided the user is already
-    logged-in. Dictionary parameters define the scenario appended by test
-    name.
+    logged-in.
     """
 
-    priority = 3
+    priority = 100
 
     scenarios = [
-        # This test case validate the logout page
+        # This test case validate the logout page.
         ('Logging Out', dict(respdata='Redirecting...'))
     ]
 
@@ -29,7 +28,7 @@ class LogoutTest(LoginTestCase):
         """This function checks the logout functionality."""
 
         response = self.tester.get('/logout')
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
 
     def tearDown(self):
         """
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index 030b182..31a3992 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -41,8 +41,9 @@ class ResetPasswordTestCase(BaseTestGenerator):
         """This function checks reset password functionality."""
 
         response = self.tester.get('/reset')
-        self.assertIn('Recover pgAdmin 4 Password', response.data)
+        self.assertIn('Recover pgAdmin 4 Password',
+                      response.data.decode('utf8'))
         response = self.tester.post(
             '/reset', data=dict(email=self.email),
             follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index fb9de69..e439965 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -52,7 +52,10 @@ class TestsGeneratorRegistry(ABCMeta):
         from werkzeug.utils import find_modules
 
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 
 import six
diff --git a/web/regression/config.py b/web/regression/config.py
index bef65fb..f48eade 100644
--- a/web/regression/config.py
+++ b/web/regression/config.py
@@ -14,3 +14,8 @@ root = os.path.dirname(os.path.realpath(__file__))
 
 with open(root + '/test_config.json') as data_file:
     config_data = json.load(data_file)
+
+with open(root + '/test_advance_config.json') as data_file:
+    advance_config_data = json.load(data_file)
+
+pickle_path = os.path.join(root, 'parent_id.pkl')
diff --git a/web/regression/test_advance_config.json.in b/web/regression/test_advance_config.json.in
new file mode 100644
index 0000000..e415876
--- /dev/null
+++ b/web/regression/test_advance_config.json.in
@@ -0,0 +1,103 @@
+{
+  "test_add_database_data":
+   {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  },
+
+  "test_db_update_data":
+  {
+      "test_comment": "This is db update comment"
+  }
+
+}
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..8919595
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,46 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    print("db id in test nodes:", db_id)
+
+    srv_grp = config_data['test_server_group']
+
+    # Connect to server
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+
+    # Connect to database
+    con_response = node.tester.post('browser/database/connect/'
+                                    '{0}/{1}/{2}'.format
+                                    (srv_grp, server_id, db_id),
+                                    follow_redirects=True)
+    print("connect db response in test nodes",  con_response)
+
+    db_con = json.loads(con_response.data.decode())
+    print("db connection response in test nodes", db_con)
+
+    return db_con
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..c68744f
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,20 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import pickle
+from regression.config import pickle_path
+
+
+def get_ids(url=pickle_path):
+    # This function will read parent nodes id's from pickle and return it.
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+    return ids
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 75d437b..3d8d2c4 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -13,7 +13,8 @@ them to TestSuite. """
 import os
 import sys
 import unittest
-
+import operator
+import logging
 from testscenarios.scenarios import generate_scenarios
 
 # We need to include the root directory in sys.path to ensure that we can
@@ -65,6 +66,8 @@ def suite():
 
         modules.insert(gen.priority, gen)
 
+    modules.sort(key=operator.attrgetter('priority'))
+
     for m in modules:
         obj = m()
         obj.setTestClient(test_client)
@@ -75,5 +78,20 @@ def suite():
 
 
 if __name__ == '__main__':
+
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w')
+
     suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    tests = unittest.TextTestRunner(descriptions=True, verbosity=2,
+                                    stream=sys.stdout).run(suite)
+
+    print("Please check output in file: logger.log placed at", current_path)
+
+    try:
+        os.remove("parent_id.pkl")
+
+    except FileNotFoundError:
+        pass


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-07-05 10:10                               ` Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-07-05 10:10 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Attached.

On Tue, Jul 5, 2016 at 9:00 AM, Priyanka Shendge
<[email protected]> wrote:
> Hi Dave,
>
> I tried running the testsuite against PG9.4 and unable to reproduce the
> failures.
> I have added debug statements to previous patch. Patch attached.
> Could you please re-run the same and send me the logs and output?
>
> Thank you.
>
> On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:
>>
>> Hi
>>
>> The test data was the default, and I ran against PG 9.4. All other logs
>> were attached to my previous email.
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK:http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>>
>> On 4 Jul 2016, at 12:16, Priyanka Shendge
>> <[email protected]> wrote:
>>
>> Hi Dave,
>>
>> I am unable to reproduce issue on my side; tried on Python 2.7 and Python
>> 3.4.
>> Could you please provide me DEBUG logs and test data using for database
>> node?
>>
>> Thank you.
>>
>> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
>>>
>>> Hi,
>>>
>>> That's better. I tweaked a few things and fixed a bug related to
>>> recent changes to the schema version config. Patch attached.
>>>
>>> However, there are still issues:
>>>
>>> 1) The testsuite doesn't run to completion. See the attached
>>> stdout.txt and logger.txt files.
>>> 2) stdout should only display the test summary - what tests are
>>> currently running (and pass/fail), and a summary at the end - even if
>>> there's a crash like I saw.
>>> 3) The output log file should contain the full output, including
>>> what's sent to stdout.
>>> 4) The output advises the user to check ".../pgadmin4/web/regression".
>>> This should be in the summary at the end, and should be corrected to
>>> show the correct (full) path.
>>>
>>> Thanks.
>>>
>>>
>>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
>>> <[email protected]> wrote:
>>> > Hi Dave,
>>> >
>>> > As per discussion over mail i have created separate config files for
>>> > credentials and test data.
>>> >
>>> > PFA patch for same. Kindly, review and let me know for modifications.
>>> >
>>> > On 27 June 2016 at 15:10, Priyanka Shendge
>>> > <[email protected]> wrote:
>>> >>
>>> >>
>>> >>
>>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
>>> >>>
>>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>>> >>> <[email protected]> wrote:
>>> >>> >
>>> >>> >
>>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
>>> >>> >>
>>> >>> >> Hi
>>> >>> >>
>>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>>> >>> >> <[email protected]> wrote:
>>> >>> >> >
>>> >>> >> >
>>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>>> >>> >> > <[email protected]> wrote:
>>> >>> >> >>
>>> >>> >> >> Thanks a lot Dave.
>>> >>> >> >>
>>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]> wrote:
>>> >>> >> >>>
>>> >>> >> >>> Hi
>>> >>> >> >>>
>>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>>> >>> >> >>> <[email protected]> wrote:
>>> >>> >> >>> > Hi Dave,
>>> >>> >> >>> >
>>> >>> >> >>> > PFA updated patch. I have made changes suggested by you.
>>> >>> >> >>> >
>>> >>> >> >>> > Kindly, review and let me know for more changes.
>>> >>> >> >>>
>>> >>> >> >>> OK, I got a bit further this time, but not there yet.
>>> >>> >> >>>
>>> >>> >> >>> 1) The patch overwrote my test_config.json file. That should
>>> >>> >> >>> never
>>> >>> >> >>> happen (that file shouldn't be in the source tree).
>>> >>> >> >>> test_config.json.in should be the file that's included in the
>>> >>> >> >>> patch.
>>> >>> >> >>
>>> >>> >> >>
>>> >>> >> >> OK.
>>> >>> >> >>>
>>> >>> >> >>>
>>> >>> >> >>> 2) The updated test_config.json file is huge.
>>> >>> >> >
>>> >>> >> >
>>> >>> >> > Current configuration file web/regression/test_config.json
>>> >>> >> > contains
>>> >>> >> > test
>>> >>> >> > data(credentials) for each tree node;
>>> >>> >> > which is used while adding and updating the respective node.
>>> >>> >>
>>> >>> >> Why would we need that?
>>> >>> >
>>> >>> >
>>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses
>>> >>> > respective
>>> >>> > credentials test data  from
>>> >>> > test_config.json while execution.
>>> >>>
>>> >>> That doesn't answer my question - why do we need separate credentials
>>> >>> for each node?
>>> >>
>>> >>
>>> >> Sorry for typo, its test data not credentials.
>>> >>
>>> >>>
>>> >>>
>>> >>> >> We should have just one set of credentials for
>>> >>> >> everything.
>>> >>> >
>>> >>> >
>>> >>> > Let me know if my understanding is clear:
>>> >>> >
>>> >>> > Should i keep basic credentials of each node (database, schema)
>>> >>> > into
>>> >>> > test_config.json
>>> >>> > instead  taking care of each field?
>>> >>>
>>> >>> You should have one set of credentials that's used for the entire
>>> >>> test
>>> >>> run.
>>> >>
>>> >>
>>> >> Sure.  I'll separate the credentials and test data into 2 different
>>> >> files.
>>> >> So, a normal user can run the tests into one go after some minor
>>> >> credentials changes.
>>> >> And an advanced user can have an option to change the test data if he
>>> >> wants.
>>> >>>
>>> >>>
>>> >>> >> >>> I should only need to
>>> >>> >> >>> define one or more connections, then be able to run the tests.
>>> >>> >> >>> If
>>> >>> >> >>> you
>>> >>> >> >>> need to keep configuration info for "advanced users", let's
>>> >>> >> >>> put it
>>> >>> >> >>> in
>>> >>> >> >>> a different file to avoid confusing/scaring everyone else.
>>> >>> >> >>> Maybe
>>> >>> >> >>> split
>>> >>> >> >>> it into config.json for the stuff the user needs to edit
>>> >>> >> >>> (config.json.in would go in git), and test_config.json for the
>>> >>> >> >>> test
>>> >>> >> >>> configuration.
>>> >>> >> >
>>> >>> >> >
>>> >>> >> > Should i keep login and server credentials into
>>> >>> >> > web/regression/test_config.json file and
>>> >>> >> > put respective node details into config.json file of respective
>>> >>> >> > node's
>>> >>> >> > tests
>>> >>> >> > directory?
>>> >>> >>
>>> >>> >> Not if you expect users to need to edit them - and if not, why are
>>> >>> >> the
>>> >>> >> values not just hard-coded?
>>> >>> >>
>>> >>> >> > e.g. for database node:
>>> >>> >> > I'll create config.json file into .../databases/tests/ directory
>>> >>> >> > put database add and update credentials into config.json
>>> >>> >>
>>> >>> >> The key here is to make it simple for users.
>>> >>> >>
>>> >>> >> - To run the default tests, they should be able to copy/edit a
>>> >>> >> simple
>>> >>> >> file, and just add database server details for the server to run
>>> >>> >> against.
>>> >>> >>
>>> >>> >> - If we have configurable tests (because making them configurable
>>> >>> >> adds
>>> >>> >> genuine value), then we can use an "advanced" config file to allow
>>> >>> >> the
>>> >>> >> user to adjust settings as they want.
>>> >>> >>
>>> >>> >> In the simple case, the user should be able to run the tests
>>> >>> >> successfully within a minute or two from starting.
>>> >>> >>
>>> >>> >> In designing the layout for files etc, remember the following:
>>> >>> >>
>>> >>> >> - Users should never edit a file that is in our source control.
>>> >>> >> That's
>>> >>> >> why we have .in files that we expect them to copy.
>>> >>> >>
>>> >>> >> - Unless they're an advanced user, they shouldn't need to copy the
>>> >>> >> config file for advanced options. That means that the tests should
>>> >>> >> have defaults that match what is in the template advanced config
>>> >>> >> file
>>> >>> >> (or, the tests could read advanced.json.in if advanced.json
>>> >>> >> doesn't
>>> >>> >> exist, though that does seem a little icky). Of course, those are
>>> >>> >> example filenames, not necessarily what you may choose.
>>> >>> >>
>>> >>> >> --
>>> >>> >> Dave Page
>>> >>> >> Blog: http://pgsnake.blogspot.com
>>> >>> >> Twitter: @pgsnake
>>> >>> >>
>>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
>>> >>> >> The Enterprise PostgreSQL Company
>>> >>> >
>>> >>> >
>>> >>> >
>>> >>> >
>>> >>> > --
>>> >>> > Best,
>>> >>> > Priyanka
>>> >>> >
>>> >>> > EnterpriseDB Corporation
>>> >>> > The Enterprise PostgreSQL Company
>>> >>>
>>> >>>
>>> >>>
>>> >>> --
>>> >>> Dave Page
>>> >>> Blog: http://pgsnake.blogspot.com
>>> >>> Twitter: @pgsnake
>>> >>>
>>> >>> EnterpriseDB UK: http://www.enterprisedb.com
>>> >>> The Enterprise PostgreSQL Company
>>> >>>
>>> >>>
>>> >>> --
>>> >>> Sent via pgadmin-hackers mailing list
>>> >>> ([email protected])
>>> >>> To make changes to your subscription:
>>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Best,
>>> >> Priyanka
>>> >>
>>> >> EnterpriseDB Corporation
>>> >> The Enterprise PostgreSQL Company
>>> >
>>> >
>>> >
>>> >
>>> > --
>>> > Best,
>>> > Priyanka
>>> >
>>> > EnterpriseDB Corporation
>>> > The Enterprise PostgreSQL Company
>>>
>>>
>>>
>>> --
>>> Dave Page
>>> Blog: http://pgsnake.blogspot.com
>>> Twitter: @pgsnake
>>>
>>> EnterpriseDB UK: http://www.enterprisedb.com
>>> The Enterprise PostgreSQL Company
>>
>>
>>
>>
>> --
>> Best,
>> Priyanka
>>
>> EnterpriseDB Corporation
>> The Enterprise PostgreSQL Company
>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company



-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [application/octet-stream] logger.log (6.7K, 2-logger.log)
  download

  [application/octet-stream] output.log (200.7K, 3-output.log)
  download

^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-07-08 09:38                                 ` Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-07-08 09:38 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi Dave,

I have tried to reproduce the issue by running the test-suite on different
machines (64 and 32 bit) and
users on PG9.4/9.5 (Provided different "test_db_username" in
test_config.json). It is working fine at my end.

The log file (output.log) sent by you shows following query is failing at
your end:

SELECT
    db.oid as did, db.datname, db.datallowconn,
    pg_encoding_to_char(db.encoding) AS serverencoding,
    has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
FROM
    pg_database db
WHERE db.oid =

Let me know if you have an extra system where I can reproduce the issue.


On 5 July 2016 at 15:40, Dave Page <[email protected]> wrote:

> Attached.
>
> On Tue, Jul 5, 2016 at 9:00 AM, Priyanka Shendge
> <[email protected]> wrote:
> > Hi Dave,
> >
> > I tried running the testsuite against PG9.4 and unable to reproduce the
> > failures.
> > I have added debug statements to previous patch. Patch attached.
> > Could you please re-run the same and send me the logs and output?
> >
> > Thank you.
> >
> > On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:
> >>
> >> Hi
> >>
> >> The test data was the default, and I ran against PG 9.4. All other logs
> >> were attached to my previous email.
> >>
> >> --
> >> Dave Page
> >> Blog: http://pgsnake.blogspot.com
> >> Twitter: @pgsnake
> >>
> >> EnterpriseDB UK:http://www.enterprisedb.com
> >> The Enterprise PostgreSQL Company
> >>
> >> On 4 Jul 2016, at 12:16, Priyanka Shendge
> >> <[email protected]> wrote:
> >>
> >> Hi Dave,
> >>
> >> I am unable to reproduce issue on my side; tried on Python 2.7 and
> Python
> >> 3.4.
> >> Could you please provide me DEBUG logs and test data using for database
> >> node?
> >>
> >> Thank you.
> >>
> >> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
> >>>
> >>> Hi,
> >>>
> >>> That's better. I tweaked a few things and fixed a bug related to
> >>> recent changes to the schema version config. Patch attached.
> >>>
> >>> However, there are still issues:
> >>>
> >>> 1) The testsuite doesn't run to completion. See the attached
> >>> stdout.txt and logger.txt files.
> >>> 2) stdout should only display the test summary - what tests are
> >>> currently running (and pass/fail), and a summary at the end - even if
> >>> there's a crash like I saw.
> >>> 3) The output log file should contain the full output, including
> >>> what's sent to stdout.
> >>> 4) The output advises the user to check ".../pgadmin4/web/regression".
> >>> This should be in the summary at the end, and should be corrected to
> >>> show the correct (full) path.
> >>>
> >>> Thanks.
> >>>
> >>>
> >>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
> >>> <[email protected]> wrote:
> >>> > Hi Dave,
> >>> >
> >>> > As per discussion over mail i have created separate config files for
> >>> > credentials and test data.
> >>> >
> >>> > PFA patch for same. Kindly, review and let me know for modifications.
> >>> >
> >>> > On 27 June 2016 at 15:10, Priyanka Shendge
> >>> > <[email protected]> wrote:
> >>> >>
> >>> >>
> >>> >>
> >>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
> >>> >>>
> >>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
> >>> >>> <[email protected]> wrote:
> >>> >>> >
> >>> >>> >
> >>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
> >>> >>> >>
> >>> >>> >> Hi
> >>> >>> >>
> >>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
> >>> >>> >> <[email protected]> wrote:
> >>> >>> >> >
> >>> >>> >> >
> >>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
> >>> >>> >> > <[email protected]> wrote:
> >>> >>> >> >>
> >>> >>> >> >> Thanks a lot Dave.
> >>> >>> >> >>
> >>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]>
> wrote:
> >>> >>> >> >>>
> >>> >>> >> >>> Hi
> >>> >>> >> >>>
> >>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> >>> >>> >> >>> <[email protected]> wrote:
> >>> >>> >> >>> > Hi Dave,
> >>> >>> >> >>> >
> >>> >>> >> >>> > PFA updated patch. I have made changes suggested by you.
> >>> >>> >> >>> >
> >>> >>> >> >>> > Kindly, review and let me know for more changes.
> >>> >>> >> >>>
> >>> >>> >> >>> OK, I got a bit further this time, but not there yet.
> >>> >>> >> >>>
> >>> >>> >> >>> 1) The patch overwrote my test_config.json file. That should
> >>> >>> >> >>> never
> >>> >>> >> >>> happen (that file shouldn't be in the source tree).
> >>> >>> >> >>> test_config.json.in should be the file that's included in
> the
> >>> >>> >> >>> patch.
> >>> >>> >> >>
> >>> >>> >> >>
> >>> >>> >> >> OK.
> >>> >>> >> >>>
> >>> >>> >> >>>
> >>> >>> >> >>> 2) The updated test_config.json file is huge.
> >>> >>> >> >
> >>> >>> >> >
> >>> >>> >> > Current configuration file web/regression/test_config.json
> >>> >>> >> > contains
> >>> >>> >> > test
> >>> >>> >> > data(credentials) for each tree node;
> >>> >>> >> > which is used while adding and updating the respective node.
> >>> >>> >>
> >>> >>> >> Why would we need that?
> >>> >>> >
> >>> >>> >
> >>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses
> >>> >>> > respective
> >>> >>> > credentials test data  from
> >>> >>> > test_config.json while execution.
> >>> >>>
> >>> >>> That doesn't answer my question - why do we need separate
> credentials
> >>> >>> for each node?
> >>> >>
> >>> >>
> >>> >> Sorry for typo, its test data not credentials.
> >>> >>
> >>> >>>
> >>> >>>
> >>> >>> >> We should have just one set of credentials for
> >>> >>> >> everything.
> >>> >>> >
> >>> >>> >
> >>> >>> > Let me know if my understanding is clear:
> >>> >>> >
> >>> >>> > Should i keep basic credentials of each node (database, schema)
> >>> >>> > into
> >>> >>> > test_config.json
> >>> >>> > instead  taking care of each field?
> >>> >>>
> >>> >>> You should have one set of credentials that's used for the entire
> >>> >>> test
> >>> >>> run.
> >>> >>
> >>> >>
> >>> >> Sure.  I'll separate the credentials and test data into 2 different
> >>> >> files.
> >>> >> So, a normal user can run the tests into one go after some minor
> >>> >> credentials changes.
> >>> >> And an advanced user can have an option to change the test data if
> he
> >>> >> wants.
> >>> >>>
> >>> >>>
> >>> >>> >> >>> I should only need to
> >>> >>> >> >>> define one or more connections, then be able to run the
> tests.
> >>> >>> >> >>> If
> >>> >>> >> >>> you
> >>> >>> >> >>> need to keep configuration info for "advanced users", let's
> >>> >>> >> >>> put it
> >>> >>> >> >>> in
> >>> >>> >> >>> a different file to avoid confusing/scaring everyone else.
> >>> >>> >> >>> Maybe
> >>> >>> >> >>> split
> >>> >>> >> >>> it into config.json for the stuff the user needs to edit
> >>> >>> >> >>> (config.json.in would go in git), and test_config.json for
> the
> >>> >>> >> >>> test
> >>> >>> >> >>> configuration.
> >>> >>> >> >
> >>> >>> >> >
> >>> >>> >> > Should i keep login and server credentials into
> >>> >>> >> > web/regression/test_config.json file and
> >>> >>> >> > put respective node details into config.json file of
> respective
> >>> >>> >> > node's
> >>> >>> >> > tests
> >>> >>> >> > directory?
> >>> >>> >>
> >>> >>> >> Not if you expect users to need to edit them - and if not, why
> are
> >>> >>> >> the
> >>> >>> >> values not just hard-coded?
> >>> >>> >>
> >>> >>> >> > e.g. for database node:
> >>> >>> >> > I'll create config.json file into .../databases/tests/
> directory
> >>> >>> >> > put database add and update credentials into config.json
> >>> >>> >>
> >>> >>> >> The key here is to make it simple for users.
> >>> >>> >>
> >>> >>> >> - To run the default tests, they should be able to copy/edit a
> >>> >>> >> simple
> >>> >>> >> file, and just add database server details for the server to run
> >>> >>> >> against.
> >>> >>> >>
> >>> >>> >> - If we have configurable tests (because making them
> configurable
> >>> >>> >> adds
> >>> >>> >> genuine value), then we can use an "advanced" config file to
> allow
> >>> >>> >> the
> >>> >>> >> user to adjust settings as they want.
> >>> >>> >>
> >>> >>> >> In the simple case, the user should be able to run the tests
> >>> >>> >> successfully within a minute or two from starting.
> >>> >>> >>
> >>> >>> >> In designing the layout for files etc, remember the following:
> >>> >>> >>
> >>> >>> >> - Users should never edit a file that is in our source control.
> >>> >>> >> That's
> >>> >>> >> why we have .in files that we expect them to copy.
> >>> >>> >>
> >>> >>> >> - Unless they're an advanced user, they shouldn't need to copy
> the
> >>> >>> >> config file for advanced options. That means that the tests
> should
> >>> >>> >> have defaults that match what is in the template advanced config
> >>> >>> >> file
> >>> >>> >> (or, the tests could read advanced.json.in if advanced.json
> >>> >>> >> doesn't
> >>> >>> >> exist, though that does seem a little icky). Of course, those
> are
> >>> >>> >> example filenames, not necessarily what you may choose.
> >>> >>> >>
> >>> >>> >> --
> >>> >>> >> Dave Page
> >>> >>> >> Blog: http://pgsnake.blogspot.com
> >>> >>> >> Twitter: @pgsnake
> >>> >>> >>
> >>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
> >>> >>> >> The Enterprise PostgreSQL Company
> >>> >>> >
> >>> >>> >
> >>> >>> >
> >>> >>> >
> >>> >>> > --
> >>> >>> > Best,
> >>> >>> > Priyanka
> >>> >>> >
> >>> >>> > EnterpriseDB Corporation
> >>> >>> > The Enterprise PostgreSQL Company
> >>> >>>
> >>> >>>
> >>> >>>
> >>> >>> --
> >>> >>> Dave Page
> >>> >>> Blog: http://pgsnake.blogspot.com
> >>> >>> Twitter: @pgsnake
> >>> >>>
> >>> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >>> >>> The Enterprise PostgreSQL Company
> >>> >>>
> >>> >>>
> >>> >>> --
> >>> >>> Sent via pgadmin-hackers mailing list
> >>> >>> ([email protected])
> >>> >>> To make changes to your subscription:
> >>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
> >>> >>
> >>> >>
> >>> >>
> >>> >>
> >>> >> --
> >>> >> Best,
> >>> >> Priyanka
> >>> >>
> >>> >> EnterpriseDB Corporation
> >>> >> The Enterprise PostgreSQL Company
> >>> >
> >>> >
> >>> >
> >>> >
> >>> > --
> >>> > Best,
> >>> > Priyanka
> >>> >
> >>> > EnterpriseDB Corporation
> >>> > The Enterprise PostgreSQL Company
> >>>
> >>>
> >>>
> >>> --
> >>> Dave Page
> >>> Blog: http://pgsnake.blogspot.com
> >>> Twitter: @pgsnake
> >>>
> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >>> The Enterprise PostgreSQL Company
> >>
> >>
> >>
> >>
> >> --
> >> Best,
> >> Priyanka
> >>
> >> EnterpriseDB Corporation
> >> The Enterprise PostgreSQL Company
> >
> >
> >
> >
> > --
> > Best,
> > Priyanka
> >
> > EnterpriseDB Corporation
> > The Enterprise PostgreSQL Company
>
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-07-11 11:48                                   ` Dave Page <[email protected]>
  2016-07-11 12:25                                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-07-11 11:48 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Hi,

No, sorry I don't have an extra system you can test on.

It's pretty clear that query would fail - it's missing a database OID
after the =

On Fri, Jul 8, 2016 at 10:38 AM, Priyanka Shendge
<[email protected]> wrote:
> Hi Dave,
>
> I have tried to reproduce the issue by running the test-suite on different
> machines (64 and 32 bit) and
> users on PG9.4/9.5 (Provided different "test_db_username" in
> test_config.json). It is working fine at my end.
>
> The log file (output.log) sent by you shows following query is failing at
> your end:
>
> SELECT
>     db.oid as did, db.datname, db.datallowconn,
>     pg_encoding_to_char(db.encoding) AS serverencoding,
>     has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
> FROM
>     pg_database db
> WHERE db.oid =
>
> Let me know if you have an extra system where I can reproduce the issue.
>
>
> On 5 July 2016 at 15:40, Dave Page <[email protected]> wrote:
>>
>> Attached.
>>
>> On Tue, Jul 5, 2016 at 9:00 AM, Priyanka Shendge
>> <[email protected]> wrote:
>> > Hi Dave,
>> >
>> > I tried running the testsuite against PG9.4 and unable to reproduce the
>> > failures.
>> > I have added debug statements to previous patch. Patch attached.
>> > Could you please re-run the same and send me the logs and output?
>> >
>> > Thank you.
>> >
>> > On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:
>> >>
>> >> Hi
>> >>
>> >> The test data was the default, and I ran against PG 9.4. All other logs
>> >> were attached to my previous email.
>> >>
>> >> --
>> >> Dave Page
>> >> Blog: http://pgsnake.blogspot.com
>> >> Twitter: @pgsnake
>> >>
>> >> EnterpriseDB UK:http://www.enterprisedb.com
>> >> The Enterprise PostgreSQL Company
>> >>
>> >> On 4 Jul 2016, at 12:16, Priyanka Shendge
>> >> <[email protected]> wrote:
>> >>
>> >> Hi Dave,
>> >>
>> >> I am unable to reproduce issue on my side; tried on Python 2.7 and
>> >> Python
>> >> 3.4.
>> >> Could you please provide me DEBUG logs and test data using for database
>> >> node?
>> >>
>> >> Thank you.
>> >>
>> >> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
>> >>>
>> >>> Hi,
>> >>>
>> >>> That's better. I tweaked a few things and fixed a bug related to
>> >>> recent changes to the schema version config. Patch attached.
>> >>>
>> >>> However, there are still issues:
>> >>>
>> >>> 1) The testsuite doesn't run to completion. See the attached
>> >>> stdout.txt and logger.txt files.
>> >>> 2) stdout should only display the test summary - what tests are
>> >>> currently running (and pass/fail), and a summary at the end - even if
>> >>> there's a crash like I saw.
>> >>> 3) The output log file should contain the full output, including
>> >>> what's sent to stdout.
>> >>> 4) The output advises the user to check ".../pgadmin4/web/regression".
>> >>> This should be in the summary at the end, and should be corrected to
>> >>> show the correct (full) path.
>> >>>
>> >>> Thanks.
>> >>>
>> >>>
>> >>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
>> >>> <[email protected]> wrote:
>> >>> > Hi Dave,
>> >>> >
>> >>> > As per discussion over mail i have created separate config files for
>> >>> > credentials and test data.
>> >>> >
>> >>> > PFA patch for same. Kindly, review and let me know for
>> >>> > modifications.
>> >>> >
>> >>> > On 27 June 2016 at 15:10, Priyanka Shendge
>> >>> > <[email protected]> wrote:
>> >>> >>
>> >>> >>
>> >>> >>
>> >>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
>> >>> >>>
>> >>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>> >>> >>> <[email protected]> wrote:
>> >>> >>> >
>> >>> >>> >
>> >>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]> wrote:
>> >>> >>> >>
>> >>> >>> >> Hi
>> >>> >>> >>
>> >>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>> >>> >>> >> <[email protected]> wrote:
>> >>> >>> >> >
>> >>> >>> >> >
>> >>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>> >>> >>> >> > <[email protected]> wrote:
>> >>> >>> >> >>
>> >>> >>> >> >> Thanks a lot Dave.
>> >>> >>> >> >>
>> >>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]>
>> >>> >>> >> >> wrote:
>> >>> >>> >> >>>
>> >>> >>> >> >>> Hi
>> >>> >>> >> >>>
>> >>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> >>> >>> >> >>> <[email protected]> wrote:
>> >>> >>> >> >>> > Hi Dave,
>> >>> >>> >> >>> >
>> >>> >>> >> >>> > PFA updated patch. I have made changes suggested by you.
>> >>> >>> >> >>> >
>> >>> >>> >> >>> > Kindly, review and let me know for more changes.
>> >>> >>> >> >>>
>> >>> >>> >> >>> OK, I got a bit further this time, but not there yet.
>> >>> >>> >> >>>
>> >>> >>> >> >>> 1) The patch overwrote my test_config.json file. That
>> >>> >>> >> >>> should
>> >>> >>> >> >>> never
>> >>> >>> >> >>> happen (that file shouldn't be in the source tree).
>> >>> >>> >> >>> test_config.json.in should be the file that's included in
>> >>> >>> >> >>> the
>> >>> >>> >> >>> patch.
>> >>> >>> >> >>
>> >>> >>> >> >>
>> >>> >>> >> >> OK.
>> >>> >>> >> >>>
>> >>> >>> >> >>>
>> >>> >>> >> >>> 2) The updated test_config.json file is huge.
>> >>> >>> >> >
>> >>> >>> >> >
>> >>> >>> >> > Current configuration file web/regression/test_config.json
>> >>> >>> >> > contains
>> >>> >>> >> > test
>> >>> >>> >> > data(credentials) for each tree node;
>> >>> >>> >> > which is used while adding and updating the respective node.
>> >>> >>> >>
>> >>> >>> >> Why would we need that?
>> >>> >>> >
>> >>> >>> >
>> >>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses
>> >>> >>> > respective
>> >>> >>> > credentials test data  from
>> >>> >>> > test_config.json while execution.
>> >>> >>>
>> >>> >>> That doesn't answer my question - why do we need separate
>> >>> >>> credentials
>> >>> >>> for each node?
>> >>> >>
>> >>> >>
>> >>> >> Sorry for typo, its test data not credentials.
>> >>> >>
>> >>> >>>
>> >>> >>>
>> >>> >>> >> We should have just one set of credentials for
>> >>> >>> >> everything.
>> >>> >>> >
>> >>> >>> >
>> >>> >>> > Let me know if my understanding is clear:
>> >>> >>> >
>> >>> >>> > Should i keep basic credentials of each node (database, schema)
>> >>> >>> > into
>> >>> >>> > test_config.json
>> >>> >>> > instead  taking care of each field?
>> >>> >>>
>> >>> >>> You should have one set of credentials that's used for the entire
>> >>> >>> test
>> >>> >>> run.
>> >>> >>
>> >>> >>
>> >>> >> Sure.  I'll separate the credentials and test data into 2 different
>> >>> >> files.
>> >>> >> So, a normal user can run the tests into one go after some minor
>> >>> >> credentials changes.
>> >>> >> And an advanced user can have an option to change the test data if
>> >>> >> he
>> >>> >> wants.
>> >>> >>>
>> >>> >>>
>> >>> >>> >> >>> I should only need to
>> >>> >>> >> >>> define one or more connections, then be able to run the
>> >>> >>> >> >>> tests.
>> >>> >>> >> >>> If
>> >>> >>> >> >>> you
>> >>> >>> >> >>> need to keep configuration info for "advanced users", let's
>> >>> >>> >> >>> put it
>> >>> >>> >> >>> in
>> >>> >>> >> >>> a different file to avoid confusing/scaring everyone else.
>> >>> >>> >> >>> Maybe
>> >>> >>> >> >>> split
>> >>> >>> >> >>> it into config.json for the stuff the user needs to edit
>> >>> >>> >> >>> (config.json.in would go in git), and test_config.json for
>> >>> >>> >> >>> the
>> >>> >>> >> >>> test
>> >>> >>> >> >>> configuration.
>> >>> >>> >> >
>> >>> >>> >> >
>> >>> >>> >> > Should i keep login and server credentials into
>> >>> >>> >> > web/regression/test_config.json file and
>> >>> >>> >> > put respective node details into config.json file of
>> >>> >>> >> > respective
>> >>> >>> >> > node's
>> >>> >>> >> > tests
>> >>> >>> >> > directory?
>> >>> >>> >>
>> >>> >>> >> Not if you expect users to need to edit them - and if not, why
>> >>> >>> >> are
>> >>> >>> >> the
>> >>> >>> >> values not just hard-coded?
>> >>> >>> >>
>> >>> >>> >> > e.g. for database node:
>> >>> >>> >> > I'll create config.json file into .../databases/tests/
>> >>> >>> >> > directory
>> >>> >>> >> > put database add and update credentials into config.json
>> >>> >>> >>
>> >>> >>> >> The key here is to make it simple for users.
>> >>> >>> >>
>> >>> >>> >> - To run the default tests, they should be able to copy/edit a
>> >>> >>> >> simple
>> >>> >>> >> file, and just add database server details for the server to
>> >>> >>> >> run
>> >>> >>> >> against.
>> >>> >>> >>
>> >>> >>> >> - If we have configurable tests (because making them
>> >>> >>> >> configurable
>> >>> >>> >> adds
>> >>> >>> >> genuine value), then we can use an "advanced" config file to
>> >>> >>> >> allow
>> >>> >>> >> the
>> >>> >>> >> user to adjust settings as they want.
>> >>> >>> >>
>> >>> >>> >> In the simple case, the user should be able to run the tests
>> >>> >>> >> successfully within a minute or two from starting.
>> >>> >>> >>
>> >>> >>> >> In designing the layout for files etc, remember the following:
>> >>> >>> >>
>> >>> >>> >> - Users should never edit a file that is in our source control.
>> >>> >>> >> That's
>> >>> >>> >> why we have .in files that we expect them to copy.
>> >>> >>> >>
>> >>> >>> >> - Unless they're an advanced user, they shouldn't need to copy
>> >>> >>> >> the
>> >>> >>> >> config file for advanced options. That means that the tests
>> >>> >>> >> should
>> >>> >>> >> have defaults that match what is in the template advanced
>> >>> >>> >> config
>> >>> >>> >> file
>> >>> >>> >> (or, the tests could read advanced.json.in if advanced.json
>> >>> >>> >> doesn't
>> >>> >>> >> exist, though that does seem a little icky). Of course, those
>> >>> >>> >> are
>> >>> >>> >> example filenames, not necessarily what you may choose.
>> >>> >>> >>
>> >>> >>> >> --
>> >>> >>> >> Dave Page
>> >>> >>> >> Blog: http://pgsnake.blogspot.com
>> >>> >>> >> Twitter: @pgsnake
>> >>> >>> >>
>> >>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >>> >>> >> The Enterprise PostgreSQL Company
>> >>> >>> >
>> >>> >>> >
>> >>> >>> >
>> >>> >>> >
>> >>> >>> > --
>> >>> >>> > Best,
>> >>> >>> > Priyanka
>> >>> >>> >
>> >>> >>> > EnterpriseDB Corporation
>> >>> >>> > The Enterprise PostgreSQL Company
>> >>> >>>
>> >>> >>>
>> >>> >>>
>> >>> >>> --
>> >>> >>> Dave Page
>> >>> >>> Blog: http://pgsnake.blogspot.com
>> >>> >>> Twitter: @pgsnake
>> >>> >>>
>> >>> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >>> >>> The Enterprise PostgreSQL Company
>> >>> >>>
>> >>> >>>
>> >>> >>> --
>> >>> >>> Sent via pgadmin-hackers mailing list
>> >>> >>> ([email protected])
>> >>> >>> To make changes to your subscription:
>> >>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
>> >>> >>
>> >>> >>
>> >>> >>
>> >>> >>
>> >>> >> --
>> >>> >> Best,
>> >>> >> Priyanka
>> >>> >>
>> >>> >> EnterpriseDB Corporation
>> >>> >> The Enterprise PostgreSQL Company
>> >>> >
>> >>> >
>> >>> >
>> >>> >
>> >>> > --
>> >>> > Best,
>> >>> > Priyanka
>> >>> >
>> >>> > EnterpriseDB Corporation
>> >>> > The Enterprise PostgreSQL Company
>> >>>
>> >>>
>> >>>
>> >>> --
>> >>> Dave Page
>> >>> Blog: http://pgsnake.blogspot.com
>> >>> Twitter: @pgsnake
>> >>>
>> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >>> The Enterprise PostgreSQL Company
>> >>
>> >>
>> >>
>> >>
>> >> --
>> >> Best,
>> >> Priyanka
>> >>
>> >> EnterpriseDB Corporation
>> >> The Enterprise PostgreSQL Company
>> >
>> >
>> >
>> >
>> > --
>> > Best,
>> > Priyanka
>> >
>> > EnterpriseDB Corporation
>> > The Enterprise PostgreSQL Company
>>
>>
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company



-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers



^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-07-11 12:25                                     ` Priyanka Shendge <[email protected]>
  2016-07-11 13:05                                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-07-11 12:25 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>

Sorry, by mistake i copied incomplete query.  There is an OID present for
added database.

SELECT
    db.oid as did, db.datname, db.datallowconn,
    pg_encoding_to_char(db.encoding) AS serverencoding,
    has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
FROM
    pg_database db
WHERE db.oid = 158579


On 11 July 2016 at 17:18, Dave Page <[email protected]> wrote:

> Hi,
>
> No, sorry I don't have an extra system you can test on.
>
> It's pretty clear that query would fail - it's missing a database OID
> after the =
>
> On Fri, Jul 8, 2016 at 10:38 AM, Priyanka Shendge
> <[email protected]> wrote:
> > Hi Dave,
> >
> > I have tried to reproduce the issue by running the test-suite on
> different
> > machines (64 and 32 bit) and
> > users on PG9.4/9.5 (Provided different "test_db_username" in
> > test_config.json). It is working fine at my end.
> >
> > The log file (output.log) sent by you shows following query is failing at
> > your end:
> >
> > SELECT
> >     db.oid as did, db.datname, db.datallowconn,
> >     pg_encoding_to_char(db.encoding) AS serverencoding,
> >     has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
> > FROM
> >     pg_database db
> > WHERE db.oid =
> >
> > Let me know if you have an extra system where I can reproduce the issue.
> >
> >
> > On 5 July 2016 at 15:40, Dave Page <[email protected]> wrote:
> >>
> >> Attached.
> >>
> >> On Tue, Jul 5, 2016 at 9:00 AM, Priyanka Shendge
> >> <[email protected]> wrote:
> >> > Hi Dave,
> >> >
> >> > I tried running the testsuite against PG9.4 and unable to reproduce
> the
> >> > failures.
> >> > I have added debug statements to previous patch. Patch attached.
> >> > Could you please re-run the same and send me the logs and output?
> >> >
> >> > Thank you.
> >> >
> >> > On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:
> >> >>
> >> >> Hi
> >> >>
> >> >> The test data was the default, and I ran against PG 9.4. All other
> logs
> >> >> were attached to my previous email.
> >> >>
> >> >> --
> >> >> Dave Page
> >> >> Blog: http://pgsnake.blogspot.com
> >> >> Twitter: @pgsnake
> >> >>
> >> >> EnterpriseDB UK:http://www.enterprisedb.com
> >> >> The Enterprise PostgreSQL Company
> >> >>
> >> >> On 4 Jul 2016, at 12:16, Priyanka Shendge
> >> >> <[email protected]> wrote:
> >> >>
> >> >> Hi Dave,
> >> >>
> >> >> I am unable to reproduce issue on my side; tried on Python 2.7 and
> >> >> Python
> >> >> 3.4.
> >> >> Could you please provide me DEBUG logs and test data using for
> database
> >> >> node?
> >> >>
> >> >> Thank you.
> >> >>
> >> >> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
> >> >>>
> >> >>> Hi,
> >> >>>
> >> >>> That's better. I tweaked a few things and fixed a bug related to
> >> >>> recent changes to the schema version config. Patch attached.
> >> >>>
> >> >>> However, there are still issues:
> >> >>>
> >> >>> 1) The testsuite doesn't run to completion. See the attached
> >> >>> stdout.txt and logger.txt files.
> >> >>> 2) stdout should only display the test summary - what tests are
> >> >>> currently running (and pass/fail), and a summary at the end - even
> if
> >> >>> there's a crash like I saw.
> >> >>> 3) The output log file should contain the full output, including
> >> >>> what's sent to stdout.
> >> >>> 4) The output advises the user to check
> ".../pgadmin4/web/regression".
> >> >>> This should be in the summary at the end, and should be corrected to
> >> >>> show the correct (full) path.
> >> >>>
> >> >>> Thanks.
> >> >>>
> >> >>>
> >> >>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
> >> >>> <[email protected]> wrote:
> >> >>> > Hi Dave,
> >> >>> >
> >> >>> > As per discussion over mail i have created separate config files
> for
> >> >>> > credentials and test data.
> >> >>> >
> >> >>> > PFA patch for same. Kindly, review and let me know for
> >> >>> > modifications.
> >> >>> >
> >> >>> > On 27 June 2016 at 15:10, Priyanka Shendge
> >> >>> > <[email protected]> wrote:
> >> >>> >>
> >> >>> >>
> >> >>> >>
> >> >>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
> >> >>> >>>
> >> >>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
> >> >>> >>> <[email protected]> wrote:
> >> >>> >>> >
> >> >>> >>> >
> >> >>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]>
> wrote:
> >> >>> >>> >>
> >> >>> >>> >> Hi
> >> >>> >>> >>
> >> >>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
> >> >>> >>> >> <[email protected]> wrote:
> >> >>> >>> >> >
> >> >>> >>> >> >
> >> >>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
> >> >>> >>> >> > <[email protected]> wrote:
> >> >>> >>> >> >>
> >> >>> >>> >> >> Thanks a lot Dave.
> >> >>> >>> >> >>
> >> >>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]>
> >> >>> >>> >> >> wrote:
> >> >>> >>> >> >>>
> >> >>> >>> >> >>> Hi
> >> >>> >>> >> >>>
> >> >>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> >> >>> >>> >> >>> <[email protected]> wrote:
> >> >>> >>> >> >>> > Hi Dave,
> >> >>> >>> >> >>> >
> >> >>> >>> >> >>> > PFA updated patch. I have made changes suggested by
> you.
> >> >>> >>> >> >>> >
> >> >>> >>> >> >>> > Kindly, review and let me know for more changes.
> >> >>> >>> >> >>>
> >> >>> >>> >> >>> OK, I got a bit further this time, but not there yet.
> >> >>> >>> >> >>>
> >> >>> >>> >> >>> 1) The patch overwrote my test_config.json file. That
> >> >>> >>> >> >>> should
> >> >>> >>> >> >>> never
> >> >>> >>> >> >>> happen (that file shouldn't be in the source tree).
> >> >>> >>> >> >>> test_config.json.in should be the file that's included
> in
> >> >>> >>> >> >>> the
> >> >>> >>> >> >>> patch.
> >> >>> >>> >> >>
> >> >>> >>> >> >>
> >> >>> >>> >> >> OK.
> >> >>> >>> >> >>>
> >> >>> >>> >> >>>
> >> >>> >>> >> >>> 2) The updated test_config.json file is huge.
> >> >>> >>> >> >
> >> >>> >>> >> >
> >> >>> >>> >> > Current configuration file web/regression/test_config.json
> >> >>> >>> >> > contains
> >> >>> >>> >> > test
> >> >>> >>> >> > data(credentials) for each tree node;
> >> >>> >>> >> > which is used while adding and updating the respective
> node.
> >> >>> >>> >>
> >> >>> >>> >> Why would we need that?
> >> >>> >>> >
> >> >>> >>> >
> >> >>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses
> >> >>> >>> > respective
> >> >>> >>> > credentials test data  from
> >> >>> >>> > test_config.json while execution.
> >> >>> >>>
> >> >>> >>> That doesn't answer my question - why do we need separate
> >> >>> >>> credentials
> >> >>> >>> for each node?
> >> >>> >>
> >> >>> >>
> >> >>> >> Sorry for typo, its test data not credentials.
> >> >>> >>
> >> >>> >>>
> >> >>> >>>
> >> >>> >>> >> We should have just one set of credentials for
> >> >>> >>> >> everything.
> >> >>> >>> >
> >> >>> >>> >
> >> >>> >>> > Let me know if my understanding is clear:
> >> >>> >>> >
> >> >>> >>> > Should i keep basic credentials of each node (database,
> schema)
> >> >>> >>> > into
> >> >>> >>> > test_config.json
> >> >>> >>> > instead  taking care of each field?
> >> >>> >>>
> >> >>> >>> You should have one set of credentials that's used for the
> entire
> >> >>> >>> test
> >> >>> >>> run.
> >> >>> >>
> >> >>> >>
> >> >>> >> Sure.  I'll separate the credentials and test data into 2
> different
> >> >>> >> files.
> >> >>> >> So, a normal user can run the tests into one go after some minor
> >> >>> >> credentials changes.
> >> >>> >> And an advanced user can have an option to change the test data
> if
> >> >>> >> he
> >> >>> >> wants.
> >> >>> >>>
> >> >>> >>>
> >> >>> >>> >> >>> I should only need to
> >> >>> >>> >> >>> define one or more connections, then be able to run the
> >> >>> >>> >> >>> tests.
> >> >>> >>> >> >>> If
> >> >>> >>> >> >>> you
> >> >>> >>> >> >>> need to keep configuration info for "advanced users",
> let's
> >> >>> >>> >> >>> put it
> >> >>> >>> >> >>> in
> >> >>> >>> >> >>> a different file to avoid confusing/scaring everyone
> else.
> >> >>> >>> >> >>> Maybe
> >> >>> >>> >> >>> split
> >> >>> >>> >> >>> it into config.json for the stuff the user needs to edit
> >> >>> >>> >> >>> (config.json.in would go in git), and test_config.json
> for
> >> >>> >>> >> >>> the
> >> >>> >>> >> >>> test
> >> >>> >>> >> >>> configuration.
> >> >>> >>> >> >
> >> >>> >>> >> >
> >> >>> >>> >> > Should i keep login and server credentials into
> >> >>> >>> >> > web/regression/test_config.json file and
> >> >>> >>> >> > put respective node details into config.json file of
> >> >>> >>> >> > respective
> >> >>> >>> >> > node's
> >> >>> >>> >> > tests
> >> >>> >>> >> > directory?
> >> >>> >>> >>
> >> >>> >>> >> Not if you expect users to need to edit them - and if not,
> why
> >> >>> >>> >> are
> >> >>> >>> >> the
> >> >>> >>> >> values not just hard-coded?
> >> >>> >>> >>
> >> >>> >>> >> > e.g. for database node:
> >> >>> >>> >> > I'll create config.json file into .../databases/tests/
> >> >>> >>> >> > directory
> >> >>> >>> >> > put database add and update credentials into config.json
> >> >>> >>> >>
> >> >>> >>> >> The key here is to make it simple for users.
> >> >>> >>> >>
> >> >>> >>> >> - To run the default tests, they should be able to copy/edit
> a
> >> >>> >>> >> simple
> >> >>> >>> >> file, and just add database server details for the server to
> >> >>> >>> >> run
> >> >>> >>> >> against.
> >> >>> >>> >>
> >> >>> >>> >> - If we have configurable tests (because making them
> >> >>> >>> >> configurable
> >> >>> >>> >> adds
> >> >>> >>> >> genuine value), then we can use an "advanced" config file to
> >> >>> >>> >> allow
> >> >>> >>> >> the
> >> >>> >>> >> user to adjust settings as they want.
> >> >>> >>> >>
> >> >>> >>> >> In the simple case, the user should be able to run the tests
> >> >>> >>> >> successfully within a minute or two from starting.
> >> >>> >>> >>
> >> >>> >>> >> In designing the layout for files etc, remember the
> following:
> >> >>> >>> >>
> >> >>> >>> >> - Users should never edit a file that is in our source
> control.
> >> >>> >>> >> That's
> >> >>> >>> >> why we have .in files that we expect them to copy.
> >> >>> >>> >>
> >> >>> >>> >> - Unless they're an advanced user, they shouldn't need to
> copy
> >> >>> >>> >> the
> >> >>> >>> >> config file for advanced options. That means that the tests
> >> >>> >>> >> should
> >> >>> >>> >> have defaults that match what is in the template advanced
> >> >>> >>> >> config
> >> >>> >>> >> file
> >> >>> >>> >> (or, the tests could read advanced.json.in if advanced.json
> >> >>> >>> >> doesn't
> >> >>> >>> >> exist, though that does seem a little icky). Of course, those
> >> >>> >>> >> are
> >> >>> >>> >> example filenames, not necessarily what you may choose.
> >> >>> >>> >>
> >> >>> >>> >> --
> >> >>> >>> >> Dave Page
> >> >>> >>> >> Blog: http://pgsnake.blogspot.com
> >> >>> >>> >> Twitter: @pgsnake
> >> >>> >>> >>
> >> >>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
> >> >>> >>> >> The Enterprise PostgreSQL Company
> >> >>> >>> >
> >> >>> >>> >
> >> >>> >>> >
> >> >>> >>> >
> >> >>> >>> > --
> >> >>> >>> > Best,
> >> >>> >>> > Priyanka
> >> >>> >>> >
> >> >>> >>> > EnterpriseDB Corporation
> >> >>> >>> > The Enterprise PostgreSQL Company
> >> >>> >>>
> >> >>> >>>
> >> >>> >>>
> >> >>> >>> --
> >> >>> >>> Dave Page
> >> >>> >>> Blog: http://pgsnake.blogspot.com
> >> >>> >>> Twitter: @pgsnake
> >> >>> >>>
> >> >>> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >> >>> >>> The Enterprise PostgreSQL Company
> >> >>> >>>
> >> >>> >>>
> >> >>> >>> --
> >> >>> >>> Sent via pgadmin-hackers mailing list
> >> >>> >>> ([email protected])
> >> >>> >>> To make changes to your subscription:
> >> >>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
> >> >>> >>
> >> >>> >>
> >> >>> >>
> >> >>> >>
> >> >>> >> --
> >> >>> >> Best,
> >> >>> >> Priyanka
> >> >>> >>
> >> >>> >> EnterpriseDB Corporation
> >> >>> >> The Enterprise PostgreSQL Company
> >> >>> >
> >> >>> >
> >> >>> >
> >> >>> >
> >> >>> > --
> >> >>> > Best,
> >> >>> > Priyanka
> >> >>> >
> >> >>> > EnterpriseDB Corporation
> >> >>> > The Enterprise PostgreSQL Company
> >> >>>
> >> >>>
> >> >>>
> >> >>> --
> >> >>> Dave Page
> >> >>> Blog: http://pgsnake.blogspot.com
> >> >>> Twitter: @pgsnake
> >> >>>
> >> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >> >>> The Enterprise PostgreSQL Company
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> --
> >> >> Best,
> >> >> Priyanka
> >> >>
> >> >> EnterpriseDB Corporation
> >> >> The Enterprise PostgreSQL Company
> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > Best,
> >> > Priyanka
> >> >
> >> > EnterpriseDB Corporation
> >> > The Enterprise PostgreSQL Company
> >>
> >>
> >>
> >> --
> >> Dave Page
> >> Blog: http://pgsnake.blogspot.com
> >> Twitter: @pgsnake
> >>
> >> EnterpriseDB UK: http://www.enterprisedb.com
> >> The Enterprise PostgreSQL Company
> >
> >
> >
> >
> > --
> > Best,
> > Priyanka
> >
> > EnterpriseDB Corporation
> > The Enterprise PostgreSQL Company
>
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 12:25                                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-07-11 13:05                                       ` Dave Page <[email protected]>
  2016-07-11 13:45                                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-07-11 13:05 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>; Khushboo Vashi <[email protected]>

On Mon, Jul 11, 2016 at 1:25 PM, Priyanka Shendge
<[email protected]> wrote:
> Sorry, by mistake i copied incomplete query.  There is an OID present for
> added database.
>
> SELECT
>     db.oid as did, db.datname, db.datallowconn,
>     pg_encoding_to_char(db.encoding) AS serverencoding,
>     has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
> FROM
>     pg_database db
> WHERE db.oid = 158579

There's nothing wrong with that query. Can you work with Khushboo to
see if she can reproduce or help figure it out please?

Thanks.

> On 11 July 2016 at 17:18, Dave Page <[email protected]> wrote:
>>
>> Hi,
>>
>> No, sorry I don't have an extra system you can test on.
>>
>> It's pretty clear that query would fail - it's missing a database OID
>> after the =
>>
>> On Fri, Jul 8, 2016 at 10:38 AM, Priyanka Shendge
>> <[email protected]> wrote:
>> > Hi Dave,
>> >
>> > I have tried to reproduce the issue by running the test-suite on
>> > different
>> > machines (64 and 32 bit) and
>> > users on PG9.4/9.5 (Provided different "test_db_username" in
>> > test_config.json). It is working fine at my end.
>> >
>> > The log file (output.log) sent by you shows following query is failing
>> > at
>> > your end:
>> >
>> > SELECT
>> >     db.oid as did, db.datname, db.datallowconn,
>> >     pg_encoding_to_char(db.encoding) AS serverencoding,
>> >     has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
>> > FROM
>> >     pg_database db
>> > WHERE db.oid =
>> >
>> > Let me know if you have an extra system where I can reproduce the issue.
>> >
>> >
>> > On 5 July 2016 at 15:40, Dave Page <[email protected]> wrote:
>> >>
>> >> Attached.
>> >>
>> >> On Tue, Jul 5, 2016 at 9:00 AM, Priyanka Shendge
>> >> <[email protected]> wrote:
>> >> > Hi Dave,
>> >> >
>> >> > I tried running the testsuite against PG9.4 and unable to reproduce
>> >> > the
>> >> > failures.
>> >> > I have added debug statements to previous patch. Patch attached.
>> >> > Could you please re-run the same and send me the logs and output?
>> >> >
>> >> > Thank you.
>> >> >
>> >> > On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:
>> >> >>
>> >> >> Hi
>> >> >>
>> >> >> The test data was the default, and I ran against PG 9.4. All other
>> >> >> logs
>> >> >> were attached to my previous email.
>> >> >>
>> >> >> --
>> >> >> Dave Page
>> >> >> Blog: http://pgsnake.blogspot.com
>> >> >> Twitter: @pgsnake
>> >> >>
>> >> >> EnterpriseDB UK:http://www.enterprisedb.com
>> >> >> The Enterprise PostgreSQL Company
>> >> >>
>> >> >> On 4 Jul 2016, at 12:16, Priyanka Shendge
>> >> >> <[email protected]> wrote:
>> >> >>
>> >> >> Hi Dave,
>> >> >>
>> >> >> I am unable to reproduce issue on my side; tried on Python 2.7 and
>> >> >> Python
>> >> >> 3.4.
>> >> >> Could you please provide me DEBUG logs and test data using for
>> >> >> database
>> >> >> node?
>> >> >>
>> >> >> Thank you.
>> >> >>
>> >> >> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
>> >> >>>
>> >> >>> Hi,
>> >> >>>
>> >> >>> That's better. I tweaked a few things and fixed a bug related to
>> >> >>> recent changes to the schema version config. Patch attached.
>> >> >>>
>> >> >>> However, there are still issues:
>> >> >>>
>> >> >>> 1) The testsuite doesn't run to completion. See the attached
>> >> >>> stdout.txt and logger.txt files.
>> >> >>> 2) stdout should only display the test summary - what tests are
>> >> >>> currently running (and pass/fail), and a summary at the end - even
>> >> >>> if
>> >> >>> there's a crash like I saw.
>> >> >>> 3) The output log file should contain the full output, including
>> >> >>> what's sent to stdout.
>> >> >>> 4) The output advises the user to check
>> >> >>> ".../pgadmin4/web/regression".
>> >> >>> This should be in the summary at the end, and should be corrected
>> >> >>> to
>> >> >>> show the correct (full) path.
>> >> >>>
>> >> >>> Thanks.
>> >> >>>
>> >> >>>
>> >> >>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
>> >> >>> <[email protected]> wrote:
>> >> >>> > Hi Dave,
>> >> >>> >
>> >> >>> > As per discussion over mail i have created separate config files
>> >> >>> > for
>> >> >>> > credentials and test data.
>> >> >>> >
>> >> >>> > PFA patch for same. Kindly, review and let me know for
>> >> >>> > modifications.
>> >> >>> >
>> >> >>> > On 27 June 2016 at 15:10, Priyanka Shendge
>> >> >>> > <[email protected]> wrote:
>> >> >>> >>
>> >> >>> >>
>> >> >>> >>
>> >> >>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]> wrote:
>> >> >>> >>>
>> >> >>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>> >> >>> >>> <[email protected]> wrote:
>> >> >>> >>> >
>> >> >>> >>> >
>> >> >>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]>
>> >> >>> >>> > wrote:
>> >> >>> >>> >>
>> >> >>> >>> >> Hi
>> >> >>> >>> >>
>> >> >>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>> >> >>> >>> >> <[email protected]> wrote:
>> >> >>> >>> >> >
>> >> >>> >>> >> >
>> >> >>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>> >> >>> >>> >> > <[email protected]> wrote:
>> >> >>> >>> >> >>
>> >> >>> >>> >> >> Thanks a lot Dave.
>> >> >>> >>> >> >>
>> >> >>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]>
>> >> >>> >>> >> >> wrote:
>> >> >>> >>> >> >>>
>> >> >>> >>> >> >>> Hi
>> >> >>> >>> >> >>>
>> >> >>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> >> >>> >>> >> >>> <[email protected]> wrote:
>> >> >>> >>> >> >>> > Hi Dave,
>> >> >>> >>> >> >>> >
>> >> >>> >>> >> >>> > PFA updated patch. I have made changes suggested by
>> >> >>> >>> >> >>> > you.
>> >> >>> >>> >> >>> >
>> >> >>> >>> >> >>> > Kindly, review and let me know for more changes.
>> >> >>> >>> >> >>>
>> >> >>> >>> >> >>> OK, I got a bit further this time, but not there yet.
>> >> >>> >>> >> >>>
>> >> >>> >>> >> >>> 1) The patch overwrote my test_config.json file. That
>> >> >>> >>> >> >>> should
>> >> >>> >>> >> >>> never
>> >> >>> >>> >> >>> happen (that file shouldn't be in the source tree).
>> >> >>> >>> >> >>> test_config.json.in should be the file that's included
>> >> >>> >>> >> >>> in
>> >> >>> >>> >> >>> the
>> >> >>> >>> >> >>> patch.
>> >> >>> >>> >> >>
>> >> >>> >>> >> >>
>> >> >>> >>> >> >> OK.
>> >> >>> >>> >> >>>
>> >> >>> >>> >> >>>
>> >> >>> >>> >> >>> 2) The updated test_config.json file is huge.
>> >> >>> >>> >> >
>> >> >>> >>> >> >
>> >> >>> >>> >> > Current configuration file web/regression/test_config.json
>> >> >>> >>> >> > contains
>> >> >>> >>> >> > test
>> >> >>> >>> >> > data(credentials) for each tree node;
>> >> >>> >>> >> > which is used while adding and updating the respective
>> >> >>> >>> >> > node.
>> >> >>> >>> >>
>> >> >>> >>> >> Why would we need that?
>> >> >>> >>> >
>> >> >>> >>> >
>> >> >>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py) uses
>> >> >>> >>> > respective
>> >> >>> >>> > credentials test data  from
>> >> >>> >>> > test_config.json while execution.
>> >> >>> >>>
>> >> >>> >>> That doesn't answer my question - why do we need separate
>> >> >>> >>> credentials
>> >> >>> >>> for each node?
>> >> >>> >>
>> >> >>> >>
>> >> >>> >> Sorry for typo, its test data not credentials.
>> >> >>> >>
>> >> >>> >>>
>> >> >>> >>>
>> >> >>> >>> >> We should have just one set of credentials for
>> >> >>> >>> >> everything.
>> >> >>> >>> >
>> >> >>> >>> >
>> >> >>> >>> > Let me know if my understanding is clear:
>> >> >>> >>> >
>> >> >>> >>> > Should i keep basic credentials of each node (database,
>> >> >>> >>> > schema)
>> >> >>> >>> > into
>> >> >>> >>> > test_config.json
>> >> >>> >>> > instead  taking care of each field?
>> >> >>> >>>
>> >> >>> >>> You should have one set of credentials that's used for the
>> >> >>> >>> entire
>> >> >>> >>> test
>> >> >>> >>> run.
>> >> >>> >>
>> >> >>> >>
>> >> >>> >> Sure.  I'll separate the credentials and test data into 2
>> >> >>> >> different
>> >> >>> >> files.
>> >> >>> >> So, a normal user can run the tests into one go after some minor
>> >> >>> >> credentials changes.
>> >> >>> >> And an advanced user can have an option to change the test data
>> >> >>> >> if
>> >> >>> >> he
>> >> >>> >> wants.
>> >> >>> >>>
>> >> >>> >>>
>> >> >>> >>> >> >>> I should only need to
>> >> >>> >>> >> >>> define one or more connections, then be able to run the
>> >> >>> >>> >> >>> tests.
>> >> >>> >>> >> >>> If
>> >> >>> >>> >> >>> you
>> >> >>> >>> >> >>> need to keep configuration info for "advanced users",
>> >> >>> >>> >> >>> let's
>> >> >>> >>> >> >>> put it
>> >> >>> >>> >> >>> in
>> >> >>> >>> >> >>> a different file to avoid confusing/scaring everyone
>> >> >>> >>> >> >>> else.
>> >> >>> >>> >> >>> Maybe
>> >> >>> >>> >> >>> split
>> >> >>> >>> >> >>> it into config.json for the stuff the user needs to edit
>> >> >>> >>> >> >>> (config.json.in would go in git), and test_config.json
>> >> >>> >>> >> >>> for
>> >> >>> >>> >> >>> the
>> >> >>> >>> >> >>> test
>> >> >>> >>> >> >>> configuration.
>> >> >>> >>> >> >
>> >> >>> >>> >> >
>> >> >>> >>> >> > Should i keep login and server credentials into
>> >> >>> >>> >> > web/regression/test_config.json file and
>> >> >>> >>> >> > put respective node details into config.json file of
>> >> >>> >>> >> > respective
>> >> >>> >>> >> > node's
>> >> >>> >>> >> > tests
>> >> >>> >>> >> > directory?
>> >> >>> >>> >>
>> >> >>> >>> >> Not if you expect users to need to edit them - and if not,
>> >> >>> >>> >> why
>> >> >>> >>> >> are
>> >> >>> >>> >> the
>> >> >>> >>> >> values not just hard-coded?
>> >> >>> >>> >>
>> >> >>> >>> >> > e.g. for database node:
>> >> >>> >>> >> > I'll create config.json file into .../databases/tests/
>> >> >>> >>> >> > directory
>> >> >>> >>> >> > put database add and update credentials into config.json
>> >> >>> >>> >>
>> >> >>> >>> >> The key here is to make it simple for users.
>> >> >>> >>> >>
>> >> >>> >>> >> - To run the default tests, they should be able to copy/edit
>> >> >>> >>> >> a
>> >> >>> >>> >> simple
>> >> >>> >>> >> file, and just add database server details for the server to
>> >> >>> >>> >> run
>> >> >>> >>> >> against.
>> >> >>> >>> >>
>> >> >>> >>> >> - If we have configurable tests (because making them
>> >> >>> >>> >> configurable
>> >> >>> >>> >> adds
>> >> >>> >>> >> genuine value), then we can use an "advanced" config file to
>> >> >>> >>> >> allow
>> >> >>> >>> >> the
>> >> >>> >>> >> user to adjust settings as they want.
>> >> >>> >>> >>
>> >> >>> >>> >> In the simple case, the user should be able to run the tests
>> >> >>> >>> >> successfully within a minute or two from starting.
>> >> >>> >>> >>
>> >> >>> >>> >> In designing the layout for files etc, remember the
>> >> >>> >>> >> following:
>> >> >>> >>> >>
>> >> >>> >>> >> - Users should never edit a file that is in our source
>> >> >>> >>> >> control.
>> >> >>> >>> >> That's
>> >> >>> >>> >> why we have .in files that we expect them to copy.
>> >> >>> >>> >>
>> >> >>> >>> >> - Unless they're an advanced user, they shouldn't need to
>> >> >>> >>> >> copy
>> >> >>> >>> >> the
>> >> >>> >>> >> config file for advanced options. That means that the tests
>> >> >>> >>> >> should
>> >> >>> >>> >> have defaults that match what is in the template advanced
>> >> >>> >>> >> config
>> >> >>> >>> >> file
>> >> >>> >>> >> (or, the tests could read advanced.json.in if advanced.json
>> >> >>> >>> >> doesn't
>> >> >>> >>> >> exist, though that does seem a little icky). Of course,
>> >> >>> >>> >> those
>> >> >>> >>> >> are
>> >> >>> >>> >> example filenames, not necessarily what you may choose.
>> >> >>> >>> >>
>> >> >>> >>> >> --
>> >> >>> >>> >> Dave Page
>> >> >>> >>> >> Blog: http://pgsnake.blogspot.com
>> >> >>> >>> >> Twitter: @pgsnake
>> >> >>> >>> >>
>> >> >>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >> >>> >>> >> The Enterprise PostgreSQL Company
>> >> >>> >>> >
>> >> >>> >>> >
>> >> >>> >>> >
>> >> >>> >>> >
>> >> >>> >>> > --
>> >> >>> >>> > Best,
>> >> >>> >>> > Priyanka
>> >> >>> >>> >
>> >> >>> >>> > EnterpriseDB Corporation
>> >> >>> >>> > The Enterprise PostgreSQL Company
>> >> >>> >>>
>> >> >>> >>>
>> >> >>> >>>
>> >> >>> >>> --
>> >> >>> >>> Dave Page
>> >> >>> >>> Blog: http://pgsnake.blogspot.com
>> >> >>> >>> Twitter: @pgsnake
>> >> >>> >>>
>> >> >>> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >> >>> >>> The Enterprise PostgreSQL Company
>> >> >>> >>>
>> >> >>> >>>
>> >> >>> >>> --
>> >> >>> >>> Sent via pgadmin-hackers mailing list
>> >> >>> >>> ([email protected])
>> >> >>> >>> To make changes to your subscription:
>> >> >>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
>> >> >>> >>
>> >> >>> >>
>> >> >>> >>
>> >> >>> >>
>> >> >>> >> --
>> >> >>> >> Best,
>> >> >>> >> Priyanka
>> >> >>> >>
>> >> >>> >> EnterpriseDB Corporation
>> >> >>> >> The Enterprise PostgreSQL Company
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> >
>> >> >>> > --
>> >> >>> > Best,
>> >> >>> > Priyanka
>> >> >>> >
>> >> >>> > EnterpriseDB Corporation
>> >> >>> > The Enterprise PostgreSQL Company
>> >> >>>
>> >> >>>
>> >> >>>
>> >> >>> --
>> >> >>> Dave Page
>> >> >>> Blog: http://pgsnake.blogspot.com
>> >> >>> Twitter: @pgsnake
>> >> >>>
>> >> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >> >>> The Enterprise PostgreSQL Company
>> >> >>
>> >> >>
>> >> >>
>> >> >>
>> >> >> --
>> >> >> Best,
>> >> >> Priyanka
>> >> >>
>> >> >> EnterpriseDB Corporation
>> >> >> The Enterprise PostgreSQL Company
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Best,
>> >> > Priyanka
>> >> >
>> >> > EnterpriseDB Corporation
>> >> > The Enterprise PostgreSQL Company
>> >>
>> >>
>> >>
>> >> --
>> >> Dave Page
>> >> Blog: http://pgsnake.blogspot.com
>> >> Twitter: @pgsnake
>> >>
>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >> The Enterprise PostgreSQL Company
>> >
>> >
>> >
>> >
>> > --
>> > Best,
>> > Priyanka
>> >
>> > EnterpriseDB Corporation
>> > The Enterprise PostgreSQL Company
>>
>>
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company



-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers



^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 12:25                                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 13:05                                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-07-11 13:45                                         ` Priyanka Shendge <[email protected]>
  2016-07-12 04:14                                           ` Re: pgAdmin IV API test cases patch Khushboo Vashi <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-07-11 13:45 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>; Khushboo Vashi <[email protected]>

On 11 July 2016 at 18:35, Dave Page <[email protected]> wrote:

> On Mon, Jul 11, 2016 at 1:25 PM, Priyanka Shendge
> <[email protected]> wrote:
> > Sorry, by mistake i copied incomplete query.  There is an OID present for
> > added database.
> >
> > SELECT
> >     db.oid as did, db.datname, db.datallowconn,
> >     pg_encoding_to_char(db.encoding) AS serverencoding,
> >     has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
> > FROM
> >     pg_database db
> > WHERE db.oid = 158579
>
> There's nothing wrong with that query. Can you work with Khushboo to
> see if she can reproduce or help figure it out please?
>

I had work with Khushboo, she also tried to reproduce the issue at her it's
working fine for her.
Khushboo also tried to troubleshoot/trace the issue but not able to figure
out where exactly its failing;
as issue was not reproducible.

@Khushboo:
 Please add if i am missing anything.

>
> Thanks.
>
> > On 11 July 2016 at 17:18, Dave Page <[email protected]> wrote:
> >>
> >> Hi,
> >>
> >> No, sorry I don't have an extra system you can test on.
> >>
> >> It's pretty clear that query would fail - it's missing a database OID
> >> after the =
> >>
> >> On Fri, Jul 8, 2016 at 10:38 AM, Priyanka Shendge
> >> <[email protected]> wrote:
> >> > Hi Dave,
> >> >
> >> > I have tried to reproduce the issue by running the test-suite on
> >> > different
> >> > machines (64 and 32 bit) and
> >> > users on PG9.4/9.5 (Provided different "test_db_username" in
> >> > test_config.json). It is working fine at my end.
> >> >
> >> > The log file (output.log) sent by you shows following query is failing
> >> > at
> >> > your end:
> >> >
> >> > SELECT
> >> >     db.oid as did, db.datname, db.datallowconn,
> >> >     pg_encoding_to_char(db.encoding) AS serverencoding,
> >> >     has_database_privilege(db.oid, 'CREATE') as cancreate,
> datlastsysoid
> >> > FROM
> >> >     pg_database db
> >> > WHERE db.oid =
> >> >
> >> > Let me know if you have an extra system where I can reproduce the
> issue.
> >> >
> >> >
> >> > On 5 July 2016 at 15:40, Dave Page <[email protected]> wrote:
> >> >>
> >> >> Attached.
> >> >>
> >> >> On Tue, Jul 5, 2016 at 9:00 AM, Priyanka Shendge
> >> >> <[email protected]> wrote:
> >> >> > Hi Dave,
> >> >> >
> >> >> > I tried running the testsuite against PG9.4 and unable to reproduce
> >> >> > the
> >> >> > failures.
> >> >> > I have added debug statements to previous patch. Patch attached.
> >> >> > Could you please re-run the same and send me the logs and output?
> >> >> >
> >> >> > Thank you.
> >> >> >
> >> >> > On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:
> >> >> >>
> >> >> >> Hi
> >> >> >>
> >> >> >> The test data was the default, and I ran against PG 9.4. All other
> >> >> >> logs
> >> >> >> were attached to my previous email.
> >> >> >>
> >> >> >> --
> >> >> >> Dave Page
> >> >> >> Blog: http://pgsnake.blogspot.com
> >> >> >> Twitter: @pgsnake
> >> >> >>
> >> >> >> EnterpriseDB UK:http://www.enterprisedb.com
> >> >> >> The Enterprise PostgreSQL Company
> >> >> >>
> >> >> >> On 4 Jul 2016, at 12:16, Priyanka Shendge
> >> >> >> <[email protected]> wrote:
> >> >> >>
> >> >> >> Hi Dave,
> >> >> >>
> >> >> >> I am unable to reproduce issue on my side; tried on Python 2.7 and
> >> >> >> Python
> >> >> >> 3.4.
> >> >> >> Could you please provide me DEBUG logs and test data using for
> >> >> >> database
> >> >> >> node?
> >> >> >>
> >> >> >> Thank you.
> >> >> >>
> >> >> >> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
> >> >> >>>
> >> >> >>> Hi,
> >> >> >>>
> >> >> >>> That's better. I tweaked a few things and fixed a bug related to
> >> >> >>> recent changes to the schema version config. Patch attached.
> >> >> >>>
> >> >> >>> However, there are still issues:
> >> >> >>>
> >> >> >>> 1) The testsuite doesn't run to completion. See the attached
> >> >> >>> stdout.txt and logger.txt files.
> >> >> >>> 2) stdout should only display the test summary - what tests are
> >> >> >>> currently running (and pass/fail), and a summary at the end -
> even
> >> >> >>> if
> >> >> >>> there's a crash like I saw.
> >> >> >>> 3) The output log file should contain the full output, including
> >> >> >>> what's sent to stdout.
> >> >> >>> 4) The output advises the user to check
> >> >> >>> ".../pgadmin4/web/regression".
> >> >> >>> This should be in the summary at the end, and should be corrected
> >> >> >>> to
> >> >> >>> show the correct (full) path.
> >> >> >>>
> >> >> >>> Thanks.
> >> >> >>>
> >> >> >>>
> >> >> >>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
> >> >> >>> <[email protected]> wrote:
> >> >> >>> > Hi Dave,
> >> >> >>> >
> >> >> >>> > As per discussion over mail i have created separate config
> files
> >> >> >>> > for
> >> >> >>> > credentials and test data.
> >> >> >>> >
> >> >> >>> > PFA patch for same. Kindly, review and let me know for
> >> >> >>> > modifications.
> >> >> >>> >
> >> >> >>> > On 27 June 2016 at 15:10, Priyanka Shendge
> >> >> >>> > <[email protected]> wrote:
> >> >> >>> >>
> >> >> >>> >>
> >> >> >>> >>
> >> >> >>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]>
> wrote:
> >> >> >>> >>>
> >> >> >>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
> >> >> >>> >>> <[email protected]> wrote:
> >> >> >>> >>> >
> >> >> >>> >>> >
> >> >> >>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]>
> >> >> >>> >>> > wrote:
> >> >> >>> >>> >>
> >> >> >>> >>> >> Hi
> >> >> >>> >>> >>
> >> >> >>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
> >> >> >>> >>> >> <[email protected]> wrote:
> >> >> >>> >>> >> >
> >> >> >>> >>> >> >
> >> >> >>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
> >> >> >>> >>> >> > <[email protected]> wrote:
> >> >> >>> >>> >> >>
> >> >> >>> >>> >> >> Thanks a lot Dave.
> >> >> >>> >>> >> >>
> >> >> >>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <[email protected]
> >
> >> >> >>> >>> >> >> wrote:
> >> >> >>> >>> >> >>>
> >> >> >>> >>> >> >>> Hi
> >> >> >>> >>> >> >>>
> >> >> >>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
> >> >> >>> >>> >> >>> <[email protected]> wrote:
> >> >> >>> >>> >> >>> > Hi Dave,
> >> >> >>> >>> >> >>> >
> >> >> >>> >>> >> >>> > PFA updated patch. I have made changes suggested by
> >> >> >>> >>> >> >>> > you.
> >> >> >>> >>> >> >>> >
> >> >> >>> >>> >> >>> > Kindly, review and let me know for more changes.
> >> >> >>> >>> >> >>>
> >> >> >>> >>> >> >>> OK, I got a bit further this time, but not there yet.
> >> >> >>> >>> >> >>>
> >> >> >>> >>> >> >>> 1) The patch overwrote my test_config.json file. That
> >> >> >>> >>> >> >>> should
> >> >> >>> >>> >> >>> never
> >> >> >>> >>> >> >>> happen (that file shouldn't be in the source tree).
> >> >> >>> >>> >> >>> test_config.json.in should be the file that's
> included
> >> >> >>> >>> >> >>> in
> >> >> >>> >>> >> >>> the
> >> >> >>> >>> >> >>> patch.
> >> >> >>> >>> >> >>
> >> >> >>> >>> >> >>
> >> >> >>> >>> >> >> OK.
> >> >> >>> >>> >> >>>
> >> >> >>> >>> >> >>>
> >> >> >>> >>> >> >>> 2) The updated test_config.json file is huge.
> >> >> >>> >>> >> >
> >> >> >>> >>> >> >
> >> >> >>> >>> >> > Current configuration file
> web/regression/test_config.json
> >> >> >>> >>> >> > contains
> >> >> >>> >>> >> > test
> >> >> >>> >>> >> > data(credentials) for each tree node;
> >> >> >>> >>> >> > which is used while adding and updating the respective
> >> >> >>> >>> >> > node.
> >> >> >>> >>> >>
> >> >> >>> >>> >> Why would we need that?
> >> >> >>> >>> >
> >> >> >>> >>> >
> >> >> >>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py)
> uses
> >> >> >>> >>> > respective
> >> >> >>> >>> > credentials test data  from
> >> >> >>> >>> > test_config.json while execution.
> >> >> >>> >>>
> >> >> >>> >>> That doesn't answer my question - why do we need separate
> >> >> >>> >>> credentials
> >> >> >>> >>> for each node?
> >> >> >>> >>
> >> >> >>> >>
> >> >> >>> >> Sorry for typo, its test data not credentials.
> >> >> >>> >>
> >> >> >>> >>>
> >> >> >>> >>>
> >> >> >>> >>> >> We should have just one set of credentials for
> >> >> >>> >>> >> everything.
> >> >> >>> >>> >
> >> >> >>> >>> >
> >> >> >>> >>> > Let me know if my understanding is clear:
> >> >> >>> >>> >
> >> >> >>> >>> > Should i keep basic credentials of each node (database,
> >> >> >>> >>> > schema)
> >> >> >>> >>> > into
> >> >> >>> >>> > test_config.json
> >> >> >>> >>> > instead  taking care of each field?
> >> >> >>> >>>
> >> >> >>> >>> You should have one set of credentials that's used for the
> >> >> >>> >>> entire
> >> >> >>> >>> test
> >> >> >>> >>> run.
> >> >> >>> >>
> >> >> >>> >>
> >> >> >>> >> Sure.  I'll separate the credentials and test data into 2
> >> >> >>> >> different
> >> >> >>> >> files.
> >> >> >>> >> So, a normal user can run the tests into one go after some
> minor
> >> >> >>> >> credentials changes.
> >> >> >>> >> And an advanced user can have an option to change the test
> data
> >> >> >>> >> if
> >> >> >>> >> he
> >> >> >>> >> wants.
> >> >> >>> >>>
> >> >> >>> >>>
> >> >> >>> >>> >> >>> I should only need to
> >> >> >>> >>> >> >>> define one or more connections, then be able to run
> the
> >> >> >>> >>> >> >>> tests.
> >> >> >>> >>> >> >>> If
> >> >> >>> >>> >> >>> you
> >> >> >>> >>> >> >>> need to keep configuration info for "advanced users",
> >> >> >>> >>> >> >>> let's
> >> >> >>> >>> >> >>> put it
> >> >> >>> >>> >> >>> in
> >> >> >>> >>> >> >>> a different file to avoid confusing/scaring everyone
> >> >> >>> >>> >> >>> else.
> >> >> >>> >>> >> >>> Maybe
> >> >> >>> >>> >> >>> split
> >> >> >>> >>> >> >>> it into config.json for the stuff the user needs to
> edit
> >> >> >>> >>> >> >>> (config.json.in would go in git), and
> test_config.json
> >> >> >>> >>> >> >>> for
> >> >> >>> >>> >> >>> the
> >> >> >>> >>> >> >>> test
> >> >> >>> >>> >> >>> configuration.
> >> >> >>> >>> >> >
> >> >> >>> >>> >> >
> >> >> >>> >>> >> > Should i keep login and server credentials into
> >> >> >>> >>> >> > web/regression/test_config.json file and
> >> >> >>> >>> >> > put respective node details into config.json file of
> >> >> >>> >>> >> > respective
> >> >> >>> >>> >> > node's
> >> >> >>> >>> >> > tests
> >> >> >>> >>> >> > directory?
> >> >> >>> >>> >>
> >> >> >>> >>> >> Not if you expect users to need to edit them - and if not,
> >> >> >>> >>> >> why
> >> >> >>> >>> >> are
> >> >> >>> >>> >> the
> >> >> >>> >>> >> values not just hard-coded?
> >> >> >>> >>> >>
> >> >> >>> >>> >> > e.g. for database node:
> >> >> >>> >>> >> > I'll create config.json file into .../databases/tests/
> >> >> >>> >>> >> > directory
> >> >> >>> >>> >> > put database add and update credentials into config.json
> >> >> >>> >>> >>
> >> >> >>> >>> >> The key here is to make it simple for users.
> >> >> >>> >>> >>
> >> >> >>> >>> >> - To run the default tests, they should be able to
> copy/edit
> >> >> >>> >>> >> a
> >> >> >>> >>> >> simple
> >> >> >>> >>> >> file, and just add database server details for the server
> to
> >> >> >>> >>> >> run
> >> >> >>> >>> >> against.
> >> >> >>> >>> >>
> >> >> >>> >>> >> - If we have configurable tests (because making them
> >> >> >>> >>> >> configurable
> >> >> >>> >>> >> adds
> >> >> >>> >>> >> genuine value), then we can use an "advanced" config file
> to
> >> >> >>> >>> >> allow
> >> >> >>> >>> >> the
> >> >> >>> >>> >> user to adjust settings as they want.
> >> >> >>> >>> >>
> >> >> >>> >>> >> In the simple case, the user should be able to run the
> tests
> >> >> >>> >>> >> successfully within a minute or two from starting.
> >> >> >>> >>> >>
> >> >> >>> >>> >> In designing the layout for files etc, remember the
> >> >> >>> >>> >> following:
> >> >> >>> >>> >>
> >> >> >>> >>> >> - Users should never edit a file that is in our source
> >> >> >>> >>> >> control.
> >> >> >>> >>> >> That's
> >> >> >>> >>> >> why we have .in files that we expect them to copy.
> >> >> >>> >>> >>
> >> >> >>> >>> >> - Unless they're an advanced user, they shouldn't need to
> >> >> >>> >>> >> copy
> >> >> >>> >>> >> the
> >> >> >>> >>> >> config file for advanced options. That means that the
> tests
> >> >> >>> >>> >> should
> >> >> >>> >>> >> have defaults that match what is in the template advanced
> >> >> >>> >>> >> config
> >> >> >>> >>> >> file
> >> >> >>> >>> >> (or, the tests could read advanced.json.in if
> advanced.json
> >> >> >>> >>> >> doesn't
> >> >> >>> >>> >> exist, though that does seem a little icky). Of course,
> >> >> >>> >>> >> those
> >> >> >>> >>> >> are
> >> >> >>> >>> >> example filenames, not necessarily what you may choose.
> >> >> >>> >>> >>
> >> >> >>> >>> >> --
> >> >> >>> >>> >> Dave Page
> >> >> >>> >>> >> Blog: http://pgsnake.blogspot.com
> >> >> >>> >>> >> Twitter: @pgsnake
> >> >> >>> >>> >>
> >> >> >>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
> >> >> >>> >>> >> The Enterprise PostgreSQL Company
> >> >> >>> >>> >
> >> >> >>> >>> >
> >> >> >>> >>> >
> >> >> >>> >>> >
> >> >> >>> >>> > --
> >> >> >>> >>> > Best,
> >> >> >>> >>> > Priyanka
> >> >> >>> >>> >
> >> >> >>> >>> > EnterpriseDB Corporation
> >> >> >>> >>> > The Enterprise PostgreSQL Company
> >> >> >>> >>>
> >> >> >>> >>>
> >> >> >>> >>>
> >> >> >>> >>> --
> >> >> >>> >>> Dave Page
> >> >> >>> >>> Blog: http://pgsnake.blogspot.com
> >> >> >>> >>> Twitter: @pgsnake
> >> >> >>> >>>
> >> >> >>> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >> >> >>> >>> The Enterprise PostgreSQL Company
> >> >> >>> >>>
> >> >> >>> >>>
> >> >> >>> >>> --
> >> >> >>> >>> Sent via pgadmin-hackers mailing list
> >> >> >>> >>> ([email protected])
> >> >> >>> >>> To make changes to your subscription:
> >> >> >>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
> >> >> >>> >>
> >> >> >>> >>
> >> >> >>> >>
> >> >> >>> >>
> >> >> >>> >> --
> >> >> >>> >> Best,
> >> >> >>> >> Priyanka
> >> >> >>> >>
> >> >> >>> >> EnterpriseDB Corporation
> >> >> >>> >> The Enterprise PostgreSQL Company
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> >
> >> >> >>> > --
> >> >> >>> > Best,
> >> >> >>> > Priyanka
> >> >> >>> >
> >> >> >>> > EnterpriseDB Corporation
> >> >> >>> > The Enterprise PostgreSQL Company
> >> >> >>>
> >> >> >>>
> >> >> >>>
> >> >> >>> --
> >> >> >>> Dave Page
> >> >> >>> Blog: http://pgsnake.blogspot.com
> >> >> >>> Twitter: @pgsnake
> >> >> >>>
> >> >> >>> EnterpriseDB UK: http://www.enterprisedb.com
> >> >> >>> The Enterprise PostgreSQL Company
> >> >> >>
> >> >> >>
> >> >> >>
> >> >> >>
> >> >> >> --
> >> >> >> Best,
> >> >> >> Priyanka
> >> >> >>
> >> >> >> EnterpriseDB Corporation
> >> >> >> The Enterprise PostgreSQL Company
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >> > --
> >> >> > Best,
> >> >> > Priyanka
> >> >> >
> >> >> > EnterpriseDB Corporation
> >> >> > The Enterprise PostgreSQL Company
> >> >>
> >> >>
> >> >>
> >> >> --
> >> >> Dave Page
> >> >> Blog: http://pgsnake.blogspot.com
> >> >> Twitter: @pgsnake
> >> >>
> >> >> EnterpriseDB UK: http://www.enterprisedb.com
> >> >> The Enterprise PostgreSQL Company
> >> >
> >> >
> >> >
> >> >
> >> > --
> >> > Best,
> >> > Priyanka
> >> >
> >> > EnterpriseDB Corporation
> >> > The Enterprise PostgreSQL Company
> >>
> >>
> >>
> >> --
> >> Dave Page
> >> Blog: http://pgsnake.blogspot.com
> >> Twitter: @pgsnake
> >>
> >> EnterpriseDB UK: http://www.enterprisedb.com
> >> The Enterprise PostgreSQL Company
> >
> >
> >
> >
> > --
> > Best,
> > Priyanka
> >
> > EnterpriseDB Corporation
> > The Enterprise PostgreSQL Company
>
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 12:25                                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 13:05                                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 13:45                                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-07-12 04:14                                           ` Khushboo Vashi <[email protected]>
  2016-07-12 12:04                                             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Khushboo Vashi @ 2016-07-12 04:14 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: Dave Page <[email protected]>; pgadmin-hackers; Kanchan Mohitey <[email protected]>

On Mon, Jul 11, 2016 at 7:15 PM, Priyanka Shendge <
[email protected]> wrote:

>
>
> On 11 July 2016 at 18:35, Dave Page <[email protected]> wrote:
>
>> On Mon, Jul 11, 2016 at 1:25 PM, Priyanka Shendge
>> <[email protected]> wrote:
>> > Sorry, by mistake i copied incomplete query.  There is an OID present
>> for
>> > added database.
>> >
>> > SELECT
>> >     db.oid as did, db.datname, db.datallowconn,
>> >     pg_encoding_to_char(db.encoding) AS serverencoding,
>> >     has_database_privilege(db.oid, 'CREATE') as cancreate, datlastsysoid
>> > FROM
>> >     pg_database db
>> > WHERE db.oid = 158579
>>
>> There's nothing wrong with that query. Can you work with Khushboo to
>> see if she can reproduce or help figure it out please?
>>
>
> I had work with Khushboo, she also tried to reproduce the issue at her
> it's working fine for her.
> Khushboo also tried to troubleshoot/trace the issue but not able to figure
> out where exactly its failing;
> as issue was not reproducible.
>
> @Khushboo:
>  Please add if i am missing anything.
>
>>
>>

We have tried to reproduce this issue at our end several times with the
different scenarios but every attempt was unsuccessful.

Here the newly created database connection is failing which should not as
the database is created properly as per the log.
The above query (mentioned by Priyanka) executes from the psycopg2 driver
and could fail in 2 scenarios, either the database has been dropped before
this particular test-case runs or the database is not created properly
through the 'create database test-case'.  But as per the log, the 'delete
database test-case' runs after this test-case and the database is created
properly.

Can any privilege issue prevent the database connection in this scenario?

Thanks,
Khushboo




> Thanks.
>>
>> > On 11 July 2016 at 17:18, Dave Page <[email protected]> wrote:
>> >>
>> >> Hi,
>> >>
>> >> No, sorry I don't have an extra system you can test on.
>> >>
>> >> It's pretty clear that query would fail - it's missing a database OID
>> >> after the =
>> >>
>> >> On Fri, Jul 8, 2016 at 10:38 AM, Priyanka Shendge
>> >> <[email protected]> wrote:
>> >> > Hi Dave,
>> >> >
>> >> > I have tried to reproduce the issue by running the test-suite on
>> >> > different
>> >> > machines (64 and 32 bit) and
>> >> > users on PG9.4/9.5 (Provided different "test_db_username" in
>> >> > test_config.json). It is working fine at my end.
>> >> >
>> >> > The log file (output.log) sent by you shows following query is
>> failing
>> >> > at
>> >> > your end:
>> >> >
>> >> > SELECT
>> >> >     db.oid as did, db.datname, db.datallowconn,
>> >> >     pg_encoding_to_char(db.encoding) AS serverencoding,
>> >> >     has_database_privilege(db.oid, 'CREATE') as cancreate,
>> datlastsysoid
>> >> > FROM
>> >> >     pg_database db
>> >> > WHERE db.oid =
>> >> >
>> >> > Let me know if you have an extra system where I can reproduce the
>> issue.
>> >> >
>> >> >
>> >> > On 5 July 2016 at 15:40, Dave Page <[email protected]> wrote:
>> >> >>
>> >> >> Attached.
>> >> >>
>> >> >> On Tue, Jul 5, 2016 at 9:00 AM, Priyanka Shendge
>> >> >> <[email protected]> wrote:
>> >> >> > Hi Dave,
>> >> >> >
>> >> >> > I tried running the testsuite against PG9.4 and unable to
>> reproduce
>> >> >> > the
>> >> >> > failures.
>> >> >> > I have added debug statements to previous patch. Patch attached.
>> >> >> > Could you please re-run the same and send me the logs and output?
>> >> >> >
>> >> >> > Thank you.
>> >> >> >
>> >> >> > On 4 July 2016 at 17:30, Dave Page <[email protected]> wrote:
>> >> >> >>
>> >> >> >> Hi
>> >> >> >>
>> >> >> >> The test data was the default, and I ran against PG 9.4. All
>> other
>> >> >> >> logs
>> >> >> >> were attached to my previous email.
>> >> >> >>
>> >> >> >> --
>> >> >> >> Dave Page
>> >> >> >> Blog: http://pgsnake.blogspot.com
>> >> >> >> Twitter: @pgsnake
>> >> >> >>
>> >> >> >> EnterpriseDB UK:http://www.enterprisedb.com
>> >> >> >> The Enterprise PostgreSQL Company
>> >> >> >>
>> >> >> >> On 4 Jul 2016, at 12:16, Priyanka Shendge
>> >> >> >> <[email protected]> wrote:
>> >> >> >>
>> >> >> >> Hi Dave,
>> >> >> >>
>> >> >> >> I am unable to reproduce issue on my side; tried on Python 2.7
>> and
>> >> >> >> Python
>> >> >> >> 3.4.
>> >> >> >> Could you please provide me DEBUG logs and test data using for
>> >> >> >> database
>> >> >> >> node?
>> >> >> >>
>> >> >> >> Thank you.
>> >> >> >>
>> >> >> >> On 30 June 2016 at 00:51, Dave Page <[email protected]> wrote:
>> >> >> >>>
>> >> >> >>> Hi,
>> >> >> >>>
>> >> >> >>> That's better. I tweaked a few things and fixed a bug related to
>> >> >> >>> recent changes to the schema version config. Patch attached.
>> >> >> >>>
>> >> >> >>> However, there are still issues:
>> >> >> >>>
>> >> >> >>> 1) The testsuite doesn't run to completion. See the attached
>> >> >> >>> stdout.txt and logger.txt files.
>> >> >> >>> 2) stdout should only display the test summary - what tests are
>> >> >> >>> currently running (and pass/fail), and a summary at the end -
>> even
>> >> >> >>> if
>> >> >> >>> there's a crash like I saw.
>> >> >> >>> 3) The output log file should contain the full output, including
>> >> >> >>> what's sent to stdout.
>> >> >> >>> 4) The output advises the user to check
>> >> >> >>> ".../pgadmin4/web/regression".
>> >> >> >>> This should be in the summary at the end, and should be
>> corrected
>> >> >> >>> to
>> >> >> >>> show the correct (full) path.
>> >> >> >>>
>> >> >> >>> Thanks.
>> >> >> >>>
>> >> >> >>>
>> >> >> >>> On Wed, Jun 29, 2016 at 2:52 PM, Priyanka Shendge
>> >> >> >>> <[email protected]> wrote:
>> >> >> >>> > Hi Dave,
>> >> >> >>> >
>> >> >> >>> > As per discussion over mail i have created separate config
>> files
>> >> >> >>> > for
>> >> >> >>> > credentials and test data.
>> >> >> >>> >
>> >> >> >>> > PFA patch for same. Kindly, review and let me know for
>> >> >> >>> > modifications.
>> >> >> >>> >
>> >> >> >>> > On 27 June 2016 at 15:10, Priyanka Shendge
>> >> >> >>> > <[email protected]> wrote:
>> >> >> >>> >>
>> >> >> >>> >>
>> >> >> >>> >>
>> >> >> >>> >> On 27 June 2016 at 13:24, Dave Page <[email protected]>
>> wrote:
>> >> >> >>> >>>
>> >> >> >>> >>> On Sun, Jun 26, 2016 at 12:05 PM, Priyanka Shendge
>> >> >> >>> >>> <[email protected]> wrote:
>> >> >> >>> >>> >
>> >> >> >>> >>> >
>> >> >> >>> >>> > On 24 June 2016 at 16:17, Dave Page <[email protected]>
>> >> >> >>> >>> > wrote:
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> Hi
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> On Thu, Jun 23, 2016 at 2:41 PM, Priyanka Shendge
>> >> >> >>> >>> >> <[email protected]> wrote:
>> >> >> >>> >>> >> >
>> >> >> >>> >>> >> >
>> >> >> >>> >>> >> > On 15 June 2016 at 15:05, Priyanka Shendge
>> >> >> >>> >>> >> > <[email protected]> wrote:
>> >> >> >>> >>> >> >>
>> >> >> >>> >>> >> >> Thanks a lot Dave.
>> >> >> >>> >>> >> >>
>> >> >> >>> >>> >> >> On 15 June 2016 at 14:09, Dave Page <
>> [email protected]>
>> >> >> >>> >>> >> >> wrote:
>> >> >> >>> >>> >> >>>
>> >> >> >>> >>> >> >>> Hi
>> >> >> >>> >>> >> >>>
>> >> >> >>> >>> >> >>> On Thu, Jun 9, 2016 at 1:37 PM, Priyanka Shendge
>> >> >> >>> >>> >> >>> <[email protected]> wrote:
>> >> >> >>> >>> >> >>> > Hi Dave,
>> >> >> >>> >>> >> >>> >
>> >> >> >>> >>> >> >>> > PFA updated patch. I have made changes suggested by
>> >> >> >>> >>> >> >>> > you.
>> >> >> >>> >>> >> >>> >
>> >> >> >>> >>> >> >>> > Kindly, review and let me know for more changes.
>> >> >> >>> >>> >> >>>
>> >> >> >>> >>> >> >>> OK, I got a bit further this time, but not there yet.
>> >> >> >>> >>> >> >>>
>> >> >> >>> >>> >> >>> 1) The patch overwrote my test_config.json file. That
>> >> >> >>> >>> >> >>> should
>> >> >> >>> >>> >> >>> never
>> >> >> >>> >>> >> >>> happen (that file shouldn't be in the source tree).
>> >> >> >>> >>> >> >>> test_config.json.in should be the file that's
>> included
>> >> >> >>> >>> >> >>> in
>> >> >> >>> >>> >> >>> the
>> >> >> >>> >>> >> >>> patch.
>> >> >> >>> >>> >> >>
>> >> >> >>> >>> >> >>
>> >> >> >>> >>> >> >> OK.
>> >> >> >>> >>> >> >>>
>> >> >> >>> >>> >> >>>
>> >> >> >>> >>> >> >>> 2) The updated test_config.json file is huge.
>> >> >> >>> >>> >> >
>> >> >> >>> >>> >> >
>> >> >> >>> >>> >> > Current configuration file
>> web/regression/test_config.json
>> >> >> >>> >>> >> > contains
>> >> >> >>> >>> >> > test
>> >> >> >>> >>> >> > data(credentials) for each tree node;
>> >> >> >>> >>> >> > which is used while adding and updating the respective
>> >> >> >>> >>> >> > node.
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> Why would we need that?
>> >> >> >>> >>> >
>> >> >> >>> >>> >
>> >> >> >>> >>> > Each node file (e.g. test_db_add.py and test_db_put.py)
>> uses
>> >> >> >>> >>> > respective
>> >> >> >>> >>> > credentials test data  from
>> >> >> >>> >>> > test_config.json while execution.
>> >> >> >>> >>>
>> >> >> >>> >>> That doesn't answer my question - why do we need separate
>> >> >> >>> >>> credentials
>> >> >> >>> >>> for each node?
>> >> >> >>> >>
>> >> >> >>> >>
>> >> >> >>> >> Sorry for typo, its test data not credentials.
>> >> >> >>> >>
>> >> >> >>> >>>
>> >> >> >>> >>>
>> >> >> >>> >>> >> We should have just one set of credentials for
>> >> >> >>> >>> >> everything.
>> >> >> >>> >>> >
>> >> >> >>> >>> >
>> >> >> >>> >>> > Let me know if my understanding is clear:
>> >> >> >>> >>> >
>> >> >> >>> >>> > Should i keep basic credentials of each node (database,
>> >> >> >>> >>> > schema)
>> >> >> >>> >>> > into
>> >> >> >>> >>> > test_config.json
>> >> >> >>> >>> > instead  taking care of each field?
>> >> >> >>> >>>
>> >> >> >>> >>> You should have one set of credentials that's used for the
>> >> >> >>> >>> entire
>> >> >> >>> >>> test
>> >> >> >>> >>> run.
>> >> >> >>> >>
>> >> >> >>> >>
>> >> >> >>> >> Sure.  I'll separate the credentials and test data into 2
>> >> >> >>> >> different
>> >> >> >>> >> files.
>> >> >> >>> >> So, a normal user can run the tests into one go after some
>> minor
>> >> >> >>> >> credentials changes.
>> >> >> >>> >> And an advanced user can have an option to change the test
>> data
>> >> >> >>> >> if
>> >> >> >>> >> he
>> >> >> >>> >> wants.
>> >> >> >>> >>>
>> >> >> >>> >>>
>> >> >> >>> >>> >> >>> I should only need to
>> >> >> >>> >>> >> >>> define one or more connections, then be able to run
>> the
>> >> >> >>> >>> >> >>> tests.
>> >> >> >>> >>> >> >>> If
>> >> >> >>> >>> >> >>> you
>> >> >> >>> >>> >> >>> need to keep configuration info for "advanced users",
>> >> >> >>> >>> >> >>> let's
>> >> >> >>> >>> >> >>> put it
>> >> >> >>> >>> >> >>> in
>> >> >> >>> >>> >> >>> a different file to avoid confusing/scaring everyone
>> >> >> >>> >>> >> >>> else.
>> >> >> >>> >>> >> >>> Maybe
>> >> >> >>> >>> >> >>> split
>> >> >> >>> >>> >> >>> it into config.json for the stuff the user needs to
>> edit
>> >> >> >>> >>> >> >>> (config.json.in would go in git), and
>> test_config.json
>> >> >> >>> >>> >> >>> for
>> >> >> >>> >>> >> >>> the
>> >> >> >>> >>> >> >>> test
>> >> >> >>> >>> >> >>> configuration.
>> >> >> >>> >>> >> >
>> >> >> >>> >>> >> >
>> >> >> >>> >>> >> > Should i keep login and server credentials into
>> >> >> >>> >>> >> > web/regression/test_config.json file and
>> >> >> >>> >>> >> > put respective node details into config.json file of
>> >> >> >>> >>> >> > respective
>> >> >> >>> >>> >> > node's
>> >> >> >>> >>> >> > tests
>> >> >> >>> >>> >> > directory?
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> Not if you expect users to need to edit them - and if
>> not,
>> >> >> >>> >>> >> why
>> >> >> >>> >>> >> are
>> >> >> >>> >>> >> the
>> >> >> >>> >>> >> values not just hard-coded?
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> > e.g. for database node:
>> >> >> >>> >>> >> > I'll create config.json file into .../databases/tests/
>> >> >> >>> >>> >> > directory
>> >> >> >>> >>> >> > put database add and update credentials into
>> config.json
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> The key here is to make it simple for users.
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> - To run the default tests, they should be able to
>> copy/edit
>> >> >> >>> >>> >> a
>> >> >> >>> >>> >> simple
>> >> >> >>> >>> >> file, and just add database server details for the
>> server to
>> >> >> >>> >>> >> run
>> >> >> >>> >>> >> against.
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> - If we have configurable tests (because making them
>> >> >> >>> >>> >> configurable
>> >> >> >>> >>> >> adds
>> >> >> >>> >>> >> genuine value), then we can use an "advanced" config
>> file to
>> >> >> >>> >>> >> allow
>> >> >> >>> >>> >> the
>> >> >> >>> >>> >> user to adjust settings as they want.
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> In the simple case, the user should be able to run the
>> tests
>> >> >> >>> >>> >> successfully within a minute or two from starting.
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> In designing the layout for files etc, remember the
>> >> >> >>> >>> >> following:
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> - Users should never edit a file that is in our source
>> >> >> >>> >>> >> control.
>> >> >> >>> >>> >> That's
>> >> >> >>> >>> >> why we have .in files that we expect them to copy.
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> - Unless they're an advanced user, they shouldn't need to
>> >> >> >>> >>> >> copy
>> >> >> >>> >>> >> the
>> >> >> >>> >>> >> config file for advanced options. That means that the
>> tests
>> >> >> >>> >>> >> should
>> >> >> >>> >>> >> have defaults that match what is in the template advanced
>> >> >> >>> >>> >> config
>> >> >> >>> >>> >> file
>> >> >> >>> >>> >> (or, the tests could read advanced.json.in if
>> advanced.json
>> >> >> >>> >>> >> doesn't
>> >> >> >>> >>> >> exist, though that does seem a little icky). Of course,
>> >> >> >>> >>> >> those
>> >> >> >>> >>> >> are
>> >> >> >>> >>> >> example filenames, not necessarily what you may choose.
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> --
>> >> >> >>> >>> >> Dave Page
>> >> >> >>> >>> >> Blog: http://pgsnake.blogspot.com
>> >> >> >>> >>> >> Twitter: @pgsnake
>> >> >> >>> >>> >>
>> >> >> >>> >>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >> >> >>> >>> >> The Enterprise PostgreSQL Company
>> >> >> >>> >>> >
>> >> >> >>> >>> >
>> >> >> >>> >>> >
>> >> >> >>> >>> >
>> >> >> >>> >>> > --
>> >> >> >>> >>> > Best,
>> >> >> >>> >>> > Priyanka
>> >> >> >>> >>> >
>> >> >> >>> >>> > EnterpriseDB Corporation
>> >> >> >>> >>> > The Enterprise PostgreSQL Company
>> >> >> >>> >>>
>> >> >> >>> >>>
>> >> >> >>> >>>
>> >> >> >>> >>> --
>> >> >> >>> >>> Dave Page
>> >> >> >>> >>> Blog: http://pgsnake.blogspot.com
>> >> >> >>> >>> Twitter: @pgsnake
>> >> >> >>> >>>
>> >> >> >>> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >> >> >>> >>> The Enterprise PostgreSQL Company
>> >> >> >>> >>>
>> >> >> >>> >>>
>> >> >> >>> >>> --
>> >> >> >>> >>> Sent via pgadmin-hackers mailing list
>> >> >> >>> >>> ([email protected])
>> >> >> >>> >>> To make changes to your subscription:
>> >> >> >>> >>> http://www.postgresql.org/mailpref/pgadmin-hackers
>> >> >> >>> >>
>> >> >> >>> >>
>> >> >> >>> >>
>> >> >> >>> >>
>> >> >> >>> >> --
>> >> >> >>> >> Best,
>> >> >> >>> >> Priyanka
>> >> >> >>> >>
>> >> >> >>> >> EnterpriseDB Corporation
>> >> >> >>> >> The Enterprise PostgreSQL Company
>> >> >> >>> >
>> >> >> >>> >
>> >> >> >>> >
>> >> >> >>> >
>> >> >> >>> > --
>> >> >> >>> > Best,
>> >> >> >>> > Priyanka
>> >> >> >>> >
>> >> >> >>> > EnterpriseDB Corporation
>> >> >> >>> > The Enterprise PostgreSQL Company
>> >> >> >>>
>> >> >> >>>
>> >> >> >>>
>> >> >> >>> --
>> >> >> >>> Dave Page
>> >> >> >>> Blog: http://pgsnake.blogspot.com
>> >> >> >>> Twitter: @pgsnake
>> >> >> >>>
>> >> >> >>> EnterpriseDB UK: http://www.enterprisedb.com
>> >> >> >>> The Enterprise PostgreSQL Company
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >> --
>> >> >> >> Best,
>> >> >> >> Priyanka
>> >> >> >>
>> >> >> >> EnterpriseDB Corporation
>> >> >> >> The Enterprise PostgreSQL Company
>> >> >> >
>> >> >> >
>> >> >> >
>> >> >> >
>> >> >> > --
>> >> >> > Best,
>> >> >> > Priyanka
>> >> >> >
>> >> >> > EnterpriseDB Corporation
>> >> >> > The Enterprise PostgreSQL Company
>> >> >>
>> >> >>
>> >> >>
>> >> >> --
>> >> >> Dave Page
>> >> >> Blog: http://pgsnake.blogspot.com
>> >> >> Twitter: @pgsnake
>> >> >>
>> >> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >> >> The Enterprise PostgreSQL Company
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Best,
>> >> > Priyanka
>> >> >
>> >> > EnterpriseDB Corporation
>> >> > The Enterprise PostgreSQL Company
>> >>
>> >>
>> >>
>> >> --
>> >> Dave Page
>> >> Blog: http://pgsnake.blogspot.com
>> >> Twitter: @pgsnake
>> >>
>> >> EnterpriseDB UK: http://www.enterprisedb.com
>> >> The Enterprise PostgreSQL Company
>> >
>> >
>> >
>> >
>> > --
>> > Best,
>> > Priyanka
>> >
>> > EnterpriseDB Corporation
>> > The Enterprise PostgreSQL Company
>>
>>
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>>
>
>
>
> --
> Best,
> Priyanka
>
> EnterpriseDB Corporation
> The Enterprise PostgreSQL Company
>


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 12:25                                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 13:05                                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 13:45                                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-12 04:14                                           ` Re: pgAdmin IV API test cases patch Khushboo Vashi <[email protected]>
@ 2016-07-12 12:04                                             ` Dave Page <[email protected]>
  2016-07-14 11:50                                               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Dave Page @ 2016-07-12 12:04 UTC (permalink / raw)
  To: Khushboo Vashi <[email protected]>; +Cc: Priyanka Shendge <[email protected]>; pgadmin-hackers; Kanchan Mohitey <[email protected]>

On Tue, Jul 12, 2016 at 5:14 AM, Khushboo Vashi
<[email protected]> wrote:
>
>
> On Mon, Jul 11, 2016 at 7:15 PM, Priyanka Shendge
> <[email protected]> wrote:
>>
>>
>>
>> On 11 July 2016 at 18:35, Dave Page <[email protected]> wrote:
>>>
>>> On Mon, Jul 11, 2016 at 1:25 PM, Priyanka Shendge
>>> <[email protected]> wrote:
>>> > Sorry, by mistake i copied incomplete query.  There is an OID present
>>> > for
>>> > added database.
>>> >
>>> > SELECT
>>> >     db.oid as did, db.datname, db.datallowconn,
>>> >     pg_encoding_to_char(db.encoding) AS serverencoding,
>>> >     has_database_privilege(db.oid, 'CREATE') as cancreate,
>>> > datlastsysoid
>>> > FROM
>>> >     pg_database db
>>> > WHERE db.oid = 158579
>>>
>>> There's nothing wrong with that query. Can you work with Khushboo to
>>> see if she can reproduce or help figure it out please?
>>
>>
>> I had work with Khushboo, she also tried to reproduce the issue at her
>> it's working fine for her.
>> Khushboo also tried to troubleshoot/trace the issue but not able to figure
>> out where exactly its failing;
>> as issue was not reproducible.
>>
>> @Khushboo:
>>  Please add if i am missing anything.
>>>
>>>
>
>
> We have tried to reproduce this issue at our end several times with the
> different scenarios but every attempt was unsuccessful.
>
> Here the newly created database connection is failing which should not as
> the database is created properly as per the log.
> The above query (mentioned by Priyanka) executes from the psycopg2 driver
> and could fail in 2 scenarios, either the database has been dropped before
> this particular test-case runs or the database is not created properly
> through the 'create database test-case'.  But as per the log, the 'delete
> database test-case' runs after this test-case and the database is created
> properly.
>
> Can any privilege issue prevent the database connection in this scenario?

Not on my system, that I can think of.

If there was a connection error like that though, shouldn't we see a
message from libpq at least? If not, that implies that there are error
reporting issues to be fixed.


-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers



^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 12:25                                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 13:05                                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 13:45                                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-12 04:14                                           ` Re: pgAdmin IV API test cases patch Khushboo Vashi <[email protected]>
  2016-07-12 12:04                                             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
@ 2016-07-14 11:50                                               ` Priyanka Shendge <[email protected]>
  2016-07-15 12:43                                                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  0 siblings, 1 reply; 27+ messages in thread

From: Priyanka Shendge @ 2016-07-14 11:50 UTC (permalink / raw)
  To: Dave Page <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>; Khushboo Vashi <[email protected]>

Hi Dave,

I have added more debug statements to older patch. New patch attached.
Also, i removed database deletion test case from current patch so that we
can analyse
if database is added or not.

I have added few more debug statements to database add test case. After
running the testsuite
can you please confirm whether the database is created or not under server
node?

Could you please re-run the attached patch and send me the logs and output?

On 12 July 2016 at 17:34, Dave Page <[email protected]> wrote:

> On Tue, Jul 12, 2016 at 5:14 AM, Khushboo Vashi
> <[email protected]> wrote:
> >
> >
> > On Mon, Jul 11, 2016 at 7:15 PM, Priyanka Shendge
> > <[email protected]> wrote:
> >>
> >>
> >>
> >> On 11 July 2016 at 18:35, Dave Page <[email protected]> wrote:
> >>>
> >>> On Mon, Jul 11, 2016 at 1:25 PM, Priyanka Shendge
> >>> <[email protected]> wrote:
> >>> > Sorry, by mistake i copied incomplete query.  There is an OID present
> >>> > for
> >>> > added database.
> >>> >
> >>> > SELECT
> >>> >     db.oid as did, db.datname, db.datallowconn,
> >>> >     pg_encoding_to_char(db.encoding) AS serverencoding,
> >>> >     has_database_privilege(db.oid, 'CREATE') as cancreate,
> >>> > datlastsysoid
> >>> > FROM
> >>> >     pg_database db
> >>> > WHERE db.oid = 158579
> >>>
> >>> There's nothing wrong with that query. Can you work with Khushboo to
> >>> see if she can reproduce or help figure it out please?
> >>
> >>
> >> I had work with Khushboo, she also tried to reproduce the issue at her
> >> it's working fine for her.
> >> Khushboo also tried to troubleshoot/trace the issue but not able to
> figure
> >> out where exactly its failing;
> >> as issue was not reproducible.
> >>
> >> @Khushboo:
> >>  Please add if i am missing anything.
> >>>
> >>>
> >
> >
> > We have tried to reproduce this issue at our end several times with the
> > different scenarios but every attempt was unsuccessful.
> >
> > Here the newly created database connection is failing which should not as
> > the database is created properly as per the log.
> > The above query (mentioned by Priyanka) executes from the psycopg2 driver
> > and could fail in 2 scenarios, either the database has been dropped
> before
> > this particular test-case runs or the database is not created properly
> > through the 'create database test-case'.  But as per the log, the 'delete
> > database test-case' runs after this test-case and the database is created
> > properly.
> >
> > Can any privilege issue prevent the database connection in this scenario?
>
> Not on my system, that I can think of.
>
> If there was a connection error like that though, shouldn't we see a
> message from libpq at least? If not, that implies that there are error
> reporting issues to be fixed.
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>



-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [application/octet-stream] test_db_connection.patch (37.8K, 3-test_db_connection.patch)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
new file mode 100644
index 0000000..60ed4c7
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/__init__.py
@@ -0,0 +1,16 @@
+# ##########################################################################
+#
+# #pgAdmin 4 - PostgreSQL Tools
+#
+# #Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# #This software is released under the PostgreSQL Licence
+#
+# ##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+
+
+class DatabaseGenerateTestCase(BaseTestGenerator):
+
+    def runTest(self):
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
new file mode 100644
index 0000000..b85be0a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py
@@ -0,0 +1,106 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data, advance_config_data, pickle_path
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+import pickle
+import uuid
+import os
+from regression.test_utils import get_ids
+
+
+class DatabaseAddTestCase(LoginTestCase):
+    """
+    This class will check server group node present on the object browser's
+    tree node by response code.
+    """
+    priority = 7
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will add database under 1st server of tree node. """
+
+        srv_id = get_ids()
+
+        server_id = srv_id["sid"][0]
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.post('browser/server/connect/' + str(srv_grp) +
+                                    '/' + server_id,
+                                    data=dict(
+                                    password=config_data
+                                    ['test_server_credentials'][0]
+                                    ['test_db_password']),
+                                    follow_redirects=True)
+
+        self.assertEquals(response.status_code, 200)
+
+        srv_connect = json.loads(response.data.decode())
+
+        if srv_connect['data']['connected']:
+
+            data = {
+                     "datacl": advance_config_data['test_add_database_data']
+                     ['test_privileges_acl'],
+                     "datconnlimit": advance_config_data
+                     ['test_add_database_data']['test_conn_limit'],
+                     "datowner": advance_config_data
+                     ['test_add_database_data']['test_owner'],
+                     "deffuncacl": advance_config_data
+                     ['test_add_database_data']['test_fun_acl'],
+                     "defseqacl": advance_config_data
+                     ['test_add_database_data']['test_seq_acl'],
+                     "deftblacl": advance_config_data
+                     ['test_add_database_data']['test_tbl_acl'],
+                     "deftypeacl": advance_config_data
+                     ['test_add_database_data']['test_type_acl'],
+                     "encoding": advance_config_data
+                     ['test_add_database_data']['test_encoding'],
+                     "name": str(uuid.uuid4())[1:8],
+                     "privileges": advance_config_data
+                     ['test_add_database_data']['test_privileges'],
+                     "securities": advance_config_data
+                     ['test_add_database_data']['test_securities'],
+                     "variables": advance_config_data
+                     ['test_add_database_data']['test_variables']
+                    }
+
+            db_response = self.tester.post(self.url + str(srv_grp) + "/" +
+                                           server_id + "/",
+                                           data=json.dumps(data),
+                                           content_type='html/json')
+
+            print("\nDatabase Response after Addition.........")
+            print(db_response.data.decode())
+
+            self.assertTrue(db_response.status_code, 200)
+
+            respdata = json.loads(db_response.data.decode())
+
+            db_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+
+                exst_server_id = open(pickle_path, 'rb')
+
+                tol_server_id = pickle.load(exst_server_id)
+                pickle_id_dict = tol_server_id
+
+                pickle_id_dict["did"].append(db_id)
+                print("\nDatabase id adding into pickle:",
+                      pickle_id_dict["did"][0])
+
+                db_output = open(pickle_path, 'wb')
+                pickle.dump(pickle_id_dict, db_output)
+                db_output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
new file mode 100644
index 0000000..79f7877
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py
@@ -0,0 +1,48 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.test_nodes import test_getnodes
+from regression.test_utils import get_ids
+
+
+class DatabasesGetTestCase(LoginTestCase):
+    """
+    This class will fetch added database under server node.
+    """
+    priority = 8
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node URL', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will fetch added database. """
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        print('\n')
+        print("db id in get database from pickle:", db_id)
+
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(server_id) + '/' + str(db_id),
+                                       follow_redirects=True)
+            print('\n')
+            print("database get response", response.data.decode())
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
new file mode 100644
index 0000000..9993390
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py
@@ -0,0 +1,55 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data,  advance_config_data
+from pgadmin.browser.tests.test_login import LoginTestCase
+import json
+from regression.test_utils import get_ids
+from regression.test_nodes import test_getnodes
+
+
+class DatabasesUpdateTestCase(LoginTestCase):
+    """
+    This class will update the database under last added server.
+    """
+    priority = 9
+
+    scenarios = [
+        # Fetching default URL for database node.
+        ('Check Databases Node', dict(url='/browser/database/obj/'))
+    ]
+
+    def runTest(self):
+        """ This function will update the comments field of database."""
+
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
+        db_id = all_id["did"][0]
+        print('\n')
+        print("db id in update database from pickle:", db_id)
+
+        srv_grp = config_data['test_server_group']
+
+        db_con = test_getnodes(node=self)
+
+        if db_con['data']["connected"]:
+
+            data = {
+                "comments": advance_config_data["test_db_update_data"]
+                ["test_comment"],
+                "id": db_id
+                   }
+
+            put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                           str(server_id) + '/' + str(db_id),
+                                           data=json.dumps(data),
+                                           follow_redirects=True)
+            print("database put response", put_response.data.decode())
+
+            self.assertEquals(put_response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
index 28cdb94..4fd2066 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/__init__.py
@@ -12,4 +12,4 @@ from pgadmin.utils.route import BaseTestGenerator
 
 class ServerGenerateTestCase(BaseTestGenerator):
     def runTest(self):
-        print ("In ServerGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
index 0af13d3..499c0a0 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_add.py
@@ -8,16 +8,14 @@
 # ##########################################################################
 
 import json
-
+import pickle
+import os
 from pgadmin.browser.tests.test_login import LoginTestCase
-from regression.config import config_data
+from regression.config import config_data, pickle_path
 
 
 class ServersAddTestCase(LoginTestCase):
-    """
-    This class will add the servers under default server group and verify with
-    server's name.
-    """
+    """ This class will add the servers under default server group. """
 
     priority = 4
 
@@ -27,14 +25,19 @@ class ServersAddTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will add the server under default server group.
-        Verify the added server with response code as well as server name.
-        """
+        """ This function will add the server under default server group."""
+
+        # Storing parent id's into pickle dict
+        pickle_id_dict = \
+            {
+                "sid": [],  # server
+                "did": []   # database
+            }
 
         srv_grp = config_data['test_server_group']
 
         for srv in config_data['test_server_credentials']:
+
             data = {"name": srv['test_name'],
                     "comment": "",
                     "host": srv['test_host'],
@@ -44,10 +47,22 @@ class ServersAddTestCase(LoginTestCase):
                     "role": "",
                     "sslmode": srv['test_sslmode']}
 
-            url = self.url + str(srv_grp) + "/"
-
-            response = self.tester.post(url, data=json.dumps(data),
+            response = self.tester.post(self.url + str(srv_grp) + "/",
+                                        data=json.dumps(data),
                                         content_type='html/json')
+
             self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
-            self.assertTrue(respdata['node']['label'], srv['test_name'])
+            respdata = json.loads(response.data.decode())
+
+            server_id = respdata['node']['_id']
+
+            if os.path.isfile(pickle_path):
+                exst_server_id = open(pickle_path, 'rb')
+                pickle_id_dict = pickle.load(exst_server_id)
+
+            pickle_id_dict["sid"].append(server_id)
+            print("\nServer id in server add", pickle_id_dict["sid"][0])
+
+            output = open(pickle_path, 'wb')
+            pickle.dump(pickle_id_dict, output)
+            output.close()
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
index 329d74f..997308e 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_delete.py
@@ -8,17 +8,14 @@
 # ##################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
 
 
-class ServersDeleteTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
-    priority = 7
+class ServerDeleteTestCase(LoginTestCase):
+    """ This class will delete the last server present under tree node."""
+
+    priority = 99
 
     scenarios = [
         # Fetching the default url for server node
@@ -26,32 +23,22 @@ class ServersDeleteTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers under object browser
-        and delete the servers using server id.
-        """
+        """ This function will get all available servers under object browser
+        and delete the last server using server id."""
 
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        url = self.url + str(srv_grp) + "/"
 
-            url = self.url + str(srv_grp) + "/"
+        response = self.tester.get(url)
+        respdata = json.loads(response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        if len(respdata) == 0:
+            raise Exception("No server(s) to delete.")
 
-            for server in respdata:
-                response = self.tester.delete(url + json.dumps(server['id']))
-                self.assertTrue(response.status_code, 200)
-                respdata = json.loads(response.data)
-                self.assertTrue(respdata['success'], 1)
+        # delete last server
+        server = respdata[-1]
+        response = self.tester.delete(url + str(server['id']))
+        self.assertTrue(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
index 050843e..163fef3 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_get.py
@@ -7,15 +7,14 @@
 #
 # ##########################################################################
 
-import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
 class ServersGetTestCase(LoginTestCase):
     """
-    This class will check server node present on the object browser's tree node
+    This class will fetch added servers under default server group
     by response code.
     """
 
@@ -27,23 +26,16 @@ class ServersGetTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will get all available servers present under
-        object browser.
-        """
+        """ This function will fetch the added servers to object browser. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
-
-            url = self.url + str(srv_grp) + "/"
-            response = self.tester.get(url, data=json.dumps(data),
+        for srv in server_id:
+
+            response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                       str(srv),
                                        content_type='html/json')
-            self.assertTrue(response.status_code, 200)
+
+            self.assertEquals(response.status_code, 200)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
index 306bb03..35d7c03 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py
@@ -8,16 +8,13 @@
 # ##########################################################################
 
 import json
-
 from pgadmin.browser.tests.test_login import LoginTestCase
 from regression.config import config_data
+from regression.test_utils import get_ids
 
 
-class ServersUpdateTestCase(LoginTestCase):
-    """
-    This class will check server node present on the object browser's tree node
-    by response code.
-    """
+class ServerUpdateTestCase(LoginTestCase):
+    """ This class will update server's comment field. """
 
     priority = 6
 
@@ -27,39 +24,41 @@ class ServersUpdateTestCase(LoginTestCase):
     ]
 
     def runTest(self):
-        """
-        This function will edit and update the server's comment field
-        by the server id.
-        """
+        """ This function will update the server's comment field. """
 
+        all_id = get_ids()
+        server_id = all_id["sid"][0]
         srv_grp = config_data['test_server_group']
 
-        for srv in config_data['test_server_credentials']:
+        response = self.tester.get(self.url + str(srv_grp) + '/' +
+                                   str(server_id),
+                                   follow_redirects=True)
 
-            data = {"name": srv['test_name'],
-                    "host": srv['test_host'],
-                    "port": srv['test_db_port'],
-                    "db": srv['test_maintenance_db'],
-                    "username": srv['test_db_username'],
-                    "role": "",
-                    "sslmode": srv['test_sslmode']}
+        con_response = self.tester.post('browser/server/connect/{0}/{1}'.format
+                                        (srv_grp, server_id),
+                                        data=dict(password=
+                                                  config_data
+                                                  ['test_server_credentials'][0]
+                                                  ['test_db_password']),
+                                        follow_redirects=True)
 
-            url = self.url + str(srv_grp) + "/"
+        srv_con = json.loads(con_response.data.decode())
 
-            response = self.tester.get(url, data=json.dumps(data),
-                                       content_type='html/json')
+        if len(srv_con) == 0:
+            raise Exception("No Server(s) connected to update.")
 
-            self.assertTrue(response.status_code, 200)
-            respdata = json.loads(response.data)
+        data = \
+            {
+                "comment": config_data
+                ['test_server_update_data'][0]['test_comment'],
+                "id": server_id
+            }
 
-            for server in respdata:
+        put_response = self.tester.put(self.url + str(srv_grp) + '/' +
+                                       str(server_id), data=json.dumps(data),
+                                       content_type='html/json')
 
-                url = self.url + str(srv_grp) + "/" + json.dumps(server['id'])
+        self.assertEquals(put_response.status_code, 200)
 
-                for server in config_data['test_server_update_data']:
-                    data = {"comment": server['test_comment']}
-                    response = self.tester.put(url, data=json.dumps(data),
-                                               content_type='html/json')
-                    self.assertTrue(response.status_code, 200)
-                    respdata = json.loads(response.data)
-                    self.assertTrue(respdata['success'], 1)
+        respdata = json.loads(put_response.data.decode())
+        self.assertTrue(respdata['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
new file mode 100644
index 0000000..c552d8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -0,0 +1,36 @@
+###########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
+
+import json
+from pgadmin.browser.tests.test_login import LoginTestCase
+from regression.config import config_data
+
+
+class SgGetTestCase(LoginTestCase):
+    """
+     This class will check available server groups in pgAdmin.
+    """
+
+    priority = 3
+
+    scenarios = [
+        # Fetching the default url for server group node
+        ('Check Server Group Node', dict(url='/browser/server-group/obj/'))
+    ]
+
+    def runTest(self):
+        """This function will check available server groups."""
+
+        srv_grp = config_data['test_server_group']
+
+        response = self.tester.get(self.url + str(srv_grp),
+                                   content_type='html/json')
+        self.assertEquals(response.status_code, 200)
+        respdata = json.loads(response.data.decode())
+        self.assertTrue(respdata['id'], srv_grp)
diff --git a/web/pgadmin/browser/tests/__init__.py b/web/pgadmin/browser/tests/__init__.py
index 2381efd..4470711 100644
--- a/web/pgadmin/browser/tests/__init__.py
+++ b/web/pgadmin/browser/tests/__init__.py
@@ -11,5 +11,6 @@ from pgadmin.utils.route import BaseTestGenerator
 
 
 class BrowserGenerateTestCase(BaseTestGenerator):
+
     def runTest(self):
-        print ("In BrowserGenerateTestCase...")
+        return
diff --git a/web/pgadmin/browser/tests/test_change_password.py b/web/pgadmin/browser/tests/test_change_password.py
index dedb7d9..5c4930d 100644
--- a/web/pgadmin/browser/tests/test_change_password.py
+++ b/web/pgadmin/browser/tests/test_change_password.py
@@ -85,10 +85,10 @@ class ChangePasswordTestCase(LoginTestCase):
         """This function will check change password functionality."""
 
         response = self.tester.get('/change', follow_redirects=True)
-        self.assertIn('pgAdmin 4 Password Change', response.data)
+        self.assertIn('pgAdmin 4 Password Change', response.data.decode('utf8'))
         response = self.tester.post('/change', data=dict(
             password=self.password,
             new_password=self.new_password,
             new_password_confirm=self.new_password_confirm),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_login.py b/web/pgadmin/browser/tests/test_login.py
index 7c2b796..d272a63 100644
--- a/web/pgadmin/browser/tests/test_login.py
+++ b/web/pgadmin/browser/tests/test_login.py
@@ -8,7 +8,6 @@
 ##########################################################################
 
 import uuid
-
 from pgadmin.utils.route import BaseTestGenerator
 from regression.config import config_data
 
@@ -67,7 +66,9 @@ class LoginTestCase(BaseTestGenerator):
                    ['test_login_username']),
             password=(config_data['pgAdmin4_login_credentials']
                       ['test_login_password']),
-            respdata='You are currently running version'))
+            respdata='Gravatar image for %s' %
+                     config_data['pgAdmin4_login_credentials']
+                     ['test_login_username']))
     ]
 
     def runTest(self):
@@ -76,4 +77,4 @@ class LoginTestCase(BaseTestGenerator):
         response = self.tester.post('/login', data=dict(
             email=self.email, password=self.password),
                                     follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/browser/tests/test_logout.py b/web/pgadmin/browser/tests/test_logout.py
index 8971e72..d9611ae 100644
--- a/web/pgadmin/browser/tests/test_logout.py
+++ b/web/pgadmin/browser/tests/test_logout.py
@@ -14,14 +14,13 @@ from regression.config import config_data
 class LogoutTest(LoginTestCase):
     """
     This class verifies the logout functionality; provided the user is already
-    logged-in. Dictionary parameters define the scenario appended by test
-    name.
+    logged-in.
     """
 
-    priority = 3
+    priority = 100
 
     scenarios = [
-        # This test case validate the logout page
+        # This test case validate the logout page.
         ('Logging Out', dict(respdata='Redirecting...'))
     ]
 
@@ -29,7 +28,7 @@ class LogoutTest(LoginTestCase):
         """This function checks the logout functionality."""
 
         response = self.tester.get('/logout')
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
 
     def tearDown(self):
         """
diff --git a/web/pgadmin/browser/tests/test_reset_password.py b/web/pgadmin/browser/tests/test_reset_password.py
index 030b182..31a3992 100644
--- a/web/pgadmin/browser/tests/test_reset_password.py
+++ b/web/pgadmin/browser/tests/test_reset_password.py
@@ -41,8 +41,9 @@ class ResetPasswordTestCase(BaseTestGenerator):
         """This function checks reset password functionality."""
 
         response = self.tester.get('/reset')
-        self.assertIn('Recover pgAdmin 4 Password', response.data)
+        self.assertIn('Recover pgAdmin 4 Password',
+                      response.data.decode('utf8'))
         response = self.tester.post(
             '/reset', data=dict(email=self.email),
             follow_redirects=True)
-        self.assertIn(self.respdata, response.data)
+        self.assertIn(self.respdata, response.data.decode('utf8'))
diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index fb9de69..a2cd1eb 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -52,8 +52,10 @@ class TestsGeneratorRegistry(ABCMeta):
         from werkzeug.utils import find_modules
 
         for module_name in find_modules(pkg, False, True):
-            module = import_module(module_name)
-
+            try:
+                module = import_module(module_name)
+            except ImportError:
+                pass
 
 import six
 
diff --git a/web/regression/README b/web/regression/README
index e0003e4..0751661 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -40,23 +40,25 @@ General Information
     3. test_server_get.py
     4. test_server_update.py
 
-2) The pgAdmin4 source tree includes a file template for the server configuration
-   named ‘test_config.json.in' in the ‘pgAdmin4/web/regression’ directory. After
-   completing the pgAdmin4 configuration, you must make a working copy of the
-   template called test_config.json before modifying the file contents.
+2) The pgAdmin4 source tree includes 2 different configuration file templates.
+   One file template for the server configuration named ‘test_config.json.in'
+   and another for test configuration named 'test_advanced_config.json.in' in
+   the ‘pgAdmin4/web/regression’ directory. After completing the pgAdmin4
+   configuration, you must make a working copy of the templates called
+   test_config.json and test_advance_config.json before modifying the file contents.
 
 	2a) The following command copies the test_config.json.in file, creating a
-	    configuration file named test_config.json
+	    configuration file named test_config.json (same way user can copy
+	    test_advance_config.json.in file into test_advance_config.json)
 
             # cp pgadmin4/web/regression/test_config.json.in \
               pgadmin4/web/regression/test_config.json
 
-	2b) After creating the server configuration file, add (or modify)
-	    parameter values as per requirements. The configuration
-	    files are owned by root/user. The pgAdmin4 regression framework expects
-	    to find the files in the  directory '/<installation dir>/web/regression/'.
-	    If you move the file to another location, you must create a symbolic link
-	    that specifies the new location.
+	2b) After creating the server and test configuration file, add (or modify)
+	    parameter values as per requirements. The pgAdmin4 regression framework
+	    expects to find the files in the  directory
+	    '/<installation dir>/web/regression/'. If you move the file to another
+	    location, you must create a symbolic link that specifies the new location.
 
 	2c) Specifying Server Configuration file:
 
@@ -64,6 +66,13 @@ General Information
 	    server details and connection properties as per their local setup. The
 	    test_config file is in json format and property values are case-sensitive.
 
+	2d) Specifying the Test Configuration file:
+
+	    The user can add/change test data as per their need. The
+	    test_advanced_config file is in json format and property values are
+	    case-sensitive.
+
+
 Test Data Details
 -----------------
 
diff --git a/web/regression/config.py b/web/regression/config.py
index bef65fb..f48eade 100644
--- a/web/regression/config.py
+++ b/web/regression/config.py
@@ -14,3 +14,8 @@ root = os.path.dirname(os.path.realpath(__file__))
 
 with open(root + '/test_config.json') as data_file:
     config_data = json.load(data_file)
+
+with open(root + '/test_advance_config.json') as data_file:
+    advance_config_data = json.load(data_file)
+
+pickle_path = os.path.join(root, 'parent_id.pkl')
diff --git a/web/regression/test_advance_config.json.in b/web/regression/test_advance_config.json.in
new file mode 100644
index 0000000..e415876
--- /dev/null
+++ b/web/regression/test_advance_config.json.in
@@ -0,0 +1,103 @@
+{
+  "test_add_database_data":
+   {
+    "test_privileges_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "C",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "T",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_conn_limit": -1,
+    "test_owner": "postgres",
+    "test_fun_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "X",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_seq_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "w",
+            "privilege": true,
+            "with_grant": false
+          },
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_tbl_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "a",
+            "privilege": true,
+            "with_grant": true
+          },
+          {
+            "privilege_type": "r",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_type_acl": [
+      {
+        "grantee": "postgres",
+        "grantor": "postgres",
+        "privileges": [
+          {
+            "privilege_type": "U",
+            "privilege": true,
+            "with_grant": false
+          }
+        ]
+      }
+    ],
+    "test_encoding": "UTF8",
+    "test_name": "test_db_automation",
+    "test_privileges": [],
+    "test_securities": [],
+    "test_variables": []
+  },
+
+  "test_db_update_data":
+  {
+      "test_comment": "This is db update comment"
+  }
+
+}
diff --git a/web/regression/test_nodes.py b/web/regression/test_nodes.py
new file mode 100644
index 0000000..e3617e4
--- /dev/null
+++ b/web/regression/test_nodes.py
@@ -0,0 +1,52 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+from regression.config import config_data
+import json
+from regression.test_utils import get_ids
+
+
+def test_getnodes(node=None):
+    # Connect to server and database.
+
+    if not node:
+        return None
+
+    all_id = get_ids()
+
+    server_id = all_id["sid"][0]
+    db_id = all_id["did"][0]
+    print("Database Details From pickle: id in test nodes:", db_id)
+
+    srv_grp = config_data['test_server_group']
+
+    # Connect to server
+    response = node.tester.post('browser/server/connect/{0}/{1}'.format
+                                (srv_grp, server_id),
+                                data=dict(password=config_data
+                                ['test_server_credentials'][0]
+                                ['test_db_password']), follow_redirects=True)
+    print('\n')
+    print("Server Connection Response After Database Addition in test nodes",
+          response.data.decode())
+
+    # Connect to database
+    con_response = node.tester.post('browser/database/connect/'
+                                    '{0}/{1}/{2}'.format
+                                    (srv_grp, server_id, db_id),
+                                    follow_redirects=True)
+    print('\n')
+    print("Database Connection Response After Database Addition in test nodes",
+          con_response.data.decode())
+
+    db_con = json.loads(con_response.data.decode())
+
+    print("\nDatabase Connection Response in test nodes", db_con)
+
+    return db_con
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
new file mode 100644
index 0000000..c68744f
--- /dev/null
+++ b/web/regression/test_utils.py
@@ -0,0 +1,20 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+import pickle
+from regression.config import pickle_path
+
+
+def get_ids(url=pickle_path):
+    # This function will read parent nodes id's from pickle and return it.
+
+    output = open(url, 'rb')
+    ids = pickle.load(output)
+    output.close()
+    return ids
diff --git a/web/regression/testsuite.py b/web/regression/testsuite.py
index 75d437b..e8dd586 100644
--- a/web/regression/testsuite.py
+++ b/web/regression/testsuite.py
@@ -13,7 +13,8 @@ them to TestSuite. """
 import os
 import sys
 import unittest
-
+import operator
+import logging
 from testscenarios.scenarios import generate_scenarios
 
 # We need to include the root directory in sys.path to ensure that we can
@@ -51,6 +52,21 @@ TestsGeneratorRegistry.load_generators('pgadmin')
 # application. We can trigger test request to the application.
 test_client = app.test_client()
 
+class StreamToLogger(object):
+    def __init__(self, logger, log_level=logging.INFO):
+        self.terminal = sys.stderr
+        self.logger = logger
+        self.log_level = log_level
+        self.linebuf = ''
+
+    def write(self, buf):
+        self.terminal.write(buf)
+        for line in buf.rstrip().splitlines():
+            self.logger.log(self.log_level, line.rstrip())
+
+    def flush(self):
+        pass
+
 
 def suite():
     """ Defining test suite which will execute all the testcases present in
@@ -65,6 +81,8 @@ def suite():
 
         modules.insert(gen.priority, gen)
 
+    modules.sort(key=operator.attrgetter('priority'))
+
     for m in modules:
         obj = m()
         obj.setTestClient(test_client)
@@ -75,5 +93,24 @@ def suite():
 
 
 if __name__ == '__main__':
+
+    logging.basicConfig(level=logging.DEBUG,
+                        format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
+                        filename="logger.log",
+                        filemode='w')
+
+    stderr_logger = logging.getLogger('STDERR')
+    sl = StreamToLogger(stderr_logger, logging.ERROR)
+    sys.stderr = sl
+
     suite = suite()
-    tests = unittest.TextTestRunner(descriptions=True, verbosity=2).run(suite)
+    tests = unittest.TextTestRunner(descriptions=True, verbosity=2,
+                                    stream=sys.stderr).run(suite)
+
+    print("Please check output in file: logger.log placed at", current_path)
+
+    try:
+        os.remove("parent_id.pkl")
+
+    except IOError:
+        pass


^ permalink  raw  reply  [nested|flat] 27+ messages in thread

* Re: pgAdmin IV API test cases patch
  2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-06 08:33 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-06 08:39   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-09 12:37     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-15 08:39       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-15 09:35         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-23 13:41           ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-24 10:47             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-26 11:05               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-27 07:54                 ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-06-27 09:40                   ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 13:52                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-06-29 19:21                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-04 11:16                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-04 12:00                           ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-05 08:00                             ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-05 10:10                               ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-08 09:38                                 ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 11:48                                   ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 12:25                                     ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-11 13:05                                       ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-11 13:45                                         ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
  2016-07-12 04:14                                           ` Re: pgAdmin IV API test cases patch Khushboo Vashi <[email protected]>
  2016-07-12 12:04                                             ` Re: pgAdmin IV API test cases patch Dave Page <[email protected]>
  2016-07-14 11:50                                               ` Re: pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
@ 2016-07-15 12:43                                                 ` Dave Page <[email protected]>
  0 siblings, 0 replies; 27+ messages in thread

From: Dave Page @ 2016-07-15 12:43 UTC (permalink / raw)
  To: Priyanka Shendge <[email protected]>; +Cc: pgadmin-hackers; Kanchan Mohitey <[email protected]>; Khushboo Vashi <[email protected]>

Hi

On Thu, Jul 14, 2016 at 12:50 PM, Priyanka Shendge
<[email protected]> wrote:
> Hi Dave,
>
> I have added more debug statements to older patch. New patch attached.
> Also, i removed database deletion test case from current patch so that we
> can analyse
> if database is added or not.

OK. One quick note - somewhere along the way,
test_advanced_config.json has been changed back to
test_advance_config.json. The first is correct - please include that
fix in the next patch.

The database is added - assuming you're referring to one randomly
named like bbb6cad or d602036?

> I have added few more debug statements to database add test case. After
> running the testsuite
> can you please confirm whether the database is created or not under server
> node?
>
> Could you please re-run the attached patch and send me the logs and output?

Sure - all the interesting info is here:

runTest (pgadmin.browser.tests.test_login.LoginTestCase)
This function checks login functionality. (TestCase for Checking
Invalid_Password) ... ok
runTest (pgadmin.browser.tests.test_login.LoginTestCase)
This function checks login functionality. (Empty_Password) ... ok
runTest (pgadmin.browser.tests.test_login.LoginTestCase)
This function checks login functionality. (Empty_Email) ... ok
runTest (pgadmin.browser.tests.test_login.LoginTestCase)
This function checks login functionality. (Empty_Creadentials) ... ok
runTest (pgadmin.browser.tests.test_login.LoginTestCase)
This function checks login functionality. (Invalid_Email) ... ok
runTest (pgadmin.browser.tests.test_login.LoginTestCase)
This function checks login functionality. (Invalid_Creadentials) ... ok
runTest (pgadmin.browser.tests.test_login.LoginTestCase)
This function checks login functionality. (Valid_Creadentials) ... ok
runTest (pgadmin.browser.server_groups.tests.test_sg_add.SgNodeTestCase)
This function will check available server groups. (Check Server Group
Node) ... ok
runTest (pgadmin.browser.tests.test_reset_password.ResetPasswordTestCase)
This function checks reset password functionality. (TestCase for
Validating Empty Email) ... ok
runTest (pgadmin.browser.tests.test_reset_password.ResetPasswordTestCase)
This function checks reset password functionality. (TestCase for
Validating Invalid_Email) ... ok
runTest (pgadmin.browser.tests.test_reset_password.ResetPasswordTestCase)
This function checks reset password functionality. (TestCase for
Validating Valid_Email) ... ok
runTest (pgadmin.browser.tests.test_change_password.ChangePasswordTestCase)
This function will check change password functionality. (TestCase for
Validating Incorrect_New_Password) ... ok
runTest (pgadmin.browser.tests.test_change_password.ChangePasswordTestCase)
This function will check change password functionality. (TestCase for
Validating New_Password_Less_Than_Min_Length) ... ok
runTest (pgadmin.browser.tests.test_change_password.ChangePasswordTestCase)
This function will check change password functionality. (TestCase for
Validating Empty_New_Password) ... ok
runTest (pgadmin.browser.tests.test_change_password.ChangePasswordTestCase)
This function will check change password functionality. (TestCase for
Validating Incorrect_Current_Password) ... ok
runTest (pgadmin.browser.tests.test_change_password.ChangePasswordTestCase)
This function will check change password functionality. (TestCase for
Changing Valid_Password) ... ok
runTest (pgadmin.browser.tests.test_change_password.ChangePasswordTestCase)
This function will check change password functionality.
(Reassigning_Password) ... ok
runTest (pgadmin.browser.server_groups.tests.test_sg_get.SgGetTestCase)
This function will check available server groups. (Check Server Group
Node) ... ok
runTest (pgadmin.browser.server_groups.servers.tests.test_server_add.ServersAddTestCase)
This function will add the server under default server group. (Default
Server Node url) ... ('\nServer id in server add', u'9')
ok
runTest (pgadmin.browser.server_groups.servers.tests.test_server_get.ServersGetTestCase)
This function will fetch the added servers to object browser. (Default
Server Node url) ... ok
runTest (pgadmin.browser.server_groups.servers.tests.test_server_put.ServerUpdateTestCase)
This function will update the server's comment field. (Default Server
Node url) ... 2016-07-15 13:29:39,946: INFO pgadmin: Connection
Request for server#9
FAIL
runTest (pgadmin.browser.server_groups.servers.databases.tests.test_db_add.DatabaseAddTestCase)
This function will add database under 1st server of tree node. (Check
Databases Node URL) ... 2016-07-15 13:29:39,956: INFO pgadmin:
Connection Request for server#9
FAIL
runTest (pgadmin.browser.server_groups.servers.databases.tests.test_db_get.DatabasesGetTestCase)
This function will fetch added database. (Check Databases Node URL) ...

('db id in get database from pickle:', 158619)
('Database Details From pickle: id in test nodes:', 158619)
2016-07-15 13:29:39,962: INFO pgadmin: Connection Request for server#9


('Server Connection Response After Database Addition in test nodes',
u'{"info": "", "errormsg": "Server not found.", "data": null,
"result": null, "success": 0}')
2016-07-15 13:29:39,969: ERROR pgadmin: Exception on
/browser/database/connect/1/9/158619 [POST]
Traceback (most recent call last):
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/views.py",
line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/utils.py", line
235, in dispatch_request
    return method(*args, **kwargs)
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_groups/servers/databases/__init__.py",
line 334, in connect
    conn = manager.connection(did=did, auto_reconnect=True)
AttributeError: 'NoneType' object has no attribute 'connection'


('Database Connection Response After Database Addition in test nodes',
u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>500
Internal Server Error</title>\n<h1>Internal Server Error</h1>\n<p>The
server encountered an internal error and was unable to complete your
request.  Either the server is overloaded or there is an error in the
application.</p>\n')
ERROR
runTest (pgadmin.browser.server_groups.servers.databases.tests.test_db_put.DatabasesUpdateTestCase)
This function will update the comments field of database. (Check
Databases Node) ...

('db id in update database from pickle:', 158619)
('Database Details From pickle: id in test nodes:', 158619)
2016-07-15 13:29:39,976: INFO pgadmin: Connection Request for server#9


('Server Connection Response After Database Addition in test nodes',
u'{"info": "", "errormsg": "Server not found.", "data": null,
"result": null, "success": 0}')
2016-07-15 13:29:39,983: ERROR pgadmin: Exception on
/browser/database/connect/1/9/158619 [POST]
Traceback (most recent call last):
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/app.py",
line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-packages/flask/views.py",
line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/utils.py", line
235, in dispatch_request
    return method(*args, **kwargs)
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_groups/servers/databases/__init__.py",
line 334, in connect
    conn = manager.connection(did=did, auto_reconnect=True)
AttributeError: 'NoneType' object has no attribute 'connection'


('Database Connection Response After Database Addition in test nodes',
u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n<title>500
Internal Server Error</title>\n<h1>Internal Server Error</h1>\n<p>The
server encountered an internal error and was unable to complete your
request.  Either the server is overloaded or there is an error in the
application.</p>\n')
ERROR
runTest (pgadmin.browser.server_groups.servers.tests.test_server_delete.ServerDeleteTestCase)
This function will get all available servers under object browser
(Default Server Node url) ... ok
runTest (pgadmin.browser.tests.test_logout.LogoutTest)
This function checks the logout functionality. (Logging Out) ... ok

======================================================================
ERROR: runTest (pgadmin.browser.server_groups.servers.databases.tests.test_db_get.DatabasesGetTestCase)
This function will fetch added database. (Check Databases Node URL)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_get.py",
line 38, in runTest
    db_con = test_getnodes(node=self)
  File "/Users/dpage/git/pgadmin4/web/regression/test_nodes.py", line
48, in test_getnodes
    db_con = json.loads(con_response.data.decode())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py",
line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py",
line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py",
line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

======================================================================
ERROR: runTest (pgadmin.browser.server_groups.servers.databases.tests.test_db_put.DatabasesUpdateTestCase)
This function will update the comments field of database. (Check Databases Node)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_put.py",
line 39, in runTest
    db_con = test_getnodes(node=self)
  File "/Users/dpage/git/pgadmin4/web/regression/test_nodes.py", line
48, in test_getnodes
    db_con = json.loads(con_response.data.decode())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py",
line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py",
line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py",
line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

======================================================================
FAIL: runTest (pgadmin.browser.server_groups.servers.tests.test_server_put.ServerUpdateTestCase)
This function will update the server's comment field. (Default Server Node url)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_groups/servers/tests/test_server_put.py",
line 64, in runTest
    self.assertTrue(respdata['success'], 1)
AssertionError: 1

======================================================================
FAIL: runTest (pgadmin.browser.server_groups.servers.databases.tests.test_db_add.DatabaseAddTestCase)
This function will add database under 1st server of tree node. (Check
Databases Node URL)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_groups/servers/databases/tests/test_db_add.py",
line 47, in runTest
    self.assertEquals(response.status_code, 200)
AssertionError: 400 != 200

----------------------------------------------------------------------
Ran 26 tests in 12.312s

FAILED (failures=2, errors=2)
('Please check output in file: logger.log placed at',
'/Users/dpage/git/pgadmin4/web/regression')
Traceback (most recent call last):
  File "regression/testsuite.py", line 113, in <module>
    os.remove("parent_id.pkl")
OSError: [Errno 2] No such file or directory: 'parent_id.pkl'
(pgadmin4)piranha:web dpage$

The output log doesn't seem to contain anything more useful.

-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers




^ permalink  raw  reply  [nested|flat] 27+ messages in thread


end of thread, other threads:[~2016-07-15 12:43 UTC | newest]

Thread overview: 27+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2016-06-05 17:56 pgAdmin IV API test cases patch Priyanka Shendge <[email protected]>
2016-06-06 08:33 ` Dave Page <[email protected]>
2016-06-06 08:39   ` Priyanka Shendge <[email protected]>
2016-06-09 12:37     ` Priyanka Shendge <[email protected]>
2016-06-15 08:39       ` Dave Page <[email protected]>
2016-06-15 08:40         ` Dave Page <[email protected]>
2016-06-15 09:35         ` Priyanka Shendge <[email protected]>
2016-06-23 13:41           ` Priyanka Shendge <[email protected]>
2016-06-24 10:47             ` Dave Page <[email protected]>
2016-06-26 11:05               ` Priyanka Shendge <[email protected]>
2016-06-27 07:54                 ` Dave Page <[email protected]>
2016-06-27 09:40                   ` Priyanka Shendge <[email protected]>
2016-06-29 13:52                     ` Priyanka Shendge <[email protected]>
2016-06-29 19:21                       ` Dave Page <[email protected]>
2016-07-04 11:16                         ` Priyanka Shendge <[email protected]>
2016-07-04 12:00                           ` Dave Page <[email protected]>
2016-07-05 08:00                             ` Priyanka Shendge <[email protected]>
2016-07-05 10:10                               ` Dave Page <[email protected]>
2016-07-08 09:38                                 ` Priyanka Shendge <[email protected]>
2016-07-11 11:48                                   ` Dave Page <[email protected]>
2016-07-11 12:25                                     ` Priyanka Shendge <[email protected]>
2016-07-11 13:05                                       ` Dave Page <[email protected]>
2016-07-11 13:45                                         ` Priyanka Shendge <[email protected]>
2016-07-12 04:14                                           ` Khushboo Vashi <[email protected]>
2016-07-12 12:04                                             ` Dave Page <[email protected]>
2016-07-14 11:50                                               ` Priyanka Shendge <[email protected]>
2016-07-15 12:43                                                 ` Dave Page <[email protected]>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox