diff --git a/web/pgadmin/help/__init__.py b/web/pgadmin/help/__init__.py index ddfb368..016793d 100644 --- a/web/pgadmin/help/__init__.py +++ b/web/pgadmin/help/__init__.py @@ -15,14 +15,13 @@ from flask_babel import gettext from pgadmin.utils import PgAdminModule from pgadmin.utils.menu import MenuItem, Panel from pgadmin.utils.preferences import Preferences - import config class HelpModule(PgAdminModule): def get_own_menuitems(self): - """Return a (set) of dicts of help menu items, with name, priority, URL, - target and onclick code.""" + """Return a (set) of dicts of help menu items, with name, priority, + URL, target and onclick code.""" return {'help_items': [ MenuItem(name='mnu_online_help', label=gettext('Online Help'), @@ -75,7 +74,9 @@ class HelpModule(PgAdminModule): 'https://www.postgresql.org/docs/$VERSION$/static/', category_label=gettext('Help'), help_str=gettext( - 'Path to the PostgreSQL documentation. $VERSION$ will be replaced with the major.minor version number.') + 'Path to the PostgreSQL documentation. $VERSION$ will be ' + 'replaced with the major.minor version number.' + ) ) self.edbas_help_path = self.help_preference.register( @@ -84,7 +85,9 @@ class HelpModule(PgAdminModule): 'https://www.enterprisedb.com/docs/en/$VERSION$/pg/', category_label=gettext('Help'), help_str=gettext( - 'Path to the EDB Advanced Server documentation. $VERSION$ will be replaced with the major.minor version number.') + 'Path to the EDB Advanced Server documentation. $VERSION$ ' + 'will be replaced with the major.minor version number.' + ) ) def get_exposed_url_endpoints(self): @@ -95,5 +98,8 @@ class HelpModule(PgAdminModule): # Initialise the module -blueprint = HelpModule(MODULE_NAME, __name__, static_url_path='/help', - static_folder=config.HELP_PATH) +blueprint = HelpModule( + MODULE_NAME, __name__, + static_url_path='/help', + static_folder=config.HELP_PATH +) diff --git a/web/pgadmin/model/__init__.py b/web/pgadmin/model/__init__.py index 655d3f1..674f945 100644 --- a/web/pgadmin/model/__init__.py +++ b/web/pgadmin/model/__init__.py @@ -120,24 +120,28 @@ class Server(db.Model): ssl_mode = db.Column( db.String(16), db.CheckConstraint( - "ssl_mode IN ('allow', 'prefer', 'require', 'disable', 'verify-ca', 'verify-full')" + "ssl_mode IN ('allow', 'prefer', 'require', 'disable', " + "'verify-ca', 'verify-full')" ), nullable=False) comment = db.Column(db.String(1024), nullable=True) discovery_id = db.Column(db.String(128), nullable=True) - servers = db.relationship('ServerGroup', - backref=db.backref('server', cascade="all, delete-orphan"), - lazy='joined') + servers = db.relationship( + 'ServerGroup', + backref=db.backref('server', cascade="all, delete-orphan"), + lazy='joined' + ) db_res = db.Column(db.Text(), nullable=True) passfile = db.Column(db.Text(), nullable=True) sslcert = db.Column(db.Text(), nullable=True) sslkey = db.Column(db.Text(), nullable=True) sslrootcert = db.Column(db.Text(), nullable=True) sslcrl = db.Column(db.Text(), nullable=True) - sslcompression =db.Column(db.Integer(), - db.CheckConstraint( - 'sslcompression >= 0 AND sslcompression <= 1' - ), nullable=False) + sslcompression = db.Column( + db.Integer(), + db.CheckConstraint('sslcompression >= 0 AND sslcompression <= 1'), + nullable=False + ) bgcolor = db.Column(db.Text(10), nullable=True) fgcolor = db.Column(db.Text(10), nullable=True) @@ -193,15 +197,25 @@ class DebuggerFunctionArguments(db.Model): schema_id = db.Column(db.Integer(), nullable=False, primary_key=True) function_id = db.Column(db.Integer(), nullable=False, primary_key=True) arg_id = db.Column(db.Integer(), nullable=False, primary_key=True) - is_null = db.Column(db.Integer(), - db.CheckConstraint('is_null >= 0 AND is_null <= 1'), - nullable=False) - is_expression = db.Column(db.Integer(), - db.CheckConstraint('is_expression >= 0 AND is_expression <= 1'), - nullable=False) - use_default = db.Column(db.Integer(), - db.CheckConstraint('use_default >= 0 AND use_default <= 1'), - nullable=False) + is_null = db.Column( + db.Integer(), + db.CheckConstraint('is_null >= 0 AND is_null <= 1'), + nullable=False + ) + is_expression = db.Column( + db.Integer(), + db.CheckConstraint( + 'is_expression >= 0 AND is_expression <= 1' + ), + nullable=False + ) + use_default = db.Column( + db.Integer(), + db.CheckConstraint( + 'use_default >= 0 AND use_default <= 1' + ), + nullable=False + ) value = db.Column(db.String(), nullable=True) diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py index 3f73376..f1f571c 100644 --- a/web/pgadmin/preferences/__init__.py +++ b/web/pgadmin/preferences/__init__.py @@ -60,7 +60,11 @@ class PreferencesModule(PgAdminModule): Returns: list: a list of url endpoints exposed to the client. """ - return ['preferences.index', 'preferences.get_by_name', 'preferences.get_all'] + return [ + 'preferences.index', + 'preferences.get_by_name', + 'preferences.get_all' + ] blueprint = PreferencesModule(MODULE_NAME, __name__) @@ -70,9 +74,11 @@ blueprint = PreferencesModule(MODULE_NAME, __name__) @login_required def script(): """render the required javascript""" - return Response(response=render_template("preferences/preferences.js", _=gettext), - status=200, - mimetype="application/javascript") + return Response( + response=render_template("preferences/preferences.js", _=gettext), + status=200, + mimetype="application/javascript" + ) @blueprint.route("/", methods=["GET"], endpoint='index') @@ -171,7 +177,8 @@ def save(pid): """ data = request.form if request.form else json.loads(request.data.decode()) - res, msg = Preferences.save(data['mid'], data['category_id'], data['id'], data['value']) + res, msg = Preferences.save( + data['mid'], data['category_id'], data['id'], data['value']) if not res: return internal_server_error(errormsg=msg) @@ -195,4 +202,3 @@ def save(pid): response.set_cookie("PGADMIN_LANGUAGE", language) return response - diff --git a/web/pgadmin/redirects/__init__.py b/web/pgadmin/redirects/__init__.py index 2080380..7f0c7c6 100644 --- a/web/pgadmin/redirects/__init__.py +++ b/web/pgadmin/redirects/__init__.py @@ -14,8 +14,9 @@ from pgadmin import PgAdminModule MODULE_NAME = 'redirects' -blueprint = PgAdminModule(MODULE_NAME, __name__, - url_prefix='/') +blueprint = PgAdminModule( + MODULE_NAME, __name__, url_prefix='/' +) @blueprint.route('/') diff --git a/web/pgadmin/settings/__init__.py b/web/pgadmin/settings/__init__.py index f62e0d9..a2a84c6 100644 --- a/web/pgadmin/settings/__init__.py +++ b/web/pgadmin/settings/__init__.py @@ -35,12 +35,14 @@ class SettingsModule(PgAdminModule): def get_own_menuitems(self): return { 'file_items': [ - MenuItem(name='mnu_resetlayout', - priority=999, - module="pgAdmin.Settings", - callback='show', - icon='fa fa-retweet', - label=gettext('Reset Layout')) + MenuItem( + name='mnu_resetlayout', + priority=999, + module="pgAdmin.Settings", + callback='show', + icon='fa fa-retweet', + label=gettext('Reset Layout') + ) ] } @@ -49,7 +51,9 @@ class SettingsModule(PgAdminModule): Returns: list: a list of url endpoints exposed to the client. """ - return ['settings.store', 'settings.store_bulk', 'settings.reset_layout'] + return [ + 'settings.store', 'settings.store_bulk', 'settings.reset_layout' + ] blueprint = SettingsModule(MODULE_NAME, __name__) @@ -66,7 +70,8 @@ def store_setting(setting, value): def get_setting(setting, default=None): """Retrieve a configuration setting for the current user, or return the default value specified by the caller.""" - data = Setting.query.filter_by(user_id=current_user.id, setting=setting).first() + data = Setting.query.filter_by( + user_id=current_user.id, setting=setting).first() if not data or data.value is None: return default @@ -102,7 +107,8 @@ def store(setting=None, value=None): if request.method == 'POST': if 'count' in request.form: for x in range(int(request.form['count'])): - store_setting(request.form['setting%d' % (x + 1)], request.form['value%d' % (x + 1)]) + store_setting(request.form['setting%d' % ( + x + 1)], request.form['value%d' % (x + 1)]) else: store_setting(request.form['setting'], request.form['value']) else: diff --git a/web/pgadmin/setup/db_upgrade.py b/web/pgadmin/setup/db_upgrade.py index 4fe8c3b..a3d5d3d 100644 --- a/web/pgadmin/setup/db_upgrade.py +++ b/web/pgadmin/setup/db_upgrade.py @@ -18,8 +18,8 @@ def db_upgrade(app): with app.app_context(): flask_migrate.Migrate(app, db) migration_folder = os.path.join( - os.path.dirname(os.path.realpath(u(__file__, fs_encoding))), - os.pardir, os.pardir, - u'migrations' - ) + os.path.dirname(os.path.realpath(u(__file__, fs_encoding))), + os.pardir, os.pardir, + u'migrations' + ) flask_migrate.upgrade(migration_folder) diff --git a/web/pgadmin/setup/user_info.py b/web/pgadmin/setup/user_info.py index 49865cc..86c10b7 100644 --- a/web/pgadmin/setup/user_info.py +++ b/web/pgadmin/setup/user_info.py @@ -37,7 +37,7 @@ def user_info(): email = '' p1 = '' if os.environ['PGADMIN_SETUP_EMAIL'] and os.environ[ - 'PGADMIN_SETUP_PASSWORD']: + 'PGADMIN_SETUP_PASSWORD']: email = os.environ['PGADMIN_SETUP_EMAIL'] p1 = os.environ['PGADMIN_SETUP_PASSWORD'] else: @@ -66,7 +66,8 @@ def user_info(): print(u'Passwords do not match. Please try again.') else: print( - u'Password must be at least 6 characters. Please try again.' + u'Password must be at least 6 characters. ' + u'Please try again.' ) p1, p2 = pprompt() return email, p1 diff --git a/web/regression/feature_utils/app_starter.py b/web/regression/feature_utils/app_starter.py index 894d1f9..77b0400 100644 --- a/web/regression/feature_utils/app_starter.py +++ b/web/regression/feature_utils/app_starter.py @@ -13,6 +13,7 @@ import random import time + class AppStarter: """ Helper for starting the full pgadmin4 app and loading the page via selenium @@ -43,7 +44,8 @@ class AppStarter: self.driver.set_window_size(1280, 1024) self.driver.get( "http://" + self.app_config.DEFAULT_SERVER + ":" + - random_server_port) + random_server_port + ) def stop_app(self): """ This function stop the started app by killing process """ diff --git a/web/regression/feature_utils/base_feature_test.py b/web/regression/feature_utils/base_feature_test.py index c341e95..568fc2e 100644 --- a/web/regression/feature_utils/base_feature_test.py +++ b/web/regression/feature_utils/base_feature_test.py @@ -27,8 +27,11 @@ class BaseFeatureTest(BaseTestGenerator): self.server = deepcopy(self.server) self.server['name'] += ' Feature Tests' if app_config.SERVER_MODE: - self.skipTest("Currently, config is set to start pgadmin in server mode. " - "This test doesn't know username and password so doesn't work in server mode") + self.skipTest( + "Currently, config is set to start pgadmin in server mode. " + "This test doesn't know username and password so doesn't work " + "in server mode" + ) self.page = PgadminPage(self.driver, app_config) try: @@ -38,7 +41,7 @@ class BaseFeatureTest(BaseTestGenerator): self.page.reset_layout() self.page.wait_for_spinner_to_disappear() self.before() - except: + except Exception: self._screenshot() raise @@ -52,7 +55,8 @@ class BaseFeatureTest(BaseTestGenerator): pass def tearDown(self): - python2_failures = hasattr(self, "_resultForDoCleanups") and self.current_test_failed() + python2_failures = hasattr( + self, "_resultForDoCleanups") and self.current_test_failed() python3_failures = hasattr(self, '_outcome') and self.any_step_failed() @@ -68,7 +72,8 @@ class BaseFeatureTest(BaseTestGenerator): return False def current_test_failed(self): - all_failures = self._resultForDoCleanups.errors + self._resultForDoCleanups.failures + all_failures = self._resultForDoCleanups.errors + \ + self._resultForDoCleanups.failures for failure in all_failures: if failure[0] == self: return True @@ -76,8 +81,10 @@ class BaseFeatureTest(BaseTestGenerator): def _screenshot(self): screenshots_directory = '{0}/../screenshots'.format(self.CURRENT_PATH) - screenshots_server_directory = '{0}/{1}'.format(screenshots_directory, - self.server["name"].replace(" ", "_")) + screenshots_server_directory = '{0}/{1}'.format( + screenshots_directory, + self.server["name"].replace(" ", "_") + ) self.ensure_directory_exists(screenshots_directory) self.ensure_directory_exists(screenshots_server_directory) @@ -86,10 +93,13 @@ class BaseFeatureTest(BaseTestGenerator): python_version = sys.version.split(" ")[0] self.page.driver.save_screenshot( - '{0}/{1}-{2}-Python-{3}.png'.format(screenshots_server_directory, - self.__class__.__name__, - date, - python_version)) + '{0}/{1}-{2}-Python-{3}.png'.format( + screenshots_server_directory, + self.__class__.__name__, + date, + python_version + ) + ) def ensure_directory_exists(self, path): try: diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py index aafae5c..10ffa1d 100644 --- a/web/regression/feature_utils/pgadmin_page.py +++ b/web/regression/feature_utils/pgadmin_page.py @@ -37,14 +37,17 @@ class PgadminPage: def click_modal(self, button_text): time.sleep(0.5) - # Find active alertify dialog in case of multiple alertify dialog & click on that dialog + # Find active alertify dialog in case of multiple alertify dialog + # & click on that dialog modal_button = self.find_by_xpath( - "//div[contains(@class, 'alertify') and not(contains(@class, 'ajs-hidden'))]//button[.='%s']" + "//div[contains(@class, 'alertify') and " + "not(contains(@class, 'ajs-hidden'))]//button[.='%s']" % button_text) self.click_element(modal_button) def add_server(self, server_config): - self.find_by_xpath("//*[@class='aciTreeText' and contains(.,'Servers')]").click() + self.find_by_xpath( + "//*[@class='aciTreeText' and contains(.,'Servers')]").click() self.driver.find_element_by_link_text("Object").click() ActionChains(self.driver) \ .move_to_element(self.driver.find_element_by_link_text("Create")) \ @@ -59,7 +62,8 @@ class PgadminPage: self.fill_input_by_field_name("password", server_config['db_password']) self.find_by_xpath("//button[contains(.,'Save')]").click() - self.find_by_xpath("//*[@id='tree']//*[.='" + server_config['name'] + "']") + self.find_by_xpath( + "//*[@id='tree']//*[.='" + server_config['name'] + "']") def open_query_tool(self): self.driver.find_element_by_link_text("Tools").click() @@ -73,7 +77,6 @@ class PgadminPage: self.find_by_partial_link_text("Query Tool").click() self.click_tab('Query -') - def enable_menu_item(self, menu_item, wait_time): start_time = time.time() # wait until menu becomes enabled. @@ -91,12 +94,19 @@ class PgadminPage: def close_query_tool(self): self.driver.switch_to.default_content() - tab = self.find_by_xpath("//*[contains(@class,'wcPanelTab') and contains(.,'" + "Query" + "')]") + tab = self.find_by_xpath( + "//*[contains(@class,'wcPanelTab') and " + "contains(.,'" + "Query" + "')]") ActionChains(self.driver).context_click(tab).perform() - self.find_by_xpath("//li[contains(@class, 'context-menu-item')]/span[contains(text(), 'Remove Panel')]").click() - self.driver.switch_to.frame(self.driver.find_elements_by_tag_name("iframe")[0]) + self.find_by_xpath( + "//li[contains(@class, 'context-menu-item')]/span[contains(text()," + " 'Remove Panel')]").click() + self.driver.switch_to.frame( + self.driver.find_elements_by_tag_name("iframe")[0]) time.sleep(.5) - self.click_element(self.find_by_xpath('//button[contains(@class, "ajs-button") and contains(.,"Don\'t save")]')) + self.click_element(self.find_by_xpath( + '//button[contains(@class, "ajs-button") and ' + 'contains(.,"Don\'t save")]')) self.driver.switch_to.default_content() def close_data_grid(self): @@ -106,7 +116,9 @@ class PgadminPage: def remove_server(self, server_config): self.driver.switch_to.default_content() - server_to_remove = self.find_by_xpath("//*[@id='tree']//*[.='" + server_config['name'] + "' and @class='aciTreeItem']") + server_to_remove = self.find_by_xpath( + "//*[@id='tree']//*[.='" + server_config['name'] + + "' and @class='aciTreeItem']") self.click_element(server_to_remove) object_menu_item = self.find_by_partial_link_text("Object") self.click_element(object_menu_item) @@ -115,10 +127,14 @@ class PgadminPage: self.click_modal('OK') def select_tree_item(self, tree_item_text): - self.find_by_xpath("//*[@id='tree']//*[.='" + tree_item_text + "' and @class='aciTreeItem']").click() + self.find_by_xpath( + "//*[@id='tree']//*[.='" + tree_item_text + + "' and @class='aciTreeItem']").click() def toggle_open_tree_item(self, tree_item_text): - self.find_by_xpath("//*[@id='tree']//*[.='" + tree_item_text + "']/../*[@class='aciTreeButton']").click() + self.find_by_xpath( + "//*[@id='tree']//*[.='" + tree_item_text + + "']/../*[@class='aciTreeButton']").click() def toggle_open_server(self, tree_item_text): def check_for_password_dialog_or_tree_open(driver): @@ -128,14 +144,17 @@ class PgadminPage: dialog = None try: - database_node = driver.find_element_by_xpath("//*[@id='tree']//*[.='Databases']/../*[@class='aciTreeButton']") + database_node = driver.find_element_by_xpath( + "//*[@id='tree']//*[.='Databases']" + "/../*[@class='aciTreeButton']") except WebDriverException: database_node = None return dialog is not None or database_node is not None self.toggle_open_tree_item(tree_item_text) - self._wait_for("Waiting for password dialog or tree to open", check_for_password_dialog_or_tree_open) + self._wait_for("Waiting for password dialog or tree to open", + check_for_password_dialog_or_tree_open) try: self.driver.find_element_by_id("frmPassword") @@ -145,13 +164,19 @@ class PgadminPage: return def find_by_xpath(self, xpath): - return self.wait_for_element(lambda driver: driver.find_element_by_xpath(xpath)) + return self.wait_for_element( + lambda driver: driver.find_element_by_xpath(xpath) + ) def find_by_id(self, element_id): - return self.wait_for_element(lambda driver: driver.find_element_by_id(element_id)) + return self.wait_for_element( + lambda driver: driver.find_element_by_id(element_id) + ) def find_by_css_selector(self, css_selector): - return self.wait_for_element(lambda driver: driver.find_element_by_css_selector(css_selector)) + return self.wait_for_element( + lambda driver: driver.find_element_by_css_selector(css_selector) + ) def find_by_partial_link_text(self, link_text): return self._wait_for( @@ -160,7 +185,8 @@ class PgadminPage: ) def click_element(self, element): - # driver must be here to adhere to the method contract in selenium.webdriver.support.wait.WebDriverWait.until() + # driver must be here to adhere to the method contract in + # selenium.webdriver.support.wait.WebDriverWait.until() def click_succeeded(driver): try: element.click() @@ -168,7 +194,9 @@ class PgadminPage: except WebDriverException: return False - return self._wait_for("clicking the element not to throw an exception", click_succeeded) + return self._wait_for( + "clicking the element not to throw an exception", click_succeeded + ) def fill_input_by_field_name(self, field_name, field_content): field = self.find_by_xpath("//input[@name='" + field_name + "']") @@ -183,9 +211,11 @@ class PgadminPage: def find_codemirror(driver): try: driver.switch_to.default_content() - driver.switch_to_frame(driver.find_element_by_tag_name("iframe")) + driver.switch_to_frame( + driver.find_element_by_tag_name("iframe")) element = driver.find_element_by_xpath( - "//pre[contains(@class,'CodeMirror-line')]/../../../*[contains(@class,'CodeMirror-code')]") + "//pre[contains(@class,'CodeMirror-line')]/../../../" + "*[contains(@class,'CodeMirror-code')]") if element.is_displayed() and element.is_enabled(): return element except (NoSuchElementException, WebDriverException): @@ -193,8 +223,8 @@ class PgadminPage: time.sleep(1) WebDriverWait(self.driver, timeout=self.timeout, poll_frequency=0.01).\ - until(find_codemirror, "Timed out waiting for codemirror to appear").\ - click() + until(find_codemirror, "Timed out waiting for codemirror " + "to appear").click() time.sleep(1) action = ActionChains(self.driver) @@ -202,8 +232,9 @@ class PgadminPage: action.perform() def click_tab(self, tab_name): - tab = self.find_by_xpath("//*[contains(@class,'wcTabTop')]//*[contains(@class,'wcPanelTab') " - "and contains(.,'" + tab_name + "')]") + tab = self.find_by_xpath("//*[contains(@class,'wcTabTop')]//" + "*[contains(@class,'wcPanelTab') " + "and contains(.,'" + tab_name + "')]") self.click_element(tab) def wait_for_input_field_content(self, field_name, content): @@ -213,7 +244,9 @@ class PgadminPage: return str(content) == element.get_attribute('value') - return self._wait_for("field to contain '" + str(content) + "'", input_field_has_content) + return self._wait_for( + "field to contain '" + str(content) + "'", input_field_has_content + ) def wait_for_element(self, find_method_with_args): def element_if_it_exists(driver): @@ -247,7 +280,8 @@ class PgadminPage: except NoSuchElementException: return True - self._wait_for("reloading indicator to disappear", reloading_indicator_has_disappeared) + self._wait_for("reloading indicator to disappear", + reloading_indicator_has_disappeared) def wait_for_spinner_to_disappear(self): def spinner_has_disappeared(driver): @@ -283,8 +317,11 @@ class PgadminPage: self._wait_for("app to start", page_shows_app, self.app_start_timeout) - def _wait_for(self, waiting_for_message, condition_met_function, timeout = None): + def _wait_for(self, waiting_for_message, condition_met_function, + timeout=None): if timeout is None: timeout = self.timeout - return WebDriverWait(self.driver, timeout, 0.01).until(condition_met_function, - "Timed out waiting for " + waiting_for_message) + return WebDriverWait(self.driver, timeout, 0.01).until( + condition_met_function, + "Timed out waiting for " + waiting_for_message + ) diff --git a/web/regression/python_test_utils/template_helper.py b/web/regression/python_test_utils/template_helper.py index 1ff3316..d25474d 100644 --- a/web/regression/python_test_utils/template_helper.py +++ b/web/regression/python_test_utils/template_helper.py @@ -12,7 +12,9 @@ from jinja2 import Environment class SimpleTemplateLoader(BaseLoader): - """ This class pretends to load whatever file content it is initialized with""" + """ This class pretends to load whatever file content it is initialized + with""" + def __init__(self, file_content): self.file_content = file_content diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py index b934e90..c11853f 100644 --- a/web/regression/python_test_utils/test_utils.py +++ b/web/regression/python_test_utils/test_utils.py @@ -75,17 +75,19 @@ def get_config_data(): """This function reads the server data from config_data""" server_data = [] for srv in test_setup.config_data['server_credentials']: - if (not 'enabled' in srv) or srv['enabled']: - data = {"name": srv['name'], - "comment": srv['comment'], - "host": srv['host'], - "port": srv['db_port'], - "db": srv['maintenance_db'], - "username": srv['db_username'], - "db_password": srv['db_password'], - "role": "", - "sslmode": srv['sslmode'], - "tablespace_path": srv.get('tablespace_path', None)} + if 'enabled' not in srv or srv['enabled']: + data = { + "name": srv['name'], + "comment": srv['comment'], + "host": srv['host'], + "port": srv['db_port'], + "db": srv['maintenance_db'], + "username": srv['db_username'], + "db_password": srv['db_password'], + "role": "", + "sslmode": srv['sslmode'], + "tablespace_path": srv.get('tablespace_path', None) + } server_data.append(data) return server_data @@ -115,12 +117,14 @@ def clear_node_info_dict(): def create_database(server, db_name): """This function used to create database and returns the database id""" try: - connection = get_db_connection(server['db'], - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + server['db'], + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() @@ -154,24 +158,29 @@ def create_table(server, db_name, table_name): :return: None """ try: - connection = get_db_connection(db_name, - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() pg_cursor.execute( - '''CREATE TABLE "%s" (some_column VARCHAR, value NUMERIC, details VARCHAR)''' % - table_name) + '''CREATE TABLE "%s" (some_column VARCHAR, value NUMERIC, + details VARCHAR)''' % table_name) pg_cursor.execute( - '''INSERT INTO "%s" VALUES ('Some-Name', 6, 'some info')''' % table_name) + '''INSERT INTO "%s" VALUES ('Some-Name', 6, 'some info')''' + % table_name) pg_cursor.execute( - '''INSERT INTO "%s" VALUES ('Some-Other-Name', 22, 'some other info')''' % table_name) + '''INSERT INTO "%s" VALUES ('Some-Other-Name', 22, + 'some other info')''' % table_name) pg_cursor.execute( - '''INSERT INTO "%s" VALUES ('Yet-Another-Name', 14, 'cool info')''' % table_name) + '''INSERT INTO "%s" VALUES ('Yet-Another-Name', 14, + 'cool info')''' % table_name) connection.set_isolation_level(old_isolation_level) connection.commit() @@ -192,12 +201,14 @@ def create_table_with_query(server, db_name, query): :return: None """ try: - connection = get_db_connection(db_name, - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() @@ -213,12 +224,14 @@ def create_constraint( server, db_name, table_name, constraint_type="unique", constraint_name="test_unique"): try: - connection = get_db_connection(db_name, - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() @@ -237,12 +250,14 @@ def create_constraint( def create_debug_function(server, db_name, function_name="test_func"): try: - connection = get_db_connection(db_name, - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() @@ -271,12 +286,14 @@ def create_debug_function(server, db_name, function_name="test_func"): def drop_debug_function(server, db_name, function_name="test_func"): try: - connection = get_db_connection(db_name, - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() @@ -293,12 +310,14 @@ def drop_debug_function(server, db_name, function_name="test_func"): def create_role(server, db_name, role_name="test_role"): try: - connection = get_db_connection(db_name, - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() @@ -325,12 +344,14 @@ def create_role(server, db_name, role_name="test_role"): def drop_role(server, db_name, role_name="test_role"): try: - connection = get_db_connection(db_name, - server['username'], - server['db_password'], - server['host'], - server['port'], - server['sslmode']) + connection = get_db_connection( + db_name, + server['username'], + server['db_password'], + server['host'], + server['port'], + server['sslmode'] + ) old_isolation_level = connection.isolation_level connection.set_isolation_level(0) pg_cursor = connection.cursor() @@ -351,13 +372,17 @@ def drop_database(connection, database_name): pg_cursor = connection.cursor() if connection.server_version >= 90100: pg_cursor.execute( - "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity " - "WHERE pg_stat_activity.datname ='%s' AND pid <> pg_backend_pid();" % database_name + "SELECT pg_terminate_backend(pg_stat_activity.pid) " + "FROM pg_stat_activity " + "WHERE pg_stat_activity.datname ='%s' AND " + "pid <> pg_backend_pid();" % database_name ) else: pg_cursor.execute( - "SELECT pg_terminate_backend(procpid) FROM pg_stat_activity " \ - "WHERE pg_stat_activity.datname ='%s' AND current_query='';" % database_name + "SELECT pg_terminate_backend(procpid) " + "FROM pg_stat_activity " + "WHERE pg_stat_activity.datname ='%s' " + "AND current_query='';" % database_name ) pg_cursor.execute("SELECT * FROM pg_database db WHERE" " db.datname='%s'" % database_name) @@ -401,8 +426,12 @@ def create_server(server): server_id = cur.lastrowid conn.commit() # Add server info to parent_node_dict - regression.parent_node_dict["server"].append({"server_id": server_id, - "server": server}) + regression.parent_node_dict["server"].append( + { + "server_id": server_id, + "server": server + } + ) return server_id except Exception as exception: @@ -421,17 +450,21 @@ def delete_server_with_api(tester, sid): def add_db_to_parent_node_dict(srv_id, db_id, test_db_name): """ This function stores the database details into parent dict """ - regression.parent_node_dict["database"].append({"server_id": srv_id, - "db_id": db_id, - "db_name": test_db_name}) + regression.parent_node_dict["database"].append({ + "server_id": srv_id, + "db_id": db_id, + "db_name": test_db_name + }) def add_schema_to_parent_node_dict(srv_id, db_id, schema_id, schema_name): """ This function stores the schema details into parent dict """ - regression.parent_node_dict["schema"].append({"server_id": srv_id, - "db_id": db_id, - "schema_id": schema_id, - "schema_name": schema_name}) + regression.parent_node_dict["schema"].append({ + "server_id": srv_id, + "db_id": db_id, + "schema_id": schema_id, + "schema_name": schema_name + }) def create_parent_server_node(server_info): @@ -449,16 +482,19 @@ def create_parent_server_node(server_info): add_db_to_parent_node_dict(srv_id, db_id, test_db_name) # Create schema schema_name = "test_schema_%s" % str(uuid.uuid4())[1:6] - connection = get_db_connection(test_db_name, - server_info['username'], - server_info['db_password'], - server_info['host'], - server_info['port'], - server_info['sslmode']) + connection = get_db_connection( + test_db_name, + server_info['username'], + server_info['db_password'], + server_info['host'], + server_info['port'], + server_info['sslmode'] + ) schema = regression.schema_utils.create_schema(connection, schema_name) - add_schema_to_parent_node_dict(srv_id, db_id, schema[0], - schema[1]) + add_schema_to_parent_node_dict( + srv_id, db_id, schema[0], schema[1] + ) def delete_test_server(tester): @@ -473,35 +509,43 @@ def delete_test_server(tester): srv_id = test_server["server_id"] servers_dict = test_server["server"] for database in test_databases: - connection = get_db_connection(servers_dict['db'], - servers_dict['username'], - servers_dict['db_password'], - servers_dict['host'], - servers_dict['port'], - servers_dict['sslmode']) + connection = get_db_connection( + servers_dict['db'], + servers_dict['username'], + servers_dict['db_password'], + servers_dict['host'], + servers_dict['port'], + servers_dict['sslmode'] + ) database_name = database["db_name"] # Drop database drop_database(connection, database_name) for role in test_roles: - connection = get_db_connection(servers_dict['db'], - servers_dict['username'], - servers_dict['db_password'], - servers_dict['host'], - servers_dict['port'], - servers_dict['sslmode']) + connection = get_db_connection( + servers_dict['db'], + servers_dict['username'], + servers_dict['db_password'], + servers_dict['host'], + servers_dict['port'], + servers_dict['sslmode'] + ) # Delete role - regression.roles_utils.delete_role(connection, - role["role_name"]) + regression.roles_utils.delete_role( + connection, role["role_name"] + ) for tablespace in test_table_spaces: - connection = get_db_connection(servers_dict['db'], - servers_dict['username'], - servers_dict['db_password'], - servers_dict['host'], - servers_dict['port'], - servers_dict['sslmode']) + connection = get_db_connection( + servers_dict['db'], + servers_dict['username'], + servers_dict['db_password'], + servers_dict['host'], + servers_dict['port'], + servers_dict['sslmode'] + ) # Delete tablespace regression.tablespace_utils.delete_tablespace( - connection, tablespace["tablespace_name"]) + connection, tablespace["tablespace_name"] + ) # Delete server delete_server_with_api(tester, srv_id) except Exception: @@ -528,8 +572,10 @@ def get_db_server(sid): connection = '' conn = sqlite3.connect(config.TEST_SQLITE_PATH) cur = conn.cursor() - server = cur.execute('SELECT name, host, port, maintenance_db,' - ' username, ssl_mode FROM server where id=%s' % sid) + server = cur.execute( + 'SELECT name, host, port, maintenance_db,' + ' username, ssl_mode FROM server where id=%s' % sid + ) server = server.fetchone() if server: name = server[0] @@ -543,12 +589,9 @@ def get_db_server(sid): db_password = get_db_password(config_servers, name, host, db_port) if db_password: # Drop database - connection = get_db_connection(db_name, - username, - db_password, - host, - db_port, - ssl_mode) + connection = get_db_connection( + db_name, username, db_password, host, db_port, ssl_mode + ) conn.close() return connection @@ -564,13 +607,13 @@ def _cleanup(tester, app_starter): schemas etc) during the test suite run""" try: test_servers = regression.parent_node_dict["server"] + \ - regression.node_info_dict["sid"] + regression.node_info_dict["sid"] test_databases = regression.parent_node_dict["database"] + \ - regression.node_info_dict["did"] + regression.node_info_dict["did"] test_table_spaces = regression.parent_node_dict["tablespace"] + \ - regression.node_info_dict["tsid"] + regression.node_info_dict["tsid"] test_roles = regression.parent_node_dict["role"] + \ - regression.node_info_dict["lrid"] + regression.node_info_dict["lrid"] # Drop databases for database in test_databases: connection = get_db_server(database["server_id"]) diff --git a/web/regression/runtests.py b/web/regression/runtests.py index 8eeab84..9ff1811 100644 --- a/web/regression/runtests.py +++ b/web/regression/runtests.py @@ -87,7 +87,7 @@ if pgadmin_credentials: 'login_password']) # Execute the setup file -exec (open("setup.py").read()) +exec(open("setup.py").read()) # Get the config database schema version. We store this in pgadmin.model # as it turns out that putting it in the config files isn't a great idea @@ -210,10 +210,15 @@ def add_arguments(): """ parser = argparse.ArgumentParser(description='Test suite for pgAdmin4') - parser.add_argument('--pkg', help='Executes the test cases of particular' - ' package and subpackages') - parser.add_argument('--exclude', help='Skips execution of the test ' - 'cases of particular package and sub-packages') + parser.add_argument( + '--pkg', + help='Executes the test cases of particular package and subpackages' + ) + parser.add_argument( + '--exclude', + help='Skips execution of the test cases of particular package and ' + 'sub-packages' + ) arg = parser.parse_args() return arg @@ -314,12 +319,12 @@ if __name__ == '__main__': signal.signal(getattr(signal, sig), sig_handler) # Set basic logging configuration for log file - logging.basicConfig(level=logging.DEBUG, - format='%(asctime)s:%(levelname)s:%(name)s:%(message)s' - , - filename=CURRENT_PATH + "/" + "regression.log", - filemode='w' - ) + logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)s:%(levelname)s:%(name)s:%(message)s', + filename=CURRENT_PATH + "/" + "regression.log", + filemode='w' + ) # Create logger to write log in the logger file as well as on console stderr_logger = logging.getLogger('STDERR') @@ -343,8 +348,8 @@ if __name__ == '__main__': suite = get_suite(test_module_list, server, test_client) tests = unit_test.TextTestRunner(stream=sys.stderr, - descriptions=True, - verbosity=2).run(suite) + descriptions=True, + verbosity=2).run(suite) ran_tests, failed_cases, skipped_cases, passed_cases = \ get_tests_result(tests) @@ -364,12 +369,16 @@ if __name__ == '__main__': if handle_cleanup: handle_cleanup() - print("\n===============================================================" - "=======", file=sys.stderr) + print( + "\n===============================================================" + "=======", + file=sys.stderr + ) print("Test Result Summary", file=sys.stderr) print( "===================================================================" - "===\n", file=sys.stderr) + "===\n", file=sys.stderr + ) test_result_json = {} for server_res in test_result: @@ -404,10 +413,11 @@ if __name__ == '__main__': file=sys.stderr) temp_dict_for_server = { - server_res: {"tests_passed": [total_passed_cases, passed_cases], - "tests_failed": [total_failed, failed_cases_json], - "tests_skipped": [total_skipped, skipped_cases_json] - } + server_res: { + "tests_passed": [total_passed_cases, passed_cases], + "tests_failed": [total_failed, failed_cases_json], + "tests_skipped": [total_skipped, skipped_cases_json] + } } test_result_json.update(temp_dict_for_server) @@ -418,7 +428,9 @@ if __name__ == '__main__': print( "===================================================================" - "===\n", file=sys.stderr) + "===\n", + file=sys.stderr + ) print("Please check output in file: %s/regression.log\n" % CURRENT_PATH)