mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Fix PEP8 issues in various modules. Fixes #3121
This commit is contained in:
committed by
Dave Page
parent
30868614ff
commit
7301e30ff3
@@ -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
|
||||||
|
)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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('/')
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 """
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"])
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user