Hi Ashesh,

PFA patch for db child nodes. (Added cascade delete for delete operation)
New test cases for Foreign table added.

You can run testsuite by:

*For all nodes*
      python regression/runtests.py

*For Foreing table*:
python runtests.py --pkg
browser.server_groups.servers.databases.schemas.foreign_tables

Let me know for any modification.

-- 
Best,
Priyanka

EnterpriseDB Corporation
The Enterprise PostgreSQL Company
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py
index e5b108d..0119e7e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/tests/utils.py
@@ -19,6 +19,7 @@ from pgadmin.browser.server_groups.servers.tests import utils as server_utils
 
 
 EXTENSION_URL = '/browser/extension/obj/'
+EXTENSION_DELETE_URL = '/browser/extension/delete/'
 
 
 def get_extension_config_data(schema_name, server_connect_data):
@@ -51,7 +52,6 @@ def write_extension_info(response_data, server_id):
     """
 
     extension_id = response_data['node']['_id']
-    # schema_name = str(response_data['node']['label'])
     pickle_id_dict = utils.get_pickle_id_dict()
     if os.path.isfile(pickle_path):
         existing_server_id = open(pickle_path, 'rb')
@@ -125,7 +125,7 @@ def delete_extension(tester):
                                      extension_id)
         if response.status_code == 200:
             delete_response = tester.delete(
-                EXTENSION_URL + str(utils.SERVER_GROUP) + '/' +
+                EXTENSION_DELETE_URL + str(utils.SERVER_GROUP) + '/' +
                 str(server_id) + '/' +
                 str(db_id) + '/' +
                 str(extension_id),
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
index 4d0b5f5..b0b85b8 100644
--- 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
@@ -71,7 +71,6 @@ class ForeignServerGetTestCase(BaseTestGenerator):
         # Add foreign server(s) to foreign data wrapper
         fsrv_utils.add_fsrv(cls.tester)
 
-#
     def runTest(self):
         """ This function will fetch foreign server under FDW node. """
 
@@ -84,7 +83,7 @@ class ForeignServerGetTestCase(BaseTestGenerator):
         for server_id in server_ids:
             db_id = db_ids_dict[int(server_id)]
             fdw_id = fdw_ids_dict[server_id]
-            fsrv_id = fsrv_ids_dict[server_id]
+            fsrv_id = fsrv_ids_dict[server_id][0]
 
             response = fsrv_utils.verify_fsrv(self.tester, utils.SERVER_GROUP,
                                               server_id, db_id,
@@ -107,4 +106,3 @@ class ForeignServerGetTestCase(BaseTestGenerator):
         database_utils.delete_database(cls.tester)
         server_utils.delete_server(cls.tester)
         utils.delete_parent_id_file()
-
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
index 4e5809a..4da0bb4 100644
--- 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
@@ -86,7 +86,7 @@ class ForeignServerPutTestCase(BaseTestGenerator):
         for server_id in server_ids:
             db_id = db_ids_dict[int(server_id)]
             fdw_id = fdw_ids_dict[server_id]
-            fsrv_id = fsrv_ids_dict[server_id]
+            fsrv_id = fsrv_ids_dict[server_id][0]
 
             response = fsrv_utils.verify_fsrv(self.tester, utils.SERVER_GROUP,
                                               server_id, db_id,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py
index e271643..97ab0d8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/tests/utils.py
@@ -19,11 +19,13 @@ import uuid
 from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.tests \
     import utils as fdw_utils
 
-
 FSRV_URL = '/browser/foreign_server/obj/'
+FSRV_DELETE_URL = '/browser/foreign_server/delete/'
 
 
 def get_fsrv_config_data(server_connect_data):
+    # This function will read the foreign server data from config file.
+
     adv_config_data = None
     db_user = server_connect_data['data']['user']['name']
 
@@ -43,6 +45,7 @@ def get_fsrv_config_data(server_connect_data):
 
 
 def add_fsrv(tester):
+    # This function will add foreign server(s) under foreign data wrapper node.
 
     all_id = utils.get_ids()
     server_ids = all_id["sid"]
@@ -85,7 +88,7 @@ def add_fsrv(tester):
 
 def write_fsrv_info(response_data, server_id):
     """
-    This function writes the schema id into parent_id.pkl
+    This function writes the foreign server id into parent_id.pkl
 
     :param response_data: foreign server add response data
     :type response_data: dict
@@ -95,6 +98,7 @@ def write_fsrv_info(response_data, server_id):
     """
 
     fsrv_id = response_data['node']['_id']
+    fsrv_label = str(response_data['node']['label'])
     pickle_id_dict = utils.get_pickle_id_dict()
     if os.path.isfile(pickle_path):
         existing_server_id = open(pickle_path, 'rb')
@@ -103,16 +107,18 @@ def write_fsrv_info(response_data, server_id):
     if 'fsid' in pickle_id_dict:
         if pickle_id_dict['fsid']:
             # Add the FSRV_id as value in dict
-            pickle_id_dict["fsid"][0].update({server_id: fsrv_id})
+            pickle_id_dict["fsid"][0].update({server_id: [fsrv_id, fsrv_label]})
         else:
             # Create new dict with server_id and fsrv_id
-            pickle_id_dict["fsid"].append({server_id: fsrv_id})
+            pickle_id_dict["fsid"].append({server_id: [fsrv_id, fsrv_label]})
     fsrv_output = open(pickle_path, 'wb')
     pickle.dump(pickle_id_dict, fsrv_output)
     fsrv_output.close()
 
 
-def verify_fsrv(tester, server_group,  server_id, db_id, fdw_id, fsrv_id):
+def verify_fsrv(tester, server_group, server_id, db_id, fdw_id, fsrv_id):
+    # This function will fetch added foreign server.
+
     response = tester.get(FSRV_URL + str(server_group) + '/' +
                           str(server_id) + '/' + str(db_id) +
                           '/' + str(fdw_id) + '/' + str(fsrv_id),
@@ -121,6 +127,8 @@ def verify_fsrv(tester, server_group,  server_id, db_id, fdw_id, fsrv_id):
 
 
 def delete_fsrv(tester):
+    # This function will delete added foreign server.
+
     all_id = utils.get_ids()
     server_ids = all_id["sid"]
     db_ids_dict = all_id["did"][0]
@@ -130,7 +138,7 @@ def delete_fsrv(tester):
     for server_id in server_ids:
         db_id = db_ids_dict[int(server_id)]
         fdw_id = fdw_ids_dict[server_id]
-        fsrv_id = fsrv_ids_dict[server_id]
+        fsrv_id = fsrv_ids_dict[server_id][0]
 
         response = verify_fsrv(tester, utils.SERVER_GROUP,
                                server_id, db_id,
@@ -138,7 +146,7 @@ def delete_fsrv(tester):
 
         if response.status_code == 200:
             delete_response = tester.delete(
-                FSRV_URL + str(utils.SERVER_GROUP) +
+                FSRV_DELETE_URL + str(utils.SERVER_GROUP) +
                 '/' + str(server_id) + '/' +
                 str(db_id) + '/' +
                 str(fdw_id) + '/' +
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
index 3270e08..7ccca91 100644
--- 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
@@ -91,7 +91,7 @@ class UserMappingGetTestCase(BaseTestGenerator):
         for server_id in server_ids:
             db_id = db_ids_dict[int(server_id)]
             fdw_id = fdw_ids_dict[server_id]
-            fsrv_id = fsrv_ids_dict[server_id]
+            fsrv_id = fsrv_ids_dict[server_id][0]
             um_id = um_ids_dict[server_id]
 
             response = um_utils.verify_um(self.tester, utils.SERVER_GROUP,
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
index 9aa9a30..4105fdb 100644
--- 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
@@ -92,7 +92,7 @@ class UserMappingPutTestCase(BaseTestGenerator):
         for server_id in server_ids:
             db_id = db_ids_dict[int(server_id)]
             fdw_id = fdw_ids_dict[server_id]
-            fsrv_id = fsrv_ids_dict[server_id]
+            fsrv_id = fsrv_ids_dict[server_id][0]
             um_id = um_ids_dict[server_id]
 
             response = um_utils.verify_um(self.tester, utils.SERVER_GROUP,
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/utils.py
index 8349222..d72aaa3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/tests/utils.py
@@ -22,6 +22,7 @@ from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.\
 
 
 UM_URL = '/browser/user_mapping/obj/'
+UM_DELETE_URL = '/browser/user_mapping/delete/'
 
 
 def get_um_config_data(server_connect_data):
@@ -67,7 +68,7 @@ def add_um(tester):
                                                  server_id, db_id,
                                                  fdw_id)
 
-            fsrv_id = fsrv_ids_dict[server_id]
+            fsrv_id = fsrv_ids_dict[server_id][0]
 
             fsrv_response = fsrv_utils.verify_fsrv(tester, utils.SERVER_GROUP,
                                                    server_id, db_id,
@@ -139,7 +140,7 @@ def delete_um(tester):
     for server_id in server_ids:
         db_id = db_ids_dict[int(server_id)]
         fdw_id = fdw_ids_dict[server_id]
-        fsrv_id = fsrv_ids_dict[server_id]
+        fsrv_id = fsrv_ids_dict[server_id][0]
         um_id = um_ids_dict[server_id]
 
         response = verify_um(tester, utils.SERVER_GROUP,
@@ -147,7 +148,7 @@ def delete_um(tester):
                              fdw_id, fsrv_id, um_id)
         if response.status_code == 200:
             delete_response = tester.delete(
-                UM_URL + str(utils.SERVER_GROUP) + '/' +
+                UM_DELETE_URL + str(utils.SERVER_GROUP) + '/' +
                 str(server_id) + '/' + str(db_id) +
                 '/' + str(fdw_id) + '/' +
                 str(fsrv_id) + '/' + str(um_id),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py
index 64782c0..eb2e9d0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/tests/utils.py
@@ -18,6 +18,7 @@ from pgadmin.browser.server_groups.servers.databases.tests import \
 import uuid
 
 FDW_URL = '/browser/foreign_data_wrapper/obj/'
+FDW_DELETE_URL = '/browser/foreign_data_wrapper/delete/'
 
 
 def get_fdw_config_data(schema_name, server_connect_data):
@@ -123,7 +124,7 @@ def delete_fdw(tester):
 
         if response.status_code == 200:
             delete_response = tester.delete(
-                FDW_URL + str(utils.SERVER_GROUP) + '/' +
+                FDW_DELETE_URL + str(utils.SERVER_GROUP) + '/' +
                 str(server_id) + '/' +
                 str(db_id) + '/' + str(fdw_id),
                 follow_redirects=True)
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..1e2ce55
--- /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 runTest(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..eb6fb5a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_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 pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
+from pgadmin.browser.server_groups.servers.databases.extensions.tests import\
+    utils as extension_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+    utils as schema_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+    utils as database_utils
+from pgadmin.browser.server_groups.servers.tests import utils as server_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.\
+    tests import utils as fdw_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.\
+    foreign_servers.tests import utils as fsrv_utils
+from . import utils as foreign_table_utils
+
+
+class ForeignTableAddTestCase(BaseTestGenerator):
+    """ This class will add new foreign table under schema node. """
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fetch table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    @classmethod
+    def setUpClass(cls):
+        """
+         This function perform the following tasks:
+         1. Add and connect to the test server(s)
+         2. Add database(s) connected to server(s)
+         3. Add schemas to connected database(s)
+         4. Add extension(s) to schema(s)
+         5. Add foreign data wrapper(s) to extension(s)
+         6. Add foreign server(s) to foreign data wrapper(s)
+
+        :return: None
+        """
+
+        # Add the server
+        server_utils.add_server(cls.tester)
+
+        # Connect to servers
+        cls.server_connect_response, cls.server_group, cls.server_ids = \
+            server_utils.connect_server(cls.tester)
+
+        if len(cls.server_connect_response) == 0:
+            raise Exception("No Server(s) connected to add the database!!!")
+
+        # Add databases to connected servers
+        database_utils.add_database(cls.tester, cls.server_connect_response,
+                                    cls.server_ids)
+
+        # Add schema(s) under connected database(s)
+        schema_utils.add_schemas(cls.tester)
+
+        # Add extension(s) to schema(s)
+        extension_utils.add_extensions(cls.tester)
+
+        # Add foreign data wrapper(s) to extension(s)
+        fdw_utils.add_fdw(cls.tester)
+
+        # Add foreign server(s) to foreign data wrapper
+        fsrv_utils.add_fsrv(cls.tester)
+
+    def runTest(self):
+        """ This function will add foreign table under schema node. """
+
+        foreign_table_utils.add_foreign_tables(self.tester)
+
+    @classmethod
+    def tearDownClass(cls):
+        """
+        This function deletes the added foreign server(s),
+        foreign data wrapper(s), extension(s), schema(s), database(s),
+        server(s) and parent id file
+
+        :return: None
+        """
+
+        foreign_table_utils.delete_foreign_table(cls.tester)
+        fsrv_utils.delete_fsrv(cls.tester)
+        fdw_utils.delete_fdw(cls.tester)
+        extension_utils.delete_extension(cls.tester)
+        schema_utils.delete_schema(cls.tester)
+        database_utils.delete_database(cls.tester)
+        server_utils.delete_server(cls.tester)
+        utils.delete_parent_id_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..cc2e020
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_delete.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 pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils as utils
+from regression.test_setup import advanced_config_data
+from pgadmin.browser.server_groups.servers.databases.extensions.tests import \
+    utils as extension_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+    utils as schema_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+    utils as database_utils
+from pgadmin.browser.server_groups.servers.tests import utils as server_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.\
+    tests import utils as fdw_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.\
+    foreign_servers.tests import utils as fsrv_utils
+from . import utils as foreign_table_utils
+
+
+class ForeignTableDeleteTestCase(BaseTestGenerator):
+    """ This class will delete added foreign table under schema node. """
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fetch table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    @classmethod
+    def setUpClass(cls):
+        """
+         This function perform the following tasks:
+         1. Add and connect to the test server(s)
+         2. Add database(s) connected to server(s)
+         3. Add schemas to connected database(s)
+         4. Add extension(s) to schema(s)
+         5. Add foreign data wrapper(s) to extension(s)
+         6. Add foreign server(s) to foreign data wrapper(s)
+         7. Add foreign table(s) to foreign server(s)
+
+        :return: None
+        """
+
+        # Add the server
+        server_utils.add_server(cls.tester)
+
+        # Connect to servers
+        cls.server_connect_response, cls.server_group, cls.server_ids = \
+            server_utils.connect_server(cls.tester)
+
+        if len(cls.server_connect_response) == 0:
+            raise Exception("No Server(s) connected to add the database!!!")
+
+        # Add databases to connected servers
+        database_utils.add_database(cls.tester, cls.server_connect_response,
+                                    cls.server_ids)
+
+        # Add schema(s) under connected database(s)
+        schema_utils.add_schemas(cls.tester)
+
+        # Add extension(s) to schema(s)
+        extension_utils.add_extensions(cls.tester)
+
+        # Add foreign data wrapper(s) to extension(s)
+        fdw_utils.add_fdw(cls.tester)
+
+        # Add foreign server(s) to foreign data wrapper
+        fsrv_utils.add_fsrv(cls.tester)
+
+        # Add foreign table(s) to foreign server
+        foreign_table_utils.add_foreign_tables(cls.tester)
+
+    def runTest(self):
+        """ This function will delete added foreign table under schema node. """
+
+        delete_respdata = foreign_table_utils.delete_foreign_table(self.tester)
+        self.assertTrue(delete_respdata['success'], 1)
+
+    @classmethod
+    def tearDownClass(cls):
+        """
+        This function deletes the added foreign server(s) ,
+        foreign data wrapper(s), extension(s), schema(s), database(s), server(s)
+        and parent id file
+
+        :return: None
+        """
+
+        fsrv_utils.delete_fsrv(cls.tester)
+        fdw_utils.delete_fdw(cls.tester)
+        extension_utils.delete_extension(cls.tester)
+        schema_utils.delete_schema(cls.tester)
+        database_utils.delete_database(cls.tester)
+        server_utils.delete_server(cls.tester)
+        utils.delete_parent_id_file()
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..4cf73c6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_get.py
@@ -0,0 +1,119 @@
+# #################################################################
+#
+# 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
+from regression import test_utils as utils
+from pgadmin.browser.server_groups.servers.databases.extensions.tests import \
+    utils as extension_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+    utils as schema_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+    utils as database_utils
+from pgadmin.browser.server_groups.servers.tests import utils as server_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers. \
+    tests import utils as fdw_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers. \
+    foreign_servers.tests import utils as fsrv_utils
+from . import utils as foreign_table_utils
+
+
+class ForeignTableGetTestCase(BaseTestGenerator):
+    """ This class will fetch new foreign table under schema node. """
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fetch table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    @classmethod
+    def setUpClass(cls):
+        """
+         This function perform the following tasks:
+         1. Add and connect to the test server(s)
+         2. Add database(s) connected to server(s)
+         3. Add schemas to connected database(s)
+         4. Add extension(s) to schema(s)
+         5. Add foreign data wrapper(s) to extension(s)
+         6. Add foreign server(s) to foreign data wrapper(s)
+         7. Add foreign table(s) to foreign server(s)
+
+        :return: None
+        """
+
+        # Add the server
+        server_utils.add_server(cls.tester)
+
+        # Connect to servers
+        cls.server_connect_response, cls.server_group, cls.server_ids = \
+            server_utils.connect_server(cls.tester)
+
+        if len(cls.server_connect_response) == 0:
+            raise Exception("No Server(s) connected to add the database!!!")
+
+        # Add databases to connected servers
+        database_utils.add_database(cls.tester, cls.server_connect_response,
+                                    cls.server_ids)
+
+        # Add schema(s) under connected database(s)
+        schema_utils.add_schemas(cls.tester)
+
+        # Add extension(s) to schema(s)
+        extension_utils.add_extensions(cls.tester)
+
+        # Add foreign data wrapper(s) to extension(s)
+        fdw_utils.add_fdw(cls.tester)
+
+        # Add foreign server(s) to foreign data wrapper
+        fsrv_utils.add_fsrv(cls.tester)
+
+        # Add foreign table(s) to foreign server
+        foreign_table_utils.add_foreign_tables(cls.tester)
+
+    def runTest(self):
+        """ This function will fetch added foreign table under schema node. """
+
+        all_id = utils.get_ids()
+        server_ids = all_id["sid"]
+        db_ids_dict = all_id["did"][0]
+        schema_ids_dict = all_id["scid"][0]
+        foreign_table_dict = all_id["foid"][0]
+
+        for server_id in server_ids:
+            db_id = db_ids_dict[int(server_id)]
+            schema_id = schema_ids_dict[int(server_id)][0]
+            foreign_table_id = foreign_table_dict[server_id]
+
+            get_response = foreign_table_utils.verify_foreign_table(
+                self.tester,
+                utils.SERVER_GROUP,
+                server_id,
+                db_id,
+                schema_id,
+                foreign_table_id)
+
+            self.assertEquals(get_response.status_code, 200)
+
+    @classmethod
+    def tearDownClass(cls):
+        """
+        This function deletes the added foreign server(s) ,
+        foreign data wrapper(s), extension(s), schema(s), database(s),
+        server(s) and parent id file
+
+        :return: None
+        """
+
+        foreign_table_utils.delete_foreign_table(cls.tester)
+        fsrv_utils.delete_fsrv(cls.tester)
+        fdw_utils.delete_fdw(cls.tester)
+        extension_utils.delete_extension(cls.tester)
+        schema_utils.delete_schema(cls.tester)
+        database_utils.delete_database(cls.tester)
+        server_utils.delete_server(cls.tester)
+        utils.delete_parent_id_file()
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..74d2133
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/test_foreign_table_put.py
@@ -0,0 +1,138 @@
+# #################################################################
+#
+# 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
+from regression import test_utils as utils
+from regression.test_setup import advanced_config_data
+from pgadmin.browser.server_groups.servers.databases.extensions.tests import \
+    utils as extension_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
+    utils as schema_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+    utils as database_utils
+from pgadmin.browser.server_groups.servers.tests import utils as server_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.\
+    tests import utils as fdw_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers.\
+    foreign_servers.tests import utils as fsrv_utils
+from . import utils as foreign_table_utils
+import json
+
+
+class ForeignTablePutTestCase(BaseTestGenerator):
+    """ This class will update added foreign table under schema node. """
+
+    scenarios = [
+        # Fetching default URL for table node.
+        ('Fetch table Node URL', dict(url='/browser/foreign-table/obj/'))
+    ]
+
+    @classmethod
+    def setUpClass(cls):
+        """
+         This function perform the following tasks:
+         1. Add and connect to the test server(s)
+         2. Add database(s) connected to server(s)
+         3. Add schemas to connected database(s)
+         4. Add extension(s) to schema(s)
+         5. Add foreign data wrapper(s) to extension(s)
+         6. Add foreign server(s) to foreign data wrapper(s)
+         7. Add foreign table(s) to foreign server(s)
+
+        :return: None
+        """
+
+        # Add the server
+        server_utils.add_server(cls.tester)
+
+        # Connect to servers
+        cls.server_connect_response, cls.server_group, cls.server_ids = \
+            server_utils.connect_server(cls.tester)
+
+        if len(cls.server_connect_response) == 0:
+            raise Exception("No Server(s) connected to add the database!!!")
+
+        # Add databases to connected servers
+        database_utils.add_database(cls.tester, cls.server_connect_response,
+                                    cls.server_ids)
+
+        # Add schema(s) under connected database(s)
+        schema_utils.add_schemas(cls.tester)
+
+        # Add extension(s) to schema(s)
+        extension_utils.add_extensions(cls.tester)
+
+        # Add foreign data wrapper(s) to extension(s)
+        fdw_utils.add_fdw(cls.tester)
+
+        # Add foreign server(s) to foreign data wrapper
+        fsrv_utils.add_fsrv(cls.tester)
+
+        # Add foreign table(s) to foreign server
+        foreign_table_utils.add_foreign_tables(cls.tester)
+
+    def runTest(self):
+        """ This function will update added foreign table under schema node. """
+
+        all_id = utils.get_ids()
+        server_ids = all_id["sid"]
+        db_ids_dict = all_id["did"][0]
+        schema_ids_dict = all_id["scid"][0]
+        foreign_table_dict = all_id["foid"][0]
+
+        for server_id in server_ids:
+            db_id = db_ids_dict[int(server_id)]
+            schema_id = schema_ids_dict[int(server_id)][0]
+            foreign_table_id = foreign_table_dict[server_id]
+
+            get_response = foreign_table_utils.verify_foreign_table(
+                self.tester,
+                utils.SERVER_GROUP,
+                server_id,
+                db_id,
+                schema_id,
+                foreign_table_id)
+            if get_response.status_code == 200:
+                data = \
+                    {
+                        "description":
+                            advanced_config_data['foreign_table_update_data']
+                            ['comment'],
+                        "id": foreign_table_id,
+                    }
+
+                put_response = self.tester.put(
+                    self.url + str(utils.SERVER_GROUP) + '/' +
+                    str(server_id) + '/' +
+                    str(db_id) + '/' +
+                    str(schema_id) + '/' +
+                    str(foreign_table_id),
+                    data=json.dumps(data),
+                    follow_redirects=True)
+
+                self.assertEquals(put_response.status_code, 200)
+
+    @classmethod
+    def tearDownClass(cls):
+        """
+        This function deletes the added foreign table(s), foreign server(s) ,
+        foreign data wrapper(s), extension(s), schema(s), database(s),
+        server(s) and parent id file
+
+        :return: None
+        """
+
+        foreign_table_utils.delete_foreign_table(cls.tester)
+        fsrv_utils.delete_fsrv(cls.tester)
+        fdw_utils.delete_fdw(cls.tester)
+        extension_utils.delete_extension(cls.tester)
+        schema_utils.delete_schema(cls.tester)
+        database_utils.delete_database(cls.tester)
+        server_utils.delete_server(cls.tester)
+        utils.delete_parent_id_file()
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/utils.py
new file mode 100644
index 0000000..33cc83a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/utils.py
@@ -0,0 +1,177 @@
+# #################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2016, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+# ##################################################################
+
+
+import os
+import pickle
+import json
+from regression.test_setup import advanced_config_data, pickle_path
+from regression import test_utils as utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+    utils as database_utils
+from pgadmin.browser.server_groups.servers.tests import utils as server_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers. \
+    tests import utils as fdw_utils
+from pgadmin.browser.server_groups.servers.databases.foreign_data_wrappers. \
+    foreign_servers.tests import utils as fsrv_utils
+import uuid
+
+FOREIGN_TABLE_URL = '/browser/foreign-table/obj/'
+FOREIGN_TABLE_DELETE_URL = '/browser/foreign-table/delete/'
+
+
+def get_foreign_table_config_data(schema_name, fsrv_name, server_connect_data):
+    # This function will read the foreign table data from config file.
+
+    adv_config_data = None
+    db_user = server_connect_data['data']['user']['name']
+
+    # Get the config data of appropriate db user
+    for config_test_data in advanced_config_data['foreign_table_credentials']:
+        if db_user == config_test_data['owner']:
+            adv_config_data = config_test_data
+
+    data = {
+        "acl": adv_config_data['acl'],
+        "basensp": schema_name,
+        "columns": adv_config_data['column'],
+        "constraints": adv_config_data['constraints'],
+        "ftoptions": adv_config_data['options'],
+        "ftsrvname": fsrv_name,
+        "name": "ft_{0}".format(str(uuid.uuid4())[1:4]),
+        "owner": adv_config_data['owner'],
+        "relacl": adv_config_data['rel_acl'],
+        "seclabels": adv_config_data['sec_lable'],
+        "stracl": adv_config_data['str_acl']
+    }
+    return data
+
+
+def add_foreign_tables(tester):
+    # This function will add foreign table(s) under foreign server node.
+
+    all_id = utils.get_ids()
+    server_ids = all_id["sid"]
+    db_ids_dict = all_id["did"][0]
+    schema_info_dict = all_id["scid"][0]
+    fdw_ids_dict = all_id["fid"][0]
+    fsrv_info_dict = all_id["fsid"][0]
+
+    for server_id in server_ids:
+        db_id = db_ids_dict[int(server_id)]
+        db_con = database_utils.verify_database(tester,
+                                                utils.SERVER_GROUP,
+                                                server_id, db_id)
+
+        if db_con['data']['connected']:
+            server_connect_response = server_utils.verify_server(
+                tester, utils.SERVER_GROUP, server_id)
+
+            fdw_id = fdw_ids_dict[server_id]
+            fdw_response = fdw_utils.verify_fdws(tester,
+                                                 utils.SERVER_GROUP,
+                                                 server_id, db_id,
+                                                 fdw_id)
+
+            if fdw_response.status_code == 200:
+                fsrv_id = fsrv_info_dict[server_id][0]
+                fsrv_response = fsrv_utils.verify_fsrv(tester,
+                                                       utils.SERVER_GROUP,
+                                                       server_id, db_id,
+                                                       fdw_id, fsrv_id)
+                if fsrv_response.status_code == 200:
+                    schema_name = schema_info_dict[int(server_id)][1]
+                    schema_id = schema_info_dict[int(server_id)][0]
+                    fsrv_name = fsrv_info_dict[server_id][1]
+                    data = get_foreign_table_config_data(schema_name,
+                                                         fsrv_name,
+                                                         server_connect_response)
+                    response = tester.post(
+                        FOREIGN_TABLE_URL + str(utils.SERVER_GROUP) + '/' +
+                        str(server_id) + '/' + str(db_id) +
+                        '/' + str(schema_id) + '/',
+                        data=json.dumps(data),
+                        content_type='html/json')
+                    assert response.status_code == 200
+                    response_data = json.loads(response.data.decode('utf-8'))
+                    write_foreign_table_info(response_data, server_id)
+
+
+def write_foreign_table_info(response_data, server_id):
+    """
+    This function writes the foreign_table_id into parent_id.pkl
+
+    :param response_data: foreign table add response data
+    :type response_data: dict
+    :param server_id: server id
+    :type server_id: str
+    :return: None
+    """
+
+    foreign_table_id = response_data['node']['_id']
+    pickle_id_dict = utils.get_pickle_id_dict()
+    if os.path.isfile(pickle_path):
+        existing_server_id = open(pickle_path, 'rb')
+        tol_server_id = pickle.load(existing_server_id)
+        pickle_id_dict = tol_server_id
+    if 'foid' in pickle_id_dict:
+        if pickle_id_dict['foid']:
+            # Add the foreign_table_id as value in dict
+            pickle_id_dict["foid"][0].update({server_id: foreign_table_id})
+        else:
+            # Create new dict with server_id and foreign_table_id
+            pickle_id_dict["foid"].append({server_id: foreign_table_id})
+    foreign_table_output = open(pickle_path, 'wb')
+    pickle.dump(pickle_id_dict, foreign_table_output)
+    foreign_table_output.close()
+
+
+def verify_foreign_table(tester, server_group, server_id, db_id, schema_id,
+                         foreign_table_id):
+    # This function will fetch added foreign table.
+
+    response = tester.get(FOREIGN_TABLE_URL + str(server_group) + '/' +
+                          str(server_id) + '/' + str(db_id) +
+                          '/' + str(schema_id) + '/' +
+                          str(foreign_table_id), content_type='html/json')
+    return response
+
+
+def delete_foreign_table(tester):
+    # This function will delete added foreign table.
+
+    all_id = utils.get_ids()
+    server_ids = all_id["sid"]
+    db_ids_dict = all_id["did"][0]
+    schema_ids_dict = all_id["scid"][0]
+    foreign_table_dict = all_id["foid"][0]
+
+    for server_id in server_ids:
+        db_id = db_ids_dict[int(server_id)]
+        schema_id = schema_ids_dict[int(server_id)][0]
+        foreign_table_id = foreign_table_dict[server_id]
+
+        get_response = verify_foreign_table(tester,
+                                            utils.SERVER_GROUP,
+                                            server_id,
+                                            db_id,
+                                            schema_id,
+                                            foreign_table_id)
+        if get_response.status_code == 200:
+            delete_response = tester.delete(
+                FOREIGN_TABLE_DELETE_URL + str(utils.SERVER_GROUP) +
+                '/' + str(
+                    server_id) + '/' +
+                str(db_id) + '/' +
+                str(schema_id) + '/' +
+                str(foreign_table_id),
+                follow_redirects=True)
+
+            delete_respdata = json.loads(delete_response.data.decode())
+            return delete_respdata
diff --git a/web/regression/test_advanced_config.json.in b/web/regression/test_advanced_config.json.in
index b339c92..3beef22 100644
--- a/web/regression/test_advanced_config.json.in
+++ b/web/regression/test_advanced_config.json.in
@@ -488,7 +488,204 @@
     "sequnce_update_data":
   {
     "comment": "This is sequence update comment"
-  }
+  },
+
+    "foreign_table_credentials":
+  [{
+    "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
+          }
+        ]
+      }
+    ],
+    "schema_name": "schema_name",
+    "column":
+    [
+      {
+        "attname":"enme",
+        "datatype":"text",
+        "attnotnull":true,
+        "collname":"pg_catalog.\"default\"",
+        "is_tlength":false,
+        "is_precision":false
+      }
+    ],
+    "constraints": [],
+    "options": [],
+    "fsrv_name":  "foreign_server_name",
+    "name": "test_ft",
+    "owner":  "postgres",
+    "rel_acl":  [],
+    "sec_lable": [],
+    "str_acl": []
+  }],
+
+    "foreign_table_update_data":
+  {
+    "comment": "This is foreign table update comment"
+  },
+
+    "table_credentials":[
+  {
+    "constraint": [],
+    "col_inherit": "[]",
+    "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":[]
+      }
+    ],
+    "has_constraint": [],
+    "fillfactor": "11",
+    "has_FK": [],
+    "has_toast_tbl": true,
+    "like_constraint":  true,
+    "like_default_value": true,
+    "like_relation": "pg_catalog.pg_tables",
+    "name": "emp",
+    "PK": [],
+    "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
+          }
+        ]
+      }
+    ],
+    "has_oid": true,
+    "owner":  "postgres",
+    "schema": "test_schema",
+    "sec_acl":  [],
+    "tbscp": "pg_default",
+    "unique_constraint": [],
+    "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"
+      }
+    ],
+    "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"
+      }
+    ]
+  }],
+  "table_update_data":
+  {
+    "comment": "This is table update comment"
+  },
+
+  "FTS_parser_credentials":
+  [{
+  "name": "fts_parser",
+  "presend": "btfloat4sortsupport",
+  "headline": "prsd_headline",
+  "lextype": "dsynonym_init",
+  "start": "int4_accum",
+  "token": "btbeginscan",
+  "schema_name": "schema_name"
+  }],
+
 
 
  }
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
index e078eaa..9b61f0e 100644
--- a/web/regression/test_utils.py
+++ b/web/regression/test_utils.py
@@ -32,7 +32,8 @@ def get_pickle_id_dict():
         "fid": [],  # FDW
         "fsid": [],  # FRS
         "umid": [],  # user_mapping
-        "seid": []  # sequence
+        "seid": [],  # sequence
+        "foid": []  # foreign_table
     }
     return pickle_id_dict
 
-- 
Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to