Fix PEP8 issues in various modules. Fixes #3121

This commit is contained in:
Murtuza Zabuawala
2018-02-19 11:12:35 +00:00
committed by Dave Page
parent 30868614ff
commit 7301e30ff3
13 changed files with 369 additions and 229 deletions

View File

@@ -15,14 +15,13 @@ from flask_babel import gettext
from pgadmin.utils import PgAdminModule from pgadmin.utils import PgAdminModule
from pgadmin.utils.menu import MenuItem, Panel from pgadmin.utils.menu import MenuItem, Panel
from pgadmin.utils.preferences import Preferences from pgadmin.utils.preferences import Preferences
import config import config
class HelpModule(PgAdminModule): class HelpModule(PgAdminModule):
def get_own_menuitems(self): def get_own_menuitems(self):
"""Return a (set) of dicts of help menu items, with name, priority, URL, """Return a (set) of dicts of help menu items, with name, priority,
target and onclick code.""" URL, target and onclick code."""
return {'help_items': [ return {'help_items': [
MenuItem(name='mnu_online_help', MenuItem(name='mnu_online_help',
label=gettext('Online Help'), label=gettext('Online Help'),
@@ -75,7 +74,9 @@ class HelpModule(PgAdminModule):
'https://www.postgresql.org/docs/$VERSION$/static/', 'https://www.postgresql.org/docs/$VERSION$/static/',
category_label=gettext('Help'), category_label=gettext('Help'),
help_str=gettext( 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( self.edbas_help_path = self.help_preference.register(
@@ -84,7 +85,9 @@ class HelpModule(PgAdminModule):
'https://www.enterprisedb.com/docs/en/$VERSION$/pg/', 'https://www.enterprisedb.com/docs/en/$VERSION$/pg/',
category_label=gettext('Help'), category_label=gettext('Help'),
help_str=gettext( 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): def get_exposed_url_endpoints(self):
@@ -95,5 +98,8 @@ class HelpModule(PgAdminModule):
# Initialise the module # Initialise the module
blueprint = HelpModule(MODULE_NAME, __name__, static_url_path='/help', blueprint = HelpModule(
static_folder=config.HELP_PATH) MODULE_NAME, __name__,
static_url_path='/help',
static_folder=config.HELP_PATH
)

View File

@@ -120,24 +120,28 @@ class Server(db.Model):
ssl_mode = db.Column( ssl_mode = db.Column(
db.String(16), db.String(16),
db.CheckConstraint( 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) nullable=False)
comment = db.Column(db.String(1024), nullable=True) comment = db.Column(db.String(1024), nullable=True)
discovery_id = db.Column(db.String(128), nullable=True) discovery_id = db.Column(db.String(128), nullable=True)
servers = db.relationship('ServerGroup', servers = db.relationship(
backref=db.backref('server', cascade="all, delete-orphan"), 'ServerGroup',
lazy='joined') backref=db.backref('server', cascade="all, delete-orphan"),
lazy='joined'
)
db_res = db.Column(db.Text(), nullable=True) db_res = db.Column(db.Text(), nullable=True)
passfile = db.Column(db.Text(), nullable=True) passfile = db.Column(db.Text(), nullable=True)
sslcert = db.Column(db.Text(), nullable=True) sslcert = db.Column(db.Text(), nullable=True)
sslkey = db.Column(db.Text(), nullable=True) sslkey = db.Column(db.Text(), nullable=True)
sslrootcert = db.Column(db.Text(), nullable=True) sslrootcert = db.Column(db.Text(), nullable=True)
sslcrl = db.Column(db.Text(), nullable=True) sslcrl = db.Column(db.Text(), nullable=True)
sslcompression =db.Column(db.Integer(), sslcompression = db.Column(
db.CheckConstraint( db.Integer(),
'sslcompression >= 0 AND sslcompression <= 1' db.CheckConstraint('sslcompression >= 0 AND sslcompression <= 1'),
), nullable=False) nullable=False
)
bgcolor = db.Column(db.Text(10), nullable=True) bgcolor = db.Column(db.Text(10), nullable=True)
fgcolor = 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) schema_id = db.Column(db.Integer(), nullable=False, primary_key=True)
function_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) arg_id = db.Column(db.Integer(), nullable=False, primary_key=True)
is_null = db.Column(db.Integer(), is_null = db.Column(
db.CheckConstraint('is_null >= 0 AND is_null <= 1'), db.Integer(),
nullable=False) db.CheckConstraint('is_null >= 0 AND is_null <= 1'),
is_expression = db.Column(db.Integer(), nullable=False
db.CheckConstraint('is_expression >= 0 AND is_expression <= 1'), )
nullable=False) is_expression = db.Column(
use_default = db.Column(db.Integer(), db.Integer(),
db.CheckConstraint('use_default >= 0 AND use_default <= 1'), db.CheckConstraint(
nullable=False) '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) value = db.Column(db.String(), nullable=True)

View File

@@ -60,7 +60,11 @@ class PreferencesModule(PgAdminModule):
Returns: Returns:
list: a list of url endpoints exposed to the client. 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__) blueprint = PreferencesModule(MODULE_NAME, __name__)
@@ -70,9 +74,11 @@ blueprint = PreferencesModule(MODULE_NAME, __name__)
@login_required @login_required
def script(): def script():
"""render the required javascript""" """render the required javascript"""
return Response(response=render_template("preferences/preferences.js", _=gettext), return Response(
status=200, response=render_template("preferences/preferences.js", _=gettext),
mimetype="application/javascript") status=200,
mimetype="application/javascript"
)
@blueprint.route("/", methods=["GET"], endpoint='index') @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()) 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: if not res:
return internal_server_error(errormsg=msg) return internal_server_error(errormsg=msg)
@@ -195,4 +202,3 @@ def save(pid):
response.set_cookie("PGADMIN_LANGUAGE", language) response.set_cookie("PGADMIN_LANGUAGE", language)
return response return response

View File

@@ -14,8 +14,9 @@ from pgadmin import PgAdminModule
MODULE_NAME = 'redirects' MODULE_NAME = 'redirects'
blueprint = PgAdminModule(MODULE_NAME, __name__, blueprint = PgAdminModule(
url_prefix='/') MODULE_NAME, __name__, url_prefix='/'
)
@blueprint.route('/') @blueprint.route('/')

View File

@@ -35,12 +35,14 @@ class SettingsModule(PgAdminModule):
def get_own_menuitems(self): def get_own_menuitems(self):
return { return {
'file_items': [ 'file_items': [
MenuItem(name='mnu_resetlayout', MenuItem(
priority=999, name='mnu_resetlayout',
module="pgAdmin.Settings", priority=999,
callback='show', module="pgAdmin.Settings",
icon='fa fa-retweet', callback='show',
label=gettext('Reset Layout')) icon='fa fa-retweet',
label=gettext('Reset Layout')
)
] ]
} }
@@ -49,7 +51,9 @@ class SettingsModule(PgAdminModule):
Returns: Returns:
list: a list of url endpoints exposed to the client. 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__) blueprint = SettingsModule(MODULE_NAME, __name__)
@@ -66,7 +70,8 @@ def store_setting(setting, value):
def get_setting(setting, default=None): def get_setting(setting, default=None):
"""Retrieve a configuration setting for the current user, or return the """Retrieve a configuration setting for the current user, or return the
default value specified by the caller.""" 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: if not data or data.value is None:
return default return default
@@ -102,7 +107,8 @@ def store(setting=None, value=None):
if request.method == 'POST': if request.method == 'POST':
if 'count' in request.form: if 'count' in request.form:
for x in range(int(request.form['count'])): 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: else:
store_setting(request.form['setting'], request.form['value']) store_setting(request.form['setting'], request.form['value'])
else: else:

View File

@@ -18,8 +18,8 @@ def db_upgrade(app):
with app.app_context(): with app.app_context():
flask_migrate.Migrate(app, db) flask_migrate.Migrate(app, db)
migration_folder = os.path.join( migration_folder = os.path.join(
os.path.dirname(os.path.realpath(u(__file__, fs_encoding))), os.path.dirname(os.path.realpath(u(__file__, fs_encoding))),
os.pardir, os.pardir, os.pardir, os.pardir,
u'migrations' u'migrations'
) )
flask_migrate.upgrade(migration_folder) flask_migrate.upgrade(migration_folder)

View File

@@ -37,7 +37,7 @@ def user_info():
email = '' email = ''
p1 = '' p1 = ''
if os.environ['PGADMIN_SETUP_EMAIL'] and os.environ[ if os.environ['PGADMIN_SETUP_EMAIL'] and os.environ[
'PGADMIN_SETUP_PASSWORD']: 'PGADMIN_SETUP_PASSWORD']:
email = os.environ['PGADMIN_SETUP_EMAIL'] email = os.environ['PGADMIN_SETUP_EMAIL']
p1 = os.environ['PGADMIN_SETUP_PASSWORD'] p1 = os.environ['PGADMIN_SETUP_PASSWORD']
else: else:
@@ -66,7 +66,8 @@ def user_info():
print(u'Passwords do not match. Please try again.') print(u'Passwords do not match. Please try again.')
else: else:
print( 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() p1, p2 = pprompt()
return email, p1 return email, p1

View File

@@ -13,6 +13,7 @@ import random
import time import time
class AppStarter: class AppStarter:
""" Helper for starting the full pgadmin4 app and loading the page via """ Helper for starting the full pgadmin4 app and loading the page via
selenium selenium
@@ -43,7 +44,8 @@ class AppStarter:
self.driver.set_window_size(1280, 1024) self.driver.set_window_size(1280, 1024)
self.driver.get( self.driver.get(
"http://" + self.app_config.DEFAULT_SERVER + ":" + "http://" + self.app_config.DEFAULT_SERVER + ":" +
random_server_port) random_server_port
)
def stop_app(self): def stop_app(self):
""" This function stop the started app by killing process """ """ This function stop the started app by killing process """

View File

@@ -27,8 +27,11 @@ class BaseFeatureTest(BaseTestGenerator):
self.server = deepcopy(self.server) self.server = deepcopy(self.server)
self.server['name'] += ' Feature Tests' self.server['name'] += ' Feature Tests'
if app_config.SERVER_MODE: if app_config.SERVER_MODE:
self.skipTest("Currently, config is set to start pgadmin in server mode. " self.skipTest(
"This test doesn't know username and password so doesn't work in server mode") "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) self.page = PgadminPage(self.driver, app_config)
try: try:
@@ -38,7 +41,7 @@ class BaseFeatureTest(BaseTestGenerator):
self.page.reset_layout() self.page.reset_layout()
self.page.wait_for_spinner_to_disappear() self.page.wait_for_spinner_to_disappear()
self.before() self.before()
except: except Exception:
self._screenshot() self._screenshot()
raise raise
@@ -52,7 +55,8 @@ class BaseFeatureTest(BaseTestGenerator):
pass pass
def tearDown(self): 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() python3_failures = hasattr(self, '_outcome') and self.any_step_failed()
@@ -68,7 +72,8 @@ class BaseFeatureTest(BaseTestGenerator):
return False return False
def current_test_failed(self): 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: for failure in all_failures:
if failure[0] == self: if failure[0] == self:
return True return True
@@ -76,8 +81,10 @@ class BaseFeatureTest(BaseTestGenerator):
def _screenshot(self): def _screenshot(self):
screenshots_directory = '{0}/../screenshots'.format(self.CURRENT_PATH) screenshots_directory = '{0}/../screenshots'.format(self.CURRENT_PATH)
screenshots_server_directory = '{0}/{1}'.format(screenshots_directory, screenshots_server_directory = '{0}/{1}'.format(
self.server["name"].replace(" ", "_")) screenshots_directory,
self.server["name"].replace(" ", "_")
)
self.ensure_directory_exists(screenshots_directory) self.ensure_directory_exists(screenshots_directory)
self.ensure_directory_exists(screenshots_server_directory) self.ensure_directory_exists(screenshots_server_directory)
@@ -86,10 +93,13 @@ class BaseFeatureTest(BaseTestGenerator):
python_version = sys.version.split(" ")[0] python_version = sys.version.split(" ")[0]
self.page.driver.save_screenshot( self.page.driver.save_screenshot(
'{0}/{1}-{2}-Python-{3}.png'.format(screenshots_server_directory, '{0}/{1}-{2}-Python-{3}.png'.format(
self.__class__.__name__, screenshots_server_directory,
date, self.__class__.__name__,
python_version)) date,
python_version
)
)
def ensure_directory_exists(self, path): def ensure_directory_exists(self, path):
try: try:

View File

@@ -37,14 +37,17 @@ class PgadminPage:
def click_modal(self, button_text): def click_modal(self, button_text):
time.sleep(0.5) 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( 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) % button_text)
self.click_element(modal_button) self.click_element(modal_button)
def add_server(self, server_config): 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() self.driver.find_element_by_link_text("Object").click()
ActionChains(self.driver) \ ActionChains(self.driver) \
.move_to_element(self.driver.find_element_by_link_text("Create")) \ .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.fill_input_by_field_name("password", server_config['db_password'])
self.find_by_xpath("//button[contains(.,'Save')]").click() 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): def open_query_tool(self):
self.driver.find_element_by_link_text("Tools").click() 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.find_by_partial_link_text("Query Tool").click()
self.click_tab('Query -') self.click_tab('Query -')
def enable_menu_item(self, menu_item, wait_time): def enable_menu_item(self, menu_item, wait_time):
start_time = time.time() start_time = time.time()
# wait until menu becomes enabled. # wait until menu becomes enabled.
@@ -91,12 +94,19 @@ class PgadminPage:
def close_query_tool(self): def close_query_tool(self):
self.driver.switch_to.default_content() 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() ActionChains(self.driver).context_click(tab).perform()
self.find_by_xpath("//li[contains(@class, 'context-menu-item')]/span[contains(text(), 'Remove Panel')]").click() self.find_by_xpath(
self.driver.switch_to.frame(self.driver.find_elements_by_tag_name("iframe")[0]) "//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) 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() self.driver.switch_to.default_content()
def close_data_grid(self): def close_data_grid(self):
@@ -106,7 +116,9 @@ class PgadminPage:
def remove_server(self, server_config): def remove_server(self, server_config):
self.driver.switch_to.default_content() 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) self.click_element(server_to_remove)
object_menu_item = self.find_by_partial_link_text("Object") object_menu_item = self.find_by_partial_link_text("Object")
self.click_element(object_menu_item) self.click_element(object_menu_item)
@@ -115,10 +127,14 @@ class PgadminPage:
self.click_modal('OK') self.click_modal('OK')
def select_tree_item(self, tree_item_text): 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): 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 toggle_open_server(self, tree_item_text):
def check_for_password_dialog_or_tree_open(driver): def check_for_password_dialog_or_tree_open(driver):
@@ -128,14 +144,17 @@ class PgadminPage:
dialog = None dialog = None
try: 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: except WebDriverException:
database_node = None database_node = None
return dialog is not None or database_node is not None return dialog is not None or database_node is not None
self.toggle_open_tree_item(tree_item_text) 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: try:
self.driver.find_element_by_id("frmPassword") self.driver.find_element_by_id("frmPassword")
@@ -145,13 +164,19 @@ class PgadminPage:
return return
def find_by_xpath(self, xpath): 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): 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): 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): def find_by_partial_link_text(self, link_text):
return self._wait_for( return self._wait_for(
@@ -160,7 +185,8 @@ class PgadminPage:
) )
def click_element(self, element): 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): def click_succeeded(driver):
try: try:
element.click() element.click()
@@ -168,7 +194,9 @@ class PgadminPage:
except WebDriverException: except WebDriverException:
return False 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): def fill_input_by_field_name(self, field_name, field_content):
field = self.find_by_xpath("//input[@name='" + field_name + "']") field = self.find_by_xpath("//input[@name='" + field_name + "']")
@@ -183,9 +211,11 @@ class PgadminPage:
def find_codemirror(driver): def find_codemirror(driver):
try: try:
driver.switch_to.default_content() 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( 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(): if element.is_displayed() and element.is_enabled():
return element return element
except (NoSuchElementException, WebDriverException): except (NoSuchElementException, WebDriverException):
@@ -193,8 +223,8 @@ class PgadminPage:
time.sleep(1) time.sleep(1)
WebDriverWait(self.driver, timeout=self.timeout, poll_frequency=0.01).\ WebDriverWait(self.driver, timeout=self.timeout, poll_frequency=0.01).\
until(find_codemirror, "Timed out waiting for codemirror to appear").\ until(find_codemirror, "Timed out waiting for codemirror "
click() "to appear").click()
time.sleep(1) time.sleep(1)
action = ActionChains(self.driver) action = ActionChains(self.driver)
@@ -202,8 +232,9 @@ class PgadminPage:
action.perform() action.perform()
def click_tab(self, tab_name): def click_tab(self, tab_name):
tab = self.find_by_xpath("//*[contains(@class,'wcTabTop')]//*[contains(@class,'wcPanelTab') " tab = self.find_by_xpath("//*[contains(@class,'wcTabTop')]//"
"and contains(.,'" + tab_name + "')]") "*[contains(@class,'wcPanelTab') "
"and contains(.,'" + tab_name + "')]")
self.click_element(tab) self.click_element(tab)
def wait_for_input_field_content(self, field_name, content): def wait_for_input_field_content(self, field_name, content):
@@ -213,7 +244,9 @@ class PgadminPage:
return str(content) == element.get_attribute('value') 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 wait_for_element(self, find_method_with_args):
def element_if_it_exists(driver): def element_if_it_exists(driver):
@@ -247,7 +280,8 @@ class PgadminPage:
except NoSuchElementException: except NoSuchElementException:
return True 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 wait_for_spinner_to_disappear(self):
def spinner_has_disappeared(driver): def spinner_has_disappeared(driver):
@@ -283,8 +317,11 @@ class PgadminPage:
self._wait_for("app to start", page_shows_app, self.app_start_timeout) 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: if timeout is None:
timeout = self.timeout timeout = self.timeout
return WebDriverWait(self.driver, timeout, 0.01).until(condition_met_function, return WebDriverWait(self.driver, timeout, 0.01).until(
"Timed out waiting for " + waiting_for_message) condition_met_function,
"Timed out waiting for " + waiting_for_message
)

View File

@@ -12,7 +12,9 @@ from jinja2 import Environment
class SimpleTemplateLoader(BaseLoader): 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): def __init__(self, file_content):
self.file_content = file_content self.file_content = file_content

View File

@@ -75,17 +75,19 @@ def get_config_data():
"""This function reads the server data from config_data""" """This function reads the server data from config_data"""
server_data = [] server_data = []
for srv in test_setup.config_data['server_credentials']: for srv in test_setup.config_data['server_credentials']:
if (not 'enabled' in srv) or srv['enabled']: if 'enabled' not in srv or srv['enabled']:
data = {"name": srv['name'], data = {
"comment": srv['comment'], "name": srv['name'],
"host": srv['host'], "comment": srv['comment'],
"port": srv['db_port'], "host": srv['host'],
"db": srv['maintenance_db'], "port": srv['db_port'],
"username": srv['db_username'], "db": srv['maintenance_db'],
"db_password": srv['db_password'], "username": srv['db_username'],
"role": "", "db_password": srv['db_password'],
"sslmode": srv['sslmode'], "role": "",
"tablespace_path": srv.get('tablespace_path', None)} "sslmode": srv['sslmode'],
"tablespace_path": srv.get('tablespace_path', None)
}
server_data.append(data) server_data.append(data)
return server_data return server_data
@@ -115,12 +117,14 @@ def clear_node_info_dict():
def create_database(server, db_name): def create_database(server, db_name):
"""This function used to create database and returns the database id""" """This function used to create database and returns the database id"""
try: try:
connection = get_db_connection(server['db'], connection = get_db_connection(
server['username'], server['db'],
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
@@ -154,24 +158,29 @@ def create_table(server, db_name, table_name):
:return: None :return: None
""" """
try: try:
connection = get_db_connection(db_name, connection = get_db_connection(
server['username'], db_name,
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
pg_cursor.execute( pg_cursor.execute(
'''CREATE TABLE "%s" (some_column VARCHAR, value NUMERIC, details VARCHAR)''' % '''CREATE TABLE "%s" (some_column VARCHAR, value NUMERIC,
table_name) details VARCHAR)''' % table_name)
pg_cursor.execute( 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( 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( 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.set_isolation_level(old_isolation_level)
connection.commit() connection.commit()
@@ -192,12 +201,14 @@ def create_table_with_query(server, db_name, query):
:return: None :return: None
""" """
try: try:
connection = get_db_connection(db_name, connection = get_db_connection(
server['username'], db_name,
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
@@ -213,12 +224,14 @@ def create_constraint(
server, db_name, table_name, server, db_name, table_name,
constraint_type="unique", constraint_name="test_unique"): constraint_type="unique", constraint_name="test_unique"):
try: try:
connection = get_db_connection(db_name, connection = get_db_connection(
server['username'], db_name,
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
@@ -237,12 +250,14 @@ def create_constraint(
def create_debug_function(server, db_name, function_name="test_func"): def create_debug_function(server, db_name, function_name="test_func"):
try: try:
connection = get_db_connection(db_name, connection = get_db_connection(
server['username'], db_name,
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() 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"): def drop_debug_function(server, db_name, function_name="test_func"):
try: try:
connection = get_db_connection(db_name, connection = get_db_connection(
server['username'], db_name,
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() 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"): def create_role(server, db_name, role_name="test_role"):
try: try:
connection = get_db_connection(db_name, connection = get_db_connection(
server['username'], db_name,
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() 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"): def drop_role(server, db_name, role_name="test_role"):
try: try:
connection = get_db_connection(db_name, connection = get_db_connection(
server['username'], db_name,
server['db_password'], server['username'],
server['host'], server['db_password'],
server['port'], server['host'],
server['sslmode']) server['port'],
server['sslmode']
)
old_isolation_level = connection.isolation_level old_isolation_level = connection.isolation_level
connection.set_isolation_level(0) connection.set_isolation_level(0)
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
@@ -351,13 +372,17 @@ def drop_database(connection, database_name):
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
if connection.server_version >= 90100: if connection.server_version >= 90100:
pg_cursor.execute( pg_cursor.execute(
"SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity " "SELECT pg_terminate_backend(pg_stat_activity.pid) "
"WHERE pg_stat_activity.datname ='%s' AND pid <> pg_backend_pid();" % database_name "FROM pg_stat_activity "
"WHERE pg_stat_activity.datname ='%s' AND "
"pid <> pg_backend_pid();" % database_name
) )
else: else:
pg_cursor.execute( pg_cursor.execute(
"SELECT pg_terminate_backend(procpid) FROM pg_stat_activity " \ "SELECT pg_terminate_backend(procpid) "
"WHERE pg_stat_activity.datname ='%s' AND current_query='<IDLE>';" % database_name "FROM pg_stat_activity "
"WHERE pg_stat_activity.datname ='%s' "
"AND current_query='<IDLE>';" % database_name
) )
pg_cursor.execute("SELECT * FROM pg_database db WHERE" pg_cursor.execute("SELECT * FROM pg_database db WHERE"
" db.datname='%s'" % database_name) " db.datname='%s'" % database_name)
@@ -401,8 +426,12 @@ def create_server(server):
server_id = cur.lastrowid server_id = cur.lastrowid
conn.commit() conn.commit()
# Add server info to parent_node_dict # Add server info to parent_node_dict
regression.parent_node_dict["server"].append({"server_id": server_id, regression.parent_node_dict["server"].append(
"server": server}) {
"server_id": server_id,
"server": server
}
)
return server_id return server_id
except Exception as exception: 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): def add_db_to_parent_node_dict(srv_id, db_id, test_db_name):
""" This function stores the database details into parent dict """ """ This function stores the database details into parent dict """
regression.parent_node_dict["database"].append({"server_id": srv_id, regression.parent_node_dict["database"].append({
"db_id": db_id, "server_id": srv_id,
"db_name": test_db_name}) "db_id": db_id,
"db_name": test_db_name
})
def add_schema_to_parent_node_dict(srv_id, db_id, schema_id, schema_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 """ """ This function stores the schema details into parent dict """
regression.parent_node_dict["schema"].append({"server_id": srv_id, regression.parent_node_dict["schema"].append({
"db_id": db_id, "server_id": srv_id,
"schema_id": schema_id, "db_id": db_id,
"schema_name": schema_name}) "schema_id": schema_id,
"schema_name": schema_name
})
def create_parent_server_node(server_info): 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) add_db_to_parent_node_dict(srv_id, db_id, test_db_name)
# Create schema # Create schema
schema_name = "test_schema_%s" % str(uuid.uuid4())[1:6] schema_name = "test_schema_%s" % str(uuid.uuid4())[1:6]
connection = get_db_connection(test_db_name, connection = get_db_connection(
server_info['username'], test_db_name,
server_info['db_password'], server_info['username'],
server_info['host'], server_info['db_password'],
server_info['port'], server_info['host'],
server_info['sslmode']) server_info['port'],
server_info['sslmode']
)
schema = regression.schema_utils.create_schema(connection, schema_name) schema = regression.schema_utils.create_schema(connection, schema_name)
add_schema_to_parent_node_dict(srv_id, db_id, schema[0], add_schema_to_parent_node_dict(
schema[1]) srv_id, db_id, schema[0], schema[1]
)
def delete_test_server(tester): def delete_test_server(tester):
@@ -473,35 +509,43 @@ def delete_test_server(tester):
srv_id = test_server["server_id"] srv_id = test_server["server_id"]
servers_dict = test_server["server"] servers_dict = test_server["server"]
for database in test_databases: for database in test_databases:
connection = get_db_connection(servers_dict['db'], connection = get_db_connection(
servers_dict['username'], servers_dict['db'],
servers_dict['db_password'], servers_dict['username'],
servers_dict['host'], servers_dict['db_password'],
servers_dict['port'], servers_dict['host'],
servers_dict['sslmode']) servers_dict['port'],
servers_dict['sslmode']
)
database_name = database["db_name"] database_name = database["db_name"]
# Drop database # Drop database
drop_database(connection, database_name) drop_database(connection, database_name)
for role in test_roles: for role in test_roles:
connection = get_db_connection(servers_dict['db'], connection = get_db_connection(
servers_dict['username'], servers_dict['db'],
servers_dict['db_password'], servers_dict['username'],
servers_dict['host'], servers_dict['db_password'],
servers_dict['port'], servers_dict['host'],
servers_dict['sslmode']) servers_dict['port'],
servers_dict['sslmode']
)
# Delete role # Delete role
regression.roles_utils.delete_role(connection, regression.roles_utils.delete_role(
role["role_name"]) connection, role["role_name"]
)
for tablespace in test_table_spaces: for tablespace in test_table_spaces:
connection = get_db_connection(servers_dict['db'], connection = get_db_connection(
servers_dict['username'], servers_dict['db'],
servers_dict['db_password'], servers_dict['username'],
servers_dict['host'], servers_dict['db_password'],
servers_dict['port'], servers_dict['host'],
servers_dict['sslmode']) servers_dict['port'],
servers_dict['sslmode']
)
# Delete tablespace # Delete tablespace
regression.tablespace_utils.delete_tablespace( regression.tablespace_utils.delete_tablespace(
connection, tablespace["tablespace_name"]) connection, tablespace["tablespace_name"]
)
# Delete server # Delete server
delete_server_with_api(tester, srv_id) delete_server_with_api(tester, srv_id)
except Exception: except Exception:
@@ -528,8 +572,10 @@ def get_db_server(sid):
connection = '' connection = ''
conn = sqlite3.connect(config.TEST_SQLITE_PATH) conn = sqlite3.connect(config.TEST_SQLITE_PATH)
cur = conn.cursor() cur = conn.cursor()
server = cur.execute('SELECT name, host, port, maintenance_db,' server = cur.execute(
' username, ssl_mode FROM server where id=%s' % sid) 'SELECT name, host, port, maintenance_db,'
' username, ssl_mode FROM server where id=%s' % sid
)
server = server.fetchone() server = server.fetchone()
if server: if server:
name = server[0] name = server[0]
@@ -543,12 +589,9 @@ def get_db_server(sid):
db_password = get_db_password(config_servers, name, host, db_port) db_password = get_db_password(config_servers, name, host, db_port)
if db_password: if db_password:
# Drop database # Drop database
connection = get_db_connection(db_name, connection = get_db_connection(
username, db_name, username, db_password, host, db_port, ssl_mode
db_password, )
host,
db_port,
ssl_mode)
conn.close() conn.close()
return connection return connection
@@ -564,13 +607,13 @@ def _cleanup(tester, app_starter):
schemas etc) during the test suite run""" schemas etc) during the test suite run"""
try: try:
test_servers = regression.parent_node_dict["server"] + \ test_servers = regression.parent_node_dict["server"] + \
regression.node_info_dict["sid"] regression.node_info_dict["sid"]
test_databases = regression.parent_node_dict["database"] + \ 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"] + \ 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"] + \ test_roles = regression.parent_node_dict["role"] + \
regression.node_info_dict["lrid"] regression.node_info_dict["lrid"]
# Drop databases # Drop databases
for database in test_databases: for database in test_databases:
connection = get_db_server(database["server_id"]) connection = get_db_server(database["server_id"])

View File

@@ -87,7 +87,7 @@ if pgadmin_credentials:
'login_password']) 'login_password'])
# Execute the setup file # 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 # 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 # 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 = argparse.ArgumentParser(description='Test suite for pgAdmin4')
parser.add_argument('--pkg', help='Executes the test cases of particular' parser.add_argument(
' package and subpackages') '--pkg',
parser.add_argument('--exclude', help='Skips execution of the test ' help='Executes the test cases of particular package and subpackages'
'cases of particular package and sub-packages') )
parser.add_argument(
'--exclude',
help='Skips execution of the test cases of particular package and '
'sub-packages'
)
arg = parser.parse_args() arg = parser.parse_args()
return arg return arg
@@ -314,12 +319,12 @@ if __name__ == '__main__':
signal.signal(getattr(signal, sig), sig_handler) signal.signal(getattr(signal, sig), sig_handler)
# Set basic logging configuration for log file # Set basic logging configuration for log file
logging.basicConfig(level=logging.DEBUG, logging.basicConfig(
format='%(asctime)s:%(levelname)s:%(name)s:%(message)s' level=logging.DEBUG,
, format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
filename=CURRENT_PATH + "/" + "regression.log", filename=CURRENT_PATH + "/" + "regression.log",
filemode='w' filemode='w'
) )
# Create logger to write log in the logger file as well as on console # Create logger to write log in the logger file as well as on console
stderr_logger = logging.getLogger('STDERR') stderr_logger = logging.getLogger('STDERR')
@@ -343,8 +348,8 @@ if __name__ == '__main__':
suite = get_suite(test_module_list, server, test_client) suite = get_suite(test_module_list, server, test_client)
tests = unit_test.TextTestRunner(stream=sys.stderr, tests = unit_test.TextTestRunner(stream=sys.stderr,
descriptions=True, descriptions=True,
verbosity=2).run(suite) verbosity=2).run(suite)
ran_tests, failed_cases, skipped_cases, passed_cases = \ ran_tests, failed_cases, skipped_cases, passed_cases = \
get_tests_result(tests) get_tests_result(tests)
@@ -364,12 +369,16 @@ if __name__ == '__main__':
if handle_cleanup: if handle_cleanup:
handle_cleanup() handle_cleanup()
print("\n===============================================================" print(
"=======", file=sys.stderr) "\n==============================================================="
"=======",
file=sys.stderr
)
print("Test Result Summary", file=sys.stderr) print("Test Result Summary", file=sys.stderr)
print( print(
"===================================================================" "==================================================================="
"===\n", file=sys.stderr) "===\n", file=sys.stderr
)
test_result_json = {} test_result_json = {}
for server_res in test_result: for server_res in test_result:
@@ -404,10 +413,11 @@ if __name__ == '__main__':
file=sys.stderr) file=sys.stderr)
temp_dict_for_server = { temp_dict_for_server = {
server_res: {"tests_passed": [total_passed_cases, passed_cases], server_res: {
"tests_failed": [total_failed, failed_cases_json], "tests_passed": [total_passed_cases, passed_cases],
"tests_skipped": [total_skipped, skipped_cases_json] "tests_failed": [total_failed, failed_cases_json],
} "tests_skipped": [total_skipped, skipped_cases_json]
}
} }
test_result_json.update(temp_dict_for_server) test_result_json.update(temp_dict_for_server)
@@ -418,7 +428,9 @@ if __name__ == '__main__':
print( print(
"===================================================================" "==================================================================="
"===\n", file=sys.stderr) "===\n",
file=sys.stderr
)
print("Please check output in file: %s/regression.log\n" % CURRENT_PATH) print("Please check output in file: %s/regression.log\n" % CURRENT_PATH)