diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py new file mode 100644 index 0000000..ab18366 --- /dev/null +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -0,0 +1,147 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2018, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## +import time +import os + +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from regression.feature_utils.base_feature_test import BaseFeatureTest +from regression.python_test_utils import test_utils + + +class PGUtilitiesBackupFeatureTest(BaseFeatureTest): + """ This class test PG utilities - Backup and Restore test scenarios """ + + scenarios = [ + ("Test for PG utilities - Backup and Restore", dict()) + ] + + def before(self): + if self.server['default_binary_paths'] is None: + self.skipTest( + "default_binary_paths is not set for the server {0}".format( + self.server['name'] + ) + ) + connection = test_utils.get_db_connection( + self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port'], + self.server['sslmode'] + ) + test_utils.drop_database(connection, "pg_utility_test_db") + + test_utils.create_database(self.server, "pg_utility_test_db") + self.page.add_server(self.server) + + self.wait = WebDriverWait(self.page.driver, 20) + + def runTest(self): + self.page.toggle_open_server(self.server['name']) + self.page.toggle_open_tree_item('Databases') + self.page.toggle_open_tree_item('pg_utility_test_db') + self.driver.find_element_by_link_text("Tools").click() + + self.page.find_by_partial_link_text("Backup...").click() + + self.wait.until(EC.element_to_be_clickable( + (By.CSS_SELECTOR, ".browse_file_input"))) + + self.page.find_by_css_selector( + ".ajs-dialog.pg-el-container .ajs-maximize" + ).click() + + self.wait.until(EC.element_to_be_clickable( + (By.CSS_SELECTOR, ".browse_file_input"))).click() + + self.page.fill_input_by_field_name("file", "test_backup") + + self.page.find_by_xpath("//button[contains(@class,'fa-save') " + "and contains(.,'Backup')]").click() + + self.page.wait_for_element_to_disappear( + lambda driver: driver.find_element_by_css_selector(".ajs-modal") + ) + + status = self.page.find_by_css_selector( + ".pg-bg-bgprocess .bg-success").text + + self.assertEquals(status, "Successfully completed.") + + self.page.find_by_css_selector( + ".pg-bg-bgprocess .pg-bg-click > span").click() + command = self.page.find_by_css_selector("p.bg-detailed-desc").text + + self.assertIn(self.server['name'], str(command)) + self.assertIn("from database 'pg_utility_test_db'", str(command)) + self.assertIn("test_backup", str(command)) + self.assertIn("pg_dump", str(command)) + + backup_file = None + if command: + backup_file = command[int(command.find('--file')) + + 8:int(command.find('--host')) - 2] + + self.page.find_by_xpath("//div[contains(@class,'wcFloatingFocus')" + "]//div[contains(@class,'fa-close')]").click() + + self.driver.find_element_by_link_text("Tools").click() + self.page.find_by_partial_link_text("Restore...").click() + + self.wait.until(EC.presence_of_element_located( + ( + By.XPATH, + "//label[contains(string(), 'Filename')]" + ) + )) + + self.wait.until(EC.element_to_be_clickable( + (By.CSS_SELECTOR, ".browse_file_input"))).click() + + self.page.fill_input_by_field_name("file", "test_backup") + self.page.find_by_xpath("//button[contains(@class,'fa-upload')" + " and contains(.,'Restore')]").click() + + self.page.wait_for_element_to_disappear( + lambda driver: driver.find_element_by_css_selector(".ajs-modal") + ) + + status = self.page.find_by_css_selector( + ".pg-bg-bgprocess .bg-success").text + + self.assertEquals(status, "Successfully completed.") + self.page.find_by_css_selector( + ".pg-bg-bgprocess .pg-bg-click > span").click() + command = self.page.find_by_css_selector("p.bg-detailed-desc").text + + self.assertIn(self.server['name'], str(command)) + self.assertIn("test_backup", str(command)) + self.assertIn("pg_restore", str(command)) + + self.page.find_by_xpath("//div[contains(@class,'wcFloatingFocus')]" + "//div[contains(@class,'fa-close')]").click() + + if backup_file is not None: + if os.path.isfile(backup_file): + os.remove(backup_file) + + def after(self): + self.page.remove_server(self.server) + connection = test_utils.get_db_connection( + self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port'], + self.server['sslmode'] + ) + test_utils.drop_database(connection, "pg_utility_test_db") diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py new file mode 100644 index 0000000..f793386 --- /dev/null +++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py @@ -0,0 +1,109 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2018, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## +import time +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from regression.feature_utils.base_feature_test import BaseFeatureTest +from regression.python_test_utils import test_utils + + +class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest): + """ This class test PG utilities test scenarios """ + + scenarios = [ + ("Test for PG maintenance: database", dict( + database_name='pg_maintenance', + table_name='pg_maintenance_table', + test_level='database' + )), + ("Test for PG maintenance: table", dict( + database_name='pg_maintenance', + table_name='pg_maintenance_table', + test_level='table' + )), + ] + + def before(self): + if self.server['default_binary_paths'] is None: + self.skipTest( + "default_binary_paths is not set for the server {0}".format( + self.server['name'] + ) + ) + connection = test_utils.get_db_connection( + self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port'], + self.server['sslmode'] + ) + test_utils.drop_database(connection, self.database_name) + test_utils.create_database(self.server, self.database_name) + test_utils.create_table(self.server, self.database_name, + self.table_name) + self.page.add_server(self.server) + self.wait = WebDriverWait(self.page.driver, 20) + + def runTest(self): + self._open_maintenance_dialogue() + self.page.find_by_css_selector( + "button.fa-save.btn-primary.pg-alertify-button"). \ + click() + self.page.wait_for_element_to_disappear( + lambda driver: driver.find_element_by_css_selector(".ajs-modal") + ) + self._verify_command() + + def _open_maintenance_dialogue(self): + self.page.toggle_open_server(self.server['name']) + self.page.toggle_open_tree_item('Databases') + self.page.toggle_open_tree_item(self.database_name) + if self.test_level == 'table': + self.page.toggle_open_tree_item('Schemas') + self.page.toggle_open_tree_item('public') + self.page.toggle_open_tree_item('Tables') + self.page.select_tree_item(self.table_name) + + self.driver.find_element_by_link_text("Tools").click() + self.page.find_by_partial_link_text("Maintenance...").click() + time.sleep(0.5) + + def _verify_command(self): + status = self.page.find_by_css_selector( + ".pg-bg-bgprocess .bg-success").text + self.assertEquals(status, "Successfully completed.") + self.page.find_by_css_selector( + ".pg-bg-bgprocess .pg-bg-click > span").click() + command = self.page.find_by_css_selector("p.bg-detailed-desc").text + if self.test_level == 'database': + self.assertEquals(command, "VACUUM " + "(VERBOSE)\nRunning Query:" + "\nVACUUM VERBOSE;") + else: + self.assertEquals(command, "VACUUM " + "(VERBOSE)\nRunning Query:" + "\nVACUUM VERBOSE" + " public." + self.table_name + ";") + + self.page.find_by_css_selector( + "div.wcFloatingFocus div.fa-close").click() + + def after(self): + self.page.remove_server(self.server) + connection = test_utils.get_db_connection( + self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port'], + self.server['sslmode'] + ) + test_utils.drop_database(connection, self.database_name) diff --git a/web/regression/runtests.py b/web/regression/runtests.py index 26b25c7..4cd4553 100644 --- a/web/regression/runtests.py +++ b/web/regression/runtests.py @@ -216,7 +216,7 @@ def get_test_modules(arguments): if 'headless_chrome' in test_setup.config_data: if test_setup.config_data['headless_chrome']: options.add_argument("--headless") - options.add_argument("--window-size=1280x1024") + options.add_argument("--window-size=1280,1024") driver = webdriver.Chrome(chrome_options=options) app_starter = AppStarter(driver, config)