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