public inbox for [email protected]
help / color / mirror / Atom feedFixes for pgAdmin feature tests
12+ messages / 2 participants
[nested] [flat]
* Fixes for pgAdmin feature tests
@ 2019-11-11 04:44 Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Shubham Agarwal @ 2019-11-11 04:44 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
Attached is the patch containing fixes for the failed feature test cases.
This patch contains-
1. Newly created function for traversing the browser tree.
2. Some synchronization issue fixes.
3. Modified locators.
4. Test cases fix for the recent commits.
--
Thanks & Regards,
Shubham Agarwal
EnterpriseDB Corporation
The Postgres Database Company
Attachments:
[application/octet-stream] feature_test_fix.patch (52.6K, 3-feature_test_fix.patch)
download | inline diff:
diff --git a/web/pgadmin/feature_tests/browser_tool_bar_test.py b/web/pgadmin/feature_tests/browser_tool_bar_test.py
index 9e1ff74cb..28fcb4068 100644
--- a/web/pgadmin/feature_tests/browser_tool_bar_test.py
+++ b/web/pgadmin/feature_tests/browser_tool_bar_test.py
@@ -47,7 +47,7 @@ class BrowserToolBarFeatureTest(BaseFeatureTest):
file=sys.stderr, end="")
self.test_view_data_tool_button()
print("OK.", file=sys.stderr)
-
+ #
# Check for filtered rows button
print("\nFiltered Rows ToolBar Button ",
file=sys.stderr, end="")
@@ -60,9 +60,9 @@ class BrowserToolBarFeatureTest(BaseFeatureTest):
self.test_table_name)
def test_query_tool_button(self):
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
self.page.retry_click(
(By.CSS_SELECTOR,
BrowserToolBarLocators.open_query_tool_button_css),
@@ -70,9 +70,12 @@ class BrowserToolBarFeatureTest(BaseFeatureTest):
def test_view_data_tool_button(self):
self.page.select_tree_item(self.test_db)
- self.page.toggle_open_tree_item('Schemas')
- self.page.toggle_open_tree_item('public')
- self.page.toggle_open_tables_node()
+ self.page.toggle_open_schema_node(
+ self.server['name'], self.server['db_password'],
+ self.test_db, 'public')
+ self.page.toggle_open_tables_node(
+ self.server['name'], self.server['db_password'],
+ self.test_db, 'public')
self.page.select_tree_item(self.test_table_name)
self.page.retry_click(
diff --git a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
index 9bb458710..9ac8be6f4 100644
--- a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
+++ b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
@@ -39,9 +39,9 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
self.server, self.test_db, self.test_table_name)
def runTest(self):
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
self.page.open_query_tool()
self.page.fill_codemirror_area_with(
@@ -70,7 +70,7 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
QueryToolLocators.copy_button_css)
copy_button.click()
- self.assertEqual('"Some-Name"\t"6"\t"some info"',
+ self.assertEqual('"Some-Name"\t6\t"some info"',
pyperclip.paste())
def _copies_rows_with_header(self):
@@ -87,9 +87,9 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
copy_button.click()
self.assertEqual("""\"some_column"\t"value"\t"details"
-\"Some-Name"\t"6"\t"some info"
-\"Some-Other-Name"\t"22"\t"some other info"
-\"Yet-Another-Name"\t"14"\t"cool info\"""", pyperclip.paste())
+\"Some-Name"\t6\t"some info"
+\"Some-Other-Name"\t22\t"some other info"
+\"Yet-Another-Name"\t14\t"cool info\"""", pyperclip.paste())
def _copies_columns(self):
pyperclip.copy("old clipboard contents")
@@ -116,7 +116,7 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
ActionChains(self.page.driver).key_down(
Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
- self.assertEqual('"Some-Name"\t"6"\t"some info"',
+ self.assertEqual('"Some-Name"\t6\t"some info"',
pyperclip.paste())
def _copies_column_using_keyboard_shortcut(self):
@@ -154,8 +154,8 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
self.page.driver
).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
- self.assertEqual("""\"Some-Other-Name"\t"22"
-"Yet-Another-Name"\t"14\"""", pyperclip.paste())
+ self.assertEqual(
+ '"Some-Other-Name"\t22\n"Yet-Another-Name"\t14', pyperclip.paste())
def _shift_resizes_rectangular_selection(self):
pyperclip.copy("old clipboard contents")
@@ -180,8 +180,8 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
Keys.CONTROL
).send_keys('c').key_up(Keys.CONTROL).perform()
- self.assertEqual("""\"Some-Other-Name"\t"22"\t"some other info"
-"Yet-Another-Name"\t"14"\t"cool info\"""", pyperclip.paste())
+ self.assertEqual("""\"Some-Other-Name"\t22\t"some other info"
+"Yet-Another-Name"\t14\t"cool info\"""", pyperclip.paste())
def _shift_resizes_column_selection(self):
pyperclip.copy("old clipboard contents")
@@ -198,9 +198,7 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()
self.assertEqual(
- """\"Some-Name"\t"6"
-"Some-Other-Name"\t"22"
-"Yet-Another-Name"\t"14\"""",
+ '"Some-Name"\t6\n"Some-Other-Name"\t22\n"Yet-Another-Name"\t14',
pyperclip.paste())
def _mouseup_outside_grid_still_makes_a_selection(self):
diff --git a/web/pgadmin/feature_tests/file_manager_test.py b/web/pgadmin/feature_tests/file_manager_test.py
index dd2a7855f..c76f20386 100644
--- a/web/pgadmin/feature_tests/file_manager_test.py
+++ b/web/pgadmin/feature_tests/file_manager_test.py
@@ -60,9 +60,9 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
print("OK.", file=sys.stderr)
def _navigate_to_query_tool(self):
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
self.page.open_query_tool()
def _create_new_file(self):
diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
index 2de897cc5..eb93be7cf 100644
--- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py
+++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
@@ -149,9 +149,9 @@ class PGDataypeFeatureTest(BaseFeatureTest):
self.page.remove_server(self.server)
def _schema_node_expandable(self):
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
def _check_datatype(self):
# Slick grid does not render all the column if viewport is not enough
diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
index 6b99fdb7d..8659dd0e0 100644
--- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
@@ -64,9 +64,9 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
test_gui_helper.close_bgprocess_popup(self)
def runTest(self):
- self.page.toggle_open_server(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.database_name)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.database_name)
# Backup
self.page.retry_click(
@@ -115,11 +115,11 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
self.assertEquals(status, "Successfully completed.")
- self.page.find_by_css_selector(
- NavMenuLocators.status_alertifier_more_btn_css).click()
-
- self.wait.until(EC.visibility_of_element_located(
- (By.XPATH, NavMenuLocators.process_watcher_alertfier)))
+ self.page.retry_click(
+ (By.CSS_SELECTOR,
+ NavMenuLocators.status_alertifier_more_btn_css),
+ (By.XPATH,
+ NavMenuLocators.process_watcher_alertfier))
backup_file = None
# Check for XSS in Backup details
@@ -143,9 +143,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
backup_file = command[int(command.find('--file')) +
8:int(command.find('--host')) - 2]
- close_btn = self.page.find_by_xpath(
- NavMenuLocators.process_watcher_close_button_xpath)
- close_btn.click()
+ test_gui_helper.close_process_watcher(self)
# Restore
tools_menu = self.driver.find_element_by_link_text(
@@ -186,11 +184,11 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
self.assertEquals(status, "Successfully completed.")
- self.page.find_by_css_selector(
- NavMenuLocators.status_alertifier_more_btn_css).click()
-
- self.wait.until(EC.visibility_of_element_located(
- (By.XPATH, NavMenuLocators.process_watcher_alertfier)))
+ self.page.retry_click(
+ (By.CSS_SELECTOR,
+ NavMenuLocators.status_alertifier_more_btn_css),
+ (By.XPATH,
+ NavMenuLocators.process_watcher_alertfier))
# Check for XSS in Restore details
if self.is_xss_check:
@@ -206,9 +204,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
self.assertIn("pg_restore", str(command))
- close_watcher = self.page.find_by_xpath(
- NavMenuLocators.process_watcher_close_button_xpath)
- close_watcher.click()
+ test_gui_helper.close_process_watcher(self)
if backup_file is not None:
if os.path.isfile(backup_file):
diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
index 5eb521be7..b50c2b6fa 100644
--- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
@@ -90,20 +90,22 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
self.verify_command()
def _open_maintenance_dialogue(self):
- self.page.toggle_open_server(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.database_name)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.database_name)
if self.test_level == 'table':
- self.page.toggle_open_tree_item('Schemas')
- self.page.toggle_open_tree_item('public')
- self.page.toggle_open_tables_node()
+ self.page.toggle_open_schema_node(self.server['name'],
+ self.server['db_password'],
+ self.database_name, 'public')
+ self.page.toggle_open_tables_node(self.server['name'],
+ self.server['db_password'],
+ self.database_name, 'public')
self.page.select_tree_item(self.table_name)
self.page.retry_click(
(By.LINK_TEXT,
NavMenuLocators.tools_menu_link_text),
(By.CSS_SELECTOR, NavMenuLocators.maintenance_obj_css))
-
maintenance_obj = self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, NavMenuLocators.maintenance_obj_css)))
maintenance_obj.click()
@@ -118,11 +120,12 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
test_gui_helper.close_bgprocess_popup(self)
self.assertEquals(status, "Successfully completed.")
- self.page.find_by_css_selector(
- NavMenuLocators.status_alertifier_more_btn_css).click()
- self.wait.until(EC.visibility_of_element_located(
- (By.XPATH, NavMenuLocators.process_watcher_alertfier)))
+ self.page.retry_click(
+ (By.CSS_SELECTOR,
+ NavMenuLocators.status_alertifier_more_btn_css),
+ (By.XPATH,
+ NavMenuLocators.process_watcher_alertfier))
command = self.page.find_by_css_selector(
NavMenuLocators.
@@ -148,13 +151,12 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
"\nVACUUM VERBOSE"
" public." + self.table_name + ";")
- self.page.find_by_xpath(
- NavMenuLocators.process_watcher_close_button_xpath).click()
+ test_gui_helper.close_process_watcher(self)
def after(self):
test_gui_helper.close_bgprocess_popup(self)
self.page.remove_server(self.server)
- test_utils.delete_table(self.server, self.test_db,
+ test_utils.delete_table(self.server, self.database_name,
self.table_name)
connection = test_utils.get_db_connection(
self.server['db'],
diff --git a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
index 1f6e248ce..fe6d68e4d 100644
--- a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
@@ -56,9 +56,9 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest):
test_utils.create_table(self.server, self.test_db,
self.second_table_name)
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
self.page.open_query_tool()
self.page.wait_for_spinner_to_disappear()
diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py
index 937cd97a8..88d30a1c1 100644
--- a/web/pgadmin/feature_tests/query_tool_journey_test.py
+++ b/web/pgadmin/feature_tests/query_tool_journey_test.py
@@ -103,7 +103,7 @@ class QueryToolJourneyTest(BaseFeatureTest):
QueryToolLocators.copy_button_css)
copy_row.click()
- self.assertEqual('"Some-Name"\t"6"\t"some info"',
+ self.assertEqual('"Some-Name"\t6\t"some info"',
pyperclip.paste())
def _test_copies_columns(self):
@@ -380,9 +380,9 @@ class QueryToolJourneyTest(BaseFeatureTest):
self.page.click_modal('Yes')
def _navigate_to_query_tool(self):
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
self.page.open_query_tool()
self.page.wait_for_spinner_to_disappear()
diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py
index ca9ee5091..413811dc2 100644
--- a/web/pgadmin/feature_tests/query_tool_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_tests.py
@@ -35,9 +35,9 @@ class QueryToolFeatureTest(BaseFeatureTest):
def before(self):
self.page.wait_for_spinner_to_disappear()
self.page.add_server(self.server)
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
self.page.open_query_tool()
self.page.wait_for_spinner_to_disappear()
self._reset_options()
@@ -254,7 +254,7 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
)
# Table height takes some time to update, for which their is no
# particular way
- time.sleep(1)
+ time.sleep(2)
if canvas_ele.size['height'] == scrolling_height:
break
else:
diff --git a/web/pgadmin/feature_tests/table_ddl_feature_test.py b/web/pgadmin/feature_tests/table_ddl_feature_test.py
index 12a293728..26f231ef9 100644
--- a/web/pgadmin/feature_tests/table_ddl_feature_test.py
+++ b/web/pgadmin/feature_tests/table_ddl_feature_test.py
@@ -32,12 +32,12 @@ class TableDdlFeatureTest(BaseFeatureTest):
test_utils.create_table(self.server, self.test_db,
self.test_table_name)
- self.page.toggle_open_server(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
- self.page.toggle_open_tree_item('Schemas')
- self.page.toggle_open_tree_item('public')
- self.page.toggle_open_tree_item('Tables')
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
+ self.page.toggle_open_tables_node(
+ self.server['name'], self.server['db_password'],
+ self.test_db, 'public')
self.page.select_tree_item(self.test_table_name)
self.page.click_tab("SQL")
diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py
index 09dd6d046..6ea8d506c 100644
--- a/web/pgadmin/feature_tests/view_data_dml_queries.py
+++ b/web/pgadmin/feature_tests/view_data_dml_queries.py
@@ -122,12 +122,12 @@ CREATE TABLE public.nonintpkey
self.page.wait_for_spinner_to_disappear()
self.page.add_server(self.server)
- self.page.toggle_open_tree_item(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
- self.page.toggle_open_tree_item('Schemas')
- self.page.toggle_open_tree_item('public')
- self.page.toggle_open_tree_item('Tables')
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
+ self.page.toggle_open_tables_node(self.server['name'],
+ self.server['db_password'],
+ self.test_db, 'public')
self._load_config_data('table_insert_update_cases')
# iterate on both tables
@@ -349,13 +349,13 @@ CREATE TABLE public.nonintpkey
element = result_row.find_element_by_class_name("r" + str(idx))
self.page.driver.execute_script(
"arguments[0].scrollIntoView(false)", element)
-
- self.assertEquals(element.text, config_check_data[str(idx)][1])
+ time.sleep(0.4)
self.assertEquals(element.text, config_check_data[str(idx)][1])
# scroll browser back to the left
# to reset position so other assertions can succeed
for idx in reversed(list(config_check_data.keys())):
+ time.sleep(0.4)
element = result_row.find_element_by_class_name("r" + str(idx))
self.page.driver.execute_script(
"arguments[0].scrollIntoView(false)", element)
diff --git a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
index 335d2c8db..aed1f36f1 100644
--- a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
@@ -94,12 +94,12 @@ class CheckForXssFeatureTest(BaseFeatureTest):
self.server, self.test_db, self.test_table_name)
def _tables_node_expandable(self):
- self.page.toggle_open_server(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item(self.test_db)
- self.page.toggle_open_tree_item('Schemas')
- self.page.toggle_open_tree_item('public')
- self.page.toggle_open_tree_item('Tables')
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
+ self.page.toggle_open_tables_node(self.server['name'],
+ self.server['db_password'],
+ self.test_db, 'public')
self.page.select_tree_item(self.test_table_name)
def _check_xss_in_browser_tree(self):
diff --git a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
index 70ae11d13..b42d3f12d 100644
--- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
@@ -39,10 +39,10 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
self.function_name = "a_test_function" + \
str(random.randint(10000, 65535))
test_utils.create_debug_function(
- self.server, "postgres", self.function_name
+ self.server, self.test_db, self.function_name
)
- if test_utils.does_function_exist(self.server, 'postgres',
+ if test_utils.does_function_exist(self.server, self.test_db,
self.function_name) != 'True':
raise Exception("The required function is not found")
@@ -54,15 +54,16 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
def after(self):
self.page.remove_server(self.server)
- test_utils.drop_debug_function(self.server, "postgres",
+ test_utils.drop_debug_function(self.server, self.test_db,
self.function_name)
def _function_node_expandable(self):
- self.page.toggle_open_server(self.server['name'])
- self.page.toggle_open_tree_item('Databases')
- self.page.toggle_open_tree_item('postgres')
- self.page.toggle_open_tree_item('Schemas')
- self.page.toggle_open_tree_item('public')
+ self.page.expand_database_node(
+ self.server['name'],
+ self.server['db_password'], self.test_db)
+ self.page.toggle_open_schema_node(self.server['name'],
+ self.server['db_password'],
+ self.test_db, 'public')
self.page.toggle_open_function_node()
self.page.select_tree_item(self.function_name + "()")
diff --git a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
index bf0013597..ab4c4241e 100644
--- a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
@@ -58,7 +58,8 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest):
"<h1>test</h1>")
def _role_node_expandable(self, role):
- self.page.toggle_open_server(self.server['name'])
+ self.page.expand_server_node(
+ self.server['name'], self.server['db_password'])
self.page.toggle_open_tree_item('Login/Group Roles')
self.page.select_tree_item(role)
@@ -93,6 +94,6 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest):
"""This will click and open membership tab of role"""
self.page.retry_click(
- (By.XPATH,
- "//a[normalize-space(text())='Membership']"),
+ (By.LINK_TEXT,
+ "Membership"),
(By.XPATH, "//input[@placeholder='Select members']"))
diff --git a/web/regression/feature_utils/locators.py b/web/regression/feature_utils/locators.py
index f37afddd5..847e457d3 100644
--- a/web/regression/feature_utils/locators.py
+++ b/web/regression/feature_utils/locators.py
@@ -87,7 +87,7 @@ class NavMenuLocators:
".bg-process-details .bg-detailed-desc"
process_watcher_close_button_xpath = \
- "//div[contains(@class,'wcFloatingFocus')]//" \
+ "//div[contains(@class,'wcFloating')]//" \
"div[contains(@class,'fa-close')]"
restore_file_name_xpath = "//div[contains(text(),'Restore')]" \
@@ -227,3 +227,20 @@ class QueryToolLocators:
read_only_column_icon_xpath = "//div[contains(@class," \
" 'editable-column-header-icon')]" \
"/i[contains(@class, 'fa-lock')]"
+
+
+class ConnectToServerDiv:
+ # This will contain xpaths for element relating to Connect to server div
+
+ password_field = "//input[@id='password']"
+
+ ok_button = \
+ "//div [@class='alertify ajs-modeless ajs-movable ajs-zoom']" \
+ "//button[text()='OK']"
+
+ error_message = \
+ "//form[@id='frmPassword']/div/div//div[@class='alert-text']"
+
+ cancel_button = \
+ "//div [@class='alertify ajs-modeless ajs-movable ajs-zoom']" \
+ "//button[text()='Cancel']"
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index 24d3bc9b5..05bc7408a 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -21,7 +21,7 @@ from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from regression.feature_utils.locators import QueryToolLocators, \
- NavMenuLocators
+ NavMenuLocators, ConnectToServerDiv
from regression.feature_utils.tree_area_locators import TreeAreaLocators
@@ -245,14 +245,6 @@ class PgadminPage:
if attempts == 0:
raise Exception(e)
- def get_expansion_status_of_node(self, xpath_node):
- """get the expansion status for a node through xpath"""
- node_is_expanded = False
- element = self.find_by_xpath(xpath_node)
- if element.get_attribute("aria-expanded") == 'true':
- node_is_expanded = True
- return node_is_expanded
-
def toggle_open_servers_group(self):
"""This will open Servers group to display underlying nodes"""
is_expanded = False
@@ -280,50 +272,238 @@ class PgadminPage:
file=sys.stderr)
return is_expanded
- def toggle_open_tree_item(self, tree_item_text):
- # 'sleep' here helps in cases where underlying nodes are auto opened.
- # Otherwise, encountered situations where False value is returned
- # even if the underlying node to be clicked was Opened.
- time.sleep(.6)
- item_with_text = self.find_by_xpath(
- TreeAreaLocators.specified_tree_node.format(tree_item_text))
-
- self.driver.execute_script("arguments[0].scrollIntoView()",
- item_with_text)
-
- if item_with_text.find_element_by_xpath(
- ".//ancestor::*[@class='aciTreeLine']").get_attribute(
- "aria-expanded") == 'false':
- item = item_with_text.find_element_by_xpath(
- ".//parent::*[@class='aciTreeItem']")
- ActionChains(self.driver).double_click(item).perform()
- retry = 3
- while retry > 0:
- try:
- WebDriverWait(self.driver, 5).until((lambda item_with_text: (
- item_with_text.find_element_by_xpath(
- ".//ancestor::*[@class='aciTreeLine']").
- get_attribute("aria-expanded") == 'true')))
- break
- except TimeoutException:
- retry -= 1
- pass
-
- def toggle_open_tables_node(self):
- """The function will be used for opening Tables node only"""
-
- # get the element which contains 'aria-expanded' info
- tables_expansion_ele = self.find_by_xpath("//div[div[div[div[div[div"
- "[div[div[span[span["
- "(@class='aciTreeText') and "
- "text()='Tables']]]]]]]]]]")
-
- if tables_expansion_ele.get_attribute('aria-expanded') == 'false':
- # button element of the Tables node to open it
- item_button = self.find_by_xpath(
- "//div[span[span[(@class='aciTreeText') and text()"
- "='Tables']]]/span[@class='aciTreeButton']")
- ActionChains(self.driver).click(item_button).perform()
+ def expand_server_node(self, server_name, server_password):
+ """will expand a particular server node"""
+ server_node_expansion_status = False
+ if self.toggle_open_servers_group():
+ if self.wait_for_elements_to_appear(
+ self.driver,
+ TreeAreaLocators.server_group_sub_nodes):
+ subnodes_of_servers = self.find_by_xpath_list(
+ TreeAreaLocators.server_group_sub_nodes)
+ subnodes_of_servers_expansion_status = \
+ self.find_by_xpath_list(
+ TreeAreaLocators.
+ server_group_sub_nodes_exp_status)
+ index_of_server_node = self.get_index_of_element(
+ subnodes_of_servers, server_name)
+
+ if not self.check_server_is_connected(
+ index_of_server_node):
+ if self.click_and_connect_server(
+ subnodes_of_servers[index_of_server_node],
+ server_password):
+ server_node_expansion_status = True
+ else:
+ print(
+ "(expand_server_node)The server node is "
+ "not expanded",
+ file=sys.stderr)
+ else:
+ if not self.get_expansion_status_of_node_element(
+ subnodes_of_servers_expansion_status[
+ index_of_server_node]):
+ webdriver.ActionChains(self.driver).double_click(
+ subnodes_of_servers[
+ index_of_server_node]).perform()
+ if self.wait_for_elements_to_appear(
+ self.driver, TreeAreaLocators.
+ sub_nodes_of_a_server_node(server_name),
+ 30):
+ server_node_expansion_status = True
+ else:
+ server_node_expansion_status = True
+ else:
+ print(
+ "(expand_server_node) The Servers node is"
+ " not expanded",
+ file=sys.stderr)
+ return server_node_expansion_status
+
+ def expand_databases_node(self, server_name, server_password):
+ """will expand databases node under server node"""
+ databases_node_expanded = False
+ if self.expand_server_node(server_name, server_password):
+ if self.wait_for_elements_to_appear(
+ self.driver,
+ TreeAreaLocators.sub_nodes_of_a_server_node(server_name)):
+ subnodes_of_server_node = self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_a_server_node(server_name))
+ subnode_of_server_node_exp_status = self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_a_server_node_exp_status(
+ server_name))
+ index_of_databases_node = self.get_index_of_element(
+ subnodes_of_server_node,
+ "Databases")
+ time.sleep(2)
+ expansion_status = self.get_expansion_status_of_node_element(
+ subnode_of_server_node_exp_status[index_of_databases_node])
+ if not expansion_status:
+ retry = 5
+ while retry > 0:
+ webdriver.ActionChains(self.driver).double_click(
+ subnodes_of_server_node[
+ index_of_databases_node].find_element_by_xpath(
+ ".//*[@class='aciTreeItem']")
+ ).perform()
+ if self.wait_for_elements_to_appear(
+ self.driver, TreeAreaLocators.
+ sub_nodes_of_databases_node(server_name), 3):
+ databases_node_expanded = True
+ break
+ else:
+ retry -= 1
+ else:
+ databases_node_expanded = True
+ else:
+ print("The server/previous nodes not expanded",
+ file=sys.stderr)
+ return databases_node_expanded
+
+ def expand_database_node(self, server_name, server_password,
+ name_of_database):
+ """will expand database node under databases node"""
+ db_node_expanded_status = False
+ if self.expand_databases_node(server_name, server_password):
+ sub_nodes_of_databases_node = self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_databases_node(server_name))
+ index_of_required_db_node = self.get_index_of_element(
+ sub_nodes_of_databases_node,
+ name_of_database)
+ expansion_status = self.get_expansion_status_of_node_element(
+ self.find_by_xpath_list(
+ TreeAreaLocators.
+ sub_nodes_of_databases_node_exp_status(
+ server_name))[
+ index_of_required_db_node])
+ if not expansion_status:
+ self.driver.execute_script("arguments[0].scrollIntoView()",
+ sub_nodes_of_databases_node[
+ index_of_required_db_node])
+ webdriver.ActionChains(self.driver).double_click(
+ sub_nodes_of_databases_node[
+ index_of_required_db_node]).perform()
+ if self.wait_for_elements_to_appear(
+ self.driver, TreeAreaLocators.
+ sub_nodes_of_database_node(
+ name_of_database)):
+ db_node_expanded_status = True
+ else:
+ db_node_expanded_status = True
+ else:
+ print("The databases/previous nodes not expanded",
+ file=sys.stderr)
+ return db_node_expanded_status
+
+ def toggle_open_schemas_node(self, server_name, server_password,
+ name_of_database):
+ """will expand schemas node under a db node"""
+ expansion_status = False
+ if self.expand_database_node(server_name, server_password,
+ name_of_database):
+ sub_nodes_db_node = self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_database_node(
+ name_of_database))
+ index_of_schemas_node = self.get_index_of_element(
+ sub_nodes_db_node, "Schemas")
+ expansion_status = self.get_expansion_status_of_node_element(
+ self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_database_node_exp_status(
+ name_of_database))[
+ index_of_schemas_node])
+ if not expansion_status:
+ self.driver.execute_script(
+ "arguments[0].scrollIntoView()",
+ sub_nodes_db_node[index_of_schemas_node])
+ webdriver.ActionChains(self.driver).double_click(
+ sub_nodes_db_node[index_of_schemas_node]).perform()
+ if self.wait_for_elements_to_appear(
+ self.driver, TreeAreaLocators.
+ sub_nodes_of_schemas_node(name_of_database)):
+ expansion_status = True
+ else:
+ expansion_status = True
+ else:
+ print(
+ "(expand_schemas_node) database/previous nodes "
+ "are not expanded",
+ file=sys.stderr)
+ return expansion_status
+
+ def toggle_open_schema_node(
+ self, server_name, server_password,
+ name_of_database, name_of_schema_node):
+ """will expand schema node under schemas node"""
+ expansion_status = False
+ if self.toggle_open_schemas_node(
+ server_name, server_password, name_of_database):
+ sub_nodes_schemas_node = self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_schemas_node(
+ name_of_database))
+ index_of_schema_node = self.get_index_of_element(
+ sub_nodes_schemas_node,
+ name_of_schema_node)
+ expansion_status = self.get_expansion_status_of_node_element(
+ self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_schemas_node_exp_status(
+ name_of_database))[
+ index_of_schema_node])
+ if not expansion_status:
+ self.driver.execute_script(
+ "arguments[0].scrollIntoView()",
+ sub_nodes_schemas_node[index_of_schema_node])
+ webdriver.ActionChains(self.driver).double_click(
+ sub_nodes_schemas_node[index_of_schema_node]).perform()
+ if self.wait_for_elements_to_appear(
+ self.driver, TreeAreaLocators.
+ sub_nodes_of_schema_node(name_of_database)):
+ expansion_status = True
+ else:
+ expansion_status = True
+ else:
+ print(
+ "(expand_schema_node) schema/previous nodes are"
+ " not expanded",
+ file=sys.stderr)
+ return expansion_status
+
+ def toggle_open_tables_node(
+ self, server_name, server_password,
+ name_of_database, name_of_schema_node):
+ """will expand tables node under schema node"""
+ node_expanded_successfully = False
+ if self.toggle_open_schema_node(
+ server_name, server_password, name_of_database,
+ name_of_schema_node):
+ sub_nodes_of_schema_node = self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_schema_node(
+ name_of_database))
+ sub_nodes_of_schema_node_exp_status = self.find_by_xpath_list(
+ TreeAreaLocators.sub_nodes_of_schema_node_exp_status(
+ name_of_database))
+ index_of_tables_node = self.get_index_of_element(
+ sub_nodes_of_schema_node, "Tables")
+ expansion_status = self.get_expansion_status_of_node_element(
+ sub_nodes_of_schema_node_exp_status[index_of_tables_node])
+ if not expansion_status:
+ self.driver.execute_script("arguments[0].scrollIntoView()",
+ sub_nodes_of_schema_node[
+ index_of_tables_node])
+ webdriver.ActionChains(self.driver).double_click(
+ sub_nodes_of_schema_node[
+ index_of_tables_node]).perform()
+ if self.wait_for_elements_to_appear(
+ self.driver, TreeAreaLocators.
+ sub_nodes_of_tables_node):
+ node_expanded_successfully = True
+ else:
+ node_expanded_successfully = True
+ else:
+ print(
+ "(expand_tables_node) schema/previous nodes "
+ "are not expanded",
+ file=sys.stderr)
+ return node_expanded_successfully
def toggle_open_function_node(self):
"""The function will be used for opening Functions node only"""
@@ -379,6 +559,124 @@ class PgadminPage:
else:
node_expanded = True
+ def check_server_is_connected(self, index_of_server):
+ """This will check connected status of a server, as connection
+ status is contained either in span or div element so checking it"""
+ server_connected = False
+ try:
+ connection_status_elements = self.find_by_xpath_list(
+ TreeAreaLocators.server_group_sub_nodes_connected_status)
+ span_elements = connection_status_elements[
+ index_of_server].find_elements_by_tag_name("span")
+ div_elements = connection_status_elements[
+ index_of_server].find_elements_by_tag_name("div")
+
+ span_value_of_class_att = ""
+ div_value_of_class_att = ""
+
+ if len(span_elements) > 0:
+ span_value_of_class_att = \
+ span_elements[0].get_attribute('class')
+ if len(div_elements) > 0:
+ div_value_of_class_att = \
+ div_elements[0].get_attribute('class')
+ if (("aciTreeIcon icon-pg" in span_value_of_class_att or
+ "aciTreeIcon icon-pg" in div_value_of_class_att or
+ "aciTreeIcon icon-ppas" in
+ span_value_of_class_att or
+ "aciTreeIcon icon-ppas" in div_value_of_class_att) and
+ ("aciTreeIcon icon-server-not-connected" not in
+ span_value_of_class_att or
+ "aciTreeIcon icon-server-not-connected" not in
+ div_value_of_class_att)):
+ server_connected = True
+ except Exception as e:
+ print("There is some exception thrown in the function "
+ "check_server_is_connected and is: " + str(e),
+ file=sys.stderr)
+ return server_connected
+
+ def click_and_connect_server(self, server_element, password):
+ """will connect a server node, will provide the password in the
+ respective window"""
+ server_connection_status = False
+ try:
+ webdriver.ActionChains(self.driver).double_click(
+ server_element).perform()
+ if self.wait_for_element_to_appear(self.driver,
+ ConnectToServerDiv.ok_button):
+ self.fill_input_by_xpath(
+ ConnectToServerDiv.password_field, password)
+ self.find_by_xpath(ConnectToServerDiv.ok_button).click()
+ self.wait_until_element_not_visible(
+ ConnectToServerDiv.ok_button)
+ if self.wait_for_element_to_be_visible(
+ self.driver, ConnectToServerDiv.error_message, 2):
+ print(
+ "While entering password in click_and_connect_server "
+ "function, error is occurred : " + str(
+ self.find_by_xpath(
+ ConnectToServerDiv.error_message).text),
+ file=sys.stderr)
+ else:
+ server_connection_status = True
+ except Exception as e:
+ print(
+ "There is some exception thrown click_and_connect_server "
+ "and is: " + str(
+ e), file=sys.stderr)
+ return server_connection_status
+
+ def get_expansion_status_of_node(self, xpath_node):
+ """get the expansion status for a node through xpath"""
+ node_is_expanded = False
+ element = self.find_by_xpath(xpath_node)
+ if element.get_attribute("aria-expanded") == 'true':
+ node_is_expanded = True
+ return node_is_expanded
+
+ def get_expansion_status_of_node_element(self, element):
+ """get the expansion status for an element"""
+ node_is_expanded = False
+ try:
+ if element.get_attribute("aria-expanded") == 'true':
+ node_is_expanded = True
+ except Exception as e:
+ print(
+ "There is some exception thrown in the function "
+ "get_expansion_status_of_node_element and is: " + str(
+ e), file=sys.stderr)
+ return node_is_expanded
+
+ def toggle_open_tree_item(self, tree_item_text):
+ # 'sleep' here helps in cases where underlying nodes are auto opened.
+ # Otherwise, encountered situations where False value is returned
+ # even if the underlying node to be clicked was Opened.
+ time.sleep(.6)
+ item_with_text = self.find_by_xpath(
+ TreeAreaLocators.specified_tree_node.format(tree_item_text))
+
+ self.driver.execute_script("arguments[0].scrollIntoView()",
+ item_with_text)
+
+ if item_with_text.find_element_by_xpath(
+ ".//ancestor::*[@class='aciTreeLine']").get_attribute(
+ "aria-expanded") == 'false':
+ item = item_with_text.find_element_by_xpath(
+ ".//parent::*[@class='aciTreeItem']")
+ ActionChains(self.driver).double_click(item).perform()
+ retry = 3
+ while retry > 0:
+ try:
+ WebDriverWait(self.driver, 5).until((lambda item_with_text: (
+ item_with_text.find_element_by_xpath(
+ ".//ancestor::*[@class='aciTreeLine']").
+ get_attribute("aria-expanded") == 'true')))
+ break
+ except TimeoutException:
+ retry -= 1
+ pass
+
def toggle_open_server(self, tree_item_text):
def check_for_password_dialog_or_tree_open(driver):
try:
@@ -692,6 +990,19 @@ class PgadminPage:
return self._wait_for("element to exist", element_if_it_exists)
+ def wait_for_elements_to_appear(self, driver, locator, time_value=20):
+ """This will wait until list of elements or an element is visible,
+ The time out value is userdefined"""
+ elements_located_status = False
+ try:
+ if WebDriverWait(driver, time_value).until(
+ EC.visibility_of_any_elements_located((
+ By.XPATH, locator))):
+ elements_located_status = True
+ except Exception as e:
+ pass
+ return elements_located_status
+
def find_by_xpath_list(self, xpath):
"""This will find out list of elements through a single xpath"""
return self.wait_for_elements(
@@ -749,11 +1060,11 @@ class PgadminPage:
click_status = False
attempt = 0
- while click_status is not True and attempt < 5:
+ while click_status is not True and attempt < 10:
try:
element = self.driver.find_element(*click_locator)
element.click()
- WebDriverWait(self.driver, 5).until(
+ WebDriverWait(self.driver, 2).until(
EC.visibility_of_element_located(verify_locator))
click_status = True
except Exception:
diff --git a/web/regression/feature_utils/tree_area_locators.py b/web/regression/feature_utils/tree_area_locators.py
index 524058f09..0b98e7547 100644
--- a/web/regression/feature_utils/tree_area_locators.py
+++ b/web/regression/feature_utils/tree_area_locators.py
@@ -26,6 +26,98 @@ class TreeAreaLocators():
"following-sibling::ul/li/div/div/div/span[2]/" \
"span[@class='aciTreeText']"
+ server_group_sub_nodes_exp_status = \
+ "//div[div[span[span[contains(text(),'Servers')]]]]" \
+ "/following-sibling::ul/li/div"
+
+ server_group_sub_nodes_connected_status = \
+ "//div[div[span[span[contains(text(), 'Servers')]]]]/" \
+ "following-sibling::ul/li/div/div/div/span[2]"
+
specified_tree_node = \
"//div[@id='tree']//span[@class='aciTreeItem']/" \
"span[(@class='aciTreeText') and text()='{}']"
+
+ specified_tree_node_exp_status = \
+ "//div[@id='tree']//span[@class='aciTreeItem']/" \
+ "span[(@class='aciTreeText') and text()='{}']" \
+ "//ancestor::*[@class='aciTreeLine']"
+
+ sub_nodes_of_tables_node = \
+ "//div[div[div[div[div[div[div[div[span[span[" \
+ "contains(text(),'Tables')]]]]]]]]]]/" \
+ "following-sibling::ul/li/div//div/span[2]/span[2]"
+
+ @staticmethod
+ def sub_nodes_of_a_server_node(server_name):
+ xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \
+ "following-sibling::ul/li/div[@class='aciTreeLine']" % \
+ server_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_a_server_node_exp_status(server_name):
+ xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \
+ "following-sibling::ul/li/div" % server_name
+ return xpath
+
+ @staticmethod
+ def databases_node_of_a_server_node(server_name):
+ xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \
+ "following-sibling::ul/li/div/div/div/div/span[2]/span[2 " \
+ "and text()='Databases ']" % server_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_databases_node(server_name):
+ xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \
+ "following-sibling::ul/li[1]/div/following-sibling::ul/li/" \
+ "div/div/div/div/div/span[2]/span[@class='aciTreeText']" % \
+ server_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_databases_node_exp_status(server_name):
+ xpath = "//div[div[div[span[span[contains(text(), '%s')]]]]]/" \
+ "following-sibling::ul/li[1]/div/following-sibling::ul/li/" \
+ "div" % server_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_database_node(database_name):
+ xpath = "//div[div[div[div[div[span[span[contains(text()," \
+ "'%s')]]]]]]]/following-sibling::ul/li/div/div/div/div/div/" \
+ "div/span[2]/span[2]" % database_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_database_node_exp_status(database_name):
+ xpath = "//div[div[div[div[div[span[span[contains(text(), " \
+ "'%s')]]]]]]]/following-sibling::ul/li/div" % database_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_schemas_node(database_name):
+ xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \
+ "following-sibling::ul/li[7]/ul/li/div//div/span/" \
+ "span[@class='aciTreeText']" % database_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_schemas_node_exp_status(database_name):
+ xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \
+ "following-sibling::ul/li[7]/ul/li/div" % database_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_schema_node(database_name):
+ xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \
+ "following-sibling::ul/li[7]/ul/li/ul/li/div//div/" \
+ "span[2]/span[2]" % database_name
+ return xpath
+
+ @staticmethod
+ def sub_nodes_of_schema_node_exp_status(database_name):
+ xpath = "//div[div[div[div[div[span[span[text()='%s']]]]]]]/" \
+ "following-sibling::ul/li[7]/ul/li/ul/li/div" % database_name
+ return xpath
diff --git a/web/regression/python_test_utils/test_gui_helper.py b/web/regression/python_test_utils/test_gui_helper.py
index c31787cc7..7515ee158 100644
--- a/web/regression/python_test_utils/test_gui_helper.py
+++ b/web/regression/python_test_utils/test_gui_helper.py
@@ -6,6 +6,7 @@
# This software is released under the PostgreSQL Licence
#
##########################################################################
+from regression.feature_utils.locators import NavMenuLocators
def close_bgprocess_popup(tester):
@@ -41,3 +42,16 @@ def close_bgprocess_popup(tester):
except Exception:
tester.driver.find_element_by_css_selector(
".btn.btn-sm-sq.btn-primary.pg-bg-close > i").click()
+
+
+def close_process_watcher(tester):
+ attempt = 5
+ while attempt > 0:
+ close_btn = tester.page.find_by_xpath(
+ NavMenuLocators.process_watcher_close_button_xpath)
+ close_btn.click()
+ if not tester.page.check_if_element_exist_by_xpath(
+ NavMenuLocators.process_watcher_close_button_xpath, 1):
+ break
+ else:
+ attempt -= 1
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
@ 2019-11-11 05:24 ` Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Akshay Joshi @ 2019-11-11 05:24 UTC (permalink / raw)
To: Shubham Agarwal <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied with a minor change. Menu for 'Delete Drop' server
has been changed to 'Remove Server' which causes all the test cases failing
on my machine.
On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
[email protected]> wrote:
> Hi Team,
>
> Attached is the patch containing fixes for the failed feature test cases.
> This patch contains-
> 1. Newly created function for traversing the browser tree.
> 2. Some synchronization issue fixes.
> 3. Modified locators.
> 4. Test cases fix for the recent commits.
>
> --
> Thanks & Regards,
> Shubham Agarwal
> EnterpriseDB Corporation
>
> The Postgres Database Company
>
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
@ 2019-11-12 12:57 ` Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Shubham Agarwal @ 2019-11-12 12:57 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
PFA patch containing some more fixes for random feature test failures.
Thanks and regards,
Shubham Agarwal
On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied with a minor change. Menu for 'Delete Drop' server
> has been changed to 'Remove Server' which causes all the test cases failing
> on my machine.
>
> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
> [email protected]> wrote:
>
>> Hi Team,
>>
>> Attached is the patch containing fixes for the failed feature test cases.
>> This patch contains-
>> 1. Newly created function for traversing the browser tree.
>> 2. Some synchronization issue fixes.
>> 3. Modified locators.
>> 4. Test cases fix for the recent commits.
>>
>> --
>> Thanks & Regards,
>> Shubham Agarwal
>> EnterpriseDB Corporation
>>
>> The Postgres Database Company
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
>
> *Sr. Software Architect*
> *EnterpriseDB Software India Private Limited*
> *Mobile: +91 976-788-8246*
>
--
Thanks & Regards,
Shubham Agarwal
EnterpriseDB Corporation
The Postgres Database Company
Attachments:
[application/octet-stream] feature_tests_fix_v2.patch (18.3K, 3-feature_tests_fix_v2.patch)
download | inline diff:
diff --git a/web/pgadmin/feature_tests/browser_tool_bar_test.py b/web/pgadmin/feature_tests/browser_tool_bar_test.py
index 28fcb4068..a05278a1b 100644
--- a/web/pgadmin/feature_tests/browser_tool_bar_test.py
+++ b/web/pgadmin/feature_tests/browser_tool_bar_test.py
@@ -14,6 +14,7 @@ import random
from regression.python_test_utils import test_utils
from regression.feature_utils.locators import BrowserToolBarLocators
from regression.feature_utils.base_feature_test import BaseFeatureTest
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
from selenium.webdriver.common.by import By
@@ -69,14 +70,18 @@ class BrowserToolBarFeatureTest(BaseFeatureTest):
(By.CSS_SELECTOR, BrowserToolBarLocators.query_tool_panel_css))
def test_view_data_tool_button(self):
- self.page.select_tree_item(self.test_db)
+ self.page.click_a_tree_node(
+ self.test_db,
+ TreeAreaLocators.sub_nodes_of_databases_node(self.server['name']))
self.page.toggle_open_schema_node(
self.server['name'], self.server['db_password'],
self.test_db, 'public')
self.page.toggle_open_tables_node(
self.server['name'], self.server['db_password'],
self.test_db, 'public')
- self.page.select_tree_item(self.test_table_name)
+ self.page.click_a_tree_node(
+ self.test_table_name,
+ TreeAreaLocators.sub_nodes_of_tables_node)
self.page.retry_click(
(By.CSS_SELECTOR,
diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
index eb93be7cf..c4d368df1 100644
--- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py
+++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
@@ -21,6 +21,7 @@ from regression.python_test_utils import test_utils
from regression.feature_utils.base_feature_test import BaseFeatureTest
from regression.feature_utils.locators import NavMenuLocators, \
QueryToolLocators
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
@@ -156,7 +157,9 @@ class PGDataypeFeatureTest(BaseFeatureTest):
def _check_datatype(self):
# Slick grid does not render all the column if viewport is not enough
# wide. So execute test as batch of queries.
- self.page.select_tree_item(self.test_db)
+ self.page.click_a_tree_node(
+ self.test_db,
+ TreeAreaLocators.sub_nodes_of_databases_node(self.server['name']))
self.page.open_query_tool()
self._create_enum_type()
for batch in config_data:
diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
index 8659dd0e0..cc2e89b59 100644
--- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
@@ -55,14 +55,12 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
self.server['sslmode']
)
test_utils.drop_database(connection, self.database_name)
-
test_utils.create_database(self.server, self.database_name)
+ test_gui_helper.close_bgprocess_popup(self)
self.page.add_server(self.server)
self.wait = WebDriverWait(self.page.driver, 20)
- test_gui_helper.close_bgprocess_popup(self)
-
def runTest(self):
self.page.expand_database_node(
self.server['name'],
diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
index b50c2b6fa..728323b49 100644
--- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
@@ -18,6 +18,7 @@ from regression.feature_utils.base_feature_test import BaseFeatureTest
from regression.python_test_utils import test_utils
from regression.python_test_utils import test_gui_helper
from regression.feature_utils.locators import NavMenuLocators
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
@@ -71,9 +72,9 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
test_utils.create_database(self.server, self.database_name)
test_utils.create_table(self.server, self.database_name,
self.table_name)
+ test_gui_helper.close_bgprocess_popup(self)
self.page.add_server(self.server)
self.wait = WebDriverWait(self.page.driver, 20)
- test_gui_helper.close_bgprocess_popup(self)
def runTest(self):
self._open_maintenance_dialogue()
@@ -100,7 +101,9 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
self.page.toggle_open_tables_node(self.server['name'],
self.server['db_password'],
self.database_name, 'public')
- self.page.select_tree_item(self.table_name)
+ self.page.click_a_tree_node(
+ self.table_name,
+ TreeAreaLocators.sub_nodes_of_tables_node)
self.page.retry_click(
(By.LINK_TEXT,
diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py
index 413811dc2..3bcc5e8e4 100644
--- a/web/pgadmin/feature_tests/query_tool_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_tests.py
@@ -207,7 +207,6 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
ElementClickInterceptedException):
count += 1
pass
- print(count)
self._check_ondemand_result(row_id_to_find)
print("OK.", file=sys.stderr)
@@ -244,6 +243,7 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
def _check_ondemand_result(self, row_id_to_find):
# scroll to bottom to bring last row of next chunk in viewport.
scroll = 10
+ status = False
while scroll:
canvas_ele = self.page.find_by_css_selector('.grid-canvas')
scrolling_height = canvas_ele.size['height']
@@ -255,14 +255,18 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
# Table height takes some time to update, for which their is no
# particular way
time.sleep(2)
- if canvas_ele.size['height'] == scrolling_height:
+ if canvas_ele.size['height'] == scrolling_height and \
+ self.page.check_if_element_exist_by_xpath(
+ QueryToolLocators.output_column_data_xpath.format(
+ row_id_to_find)):
+ status = True
break
else:
scroll -= 1
- self.assertTrue(self.page.check_if_element_exist_by_xpath(
- QueryToolLocators.output_column_data_xpath.format(row_id_to_find)
- ))
+ self.assertTrue(
+ status, "Element is not loaded to the rows id: "
+ "{}".format(row_id_to_find))
def _query_tool_explain_with_verbose_and_cost(self):
query = """-- Explain query with verbose and cost
@@ -372,11 +376,7 @@ CREATE TABLE public.{}();""".format(table_name)
-- 3. ROLLBACK transaction.
-- 4. Check if table is *NOT* created.
ROLLBACK;"""
- self.page.fill_codemirror_area_with(query)
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
-
- self.page.wait_for_query_tool_loading_indicator_to_disappear()
+ self.page.execute_query(query)
self.page.click_tab('Messages')
self.assertTrue(self.page.check_if_element_exist_by_xpath(
QueryToolLocators.sql_editor_message.format('ROLLBACK')),
@@ -389,11 +389,8 @@ ROLLBACK;"""
-- 4. Check if table is *NOT* created.
SELECT relname FROM pg_class
WHERE relkind IN ('r','s','t') and relnamespace = 2200::oid;"""
- self.page.fill_codemirror_area_with(query)
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
- self.page.wait_for_query_tool_loading_indicator_to_disappear()
+ self.page.execute_query(query)
self.page.click_tab('Data Output')
canvas = self.wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css)))
@@ -411,11 +408,7 @@ SELECT relname FROM pg_class
-- 3. ROLLBACK transaction.
-- 4. Check if table is *NOT* created.
ROLLBACK;"""
- self.page.fill_codemirror_area_with(query)
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
-
- self.page.wait_for_query_tool_loading_indicator_to_disappear()
+ self.page.execute_query(query)
def _query_tool_auto_commit_enabled(self):
query = """-- 1. Enable auto commit.
@@ -481,10 +474,8 @@ ROLLBACK;"""
-- 5. Check if table is created event after ROLLBACK.
SELECT relname FROM pg_class
WHERE relkind IN ('r','s','t') and relnamespace = 2200::oid;"""
- self.page.fill_codemirror_area_with(query)
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
+ self.page.execute_query(query)
self.page.click_tab('Data Output')
self.page.wait_for_query_tool_loading_indicator_to_disappear()
diff --git a/web/pgadmin/feature_tests/table_ddl_feature_test.py b/web/pgadmin/feature_tests/table_ddl_feature_test.py
index 26f231ef9..7430ca95c 100644
--- a/web/pgadmin/feature_tests/table_ddl_feature_test.py
+++ b/web/pgadmin/feature_tests/table_ddl_feature_test.py
@@ -12,6 +12,7 @@ import random
from regression.feature_utils.base_feature_test import BaseFeatureTest
from regression.python_test_utils import test_utils
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
class TableDdlFeatureTest(BaseFeatureTest):
@@ -38,7 +39,9 @@ class TableDdlFeatureTest(BaseFeatureTest):
self.page.toggle_open_tables_node(
self.server['name'], self.server['db_password'],
self.test_db, 'public')
- self.page.select_tree_item(self.test_table_name)
+ self.page.click_a_tree_node(
+ self.test_table_name,
+ TreeAreaLocators.sub_nodes_of_tables_node)
self.page.click_tab("SQL")
# Wait till data is displayed in SQL Tab
diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py
index 6ea8d506c..02a449971 100644
--- a/web/pgadmin/feature_tests/view_data_dml_queries.py
+++ b/web/pgadmin/feature_tests/view_data_dml_queries.py
@@ -21,6 +21,7 @@ from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from regression.feature_utils.locators import QueryToolLocators, \
NavMenuLocators
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
@@ -167,7 +168,9 @@ CREATE TABLE public.nonintpkey
config_data = config_data_json[config_key]
def _perform_test_for_table(self, table_name):
- self.page.select_tree_item(table_name)
+ self.page.click_a_tree_node(
+ table_name,
+ TreeAreaLocators.sub_nodes_of_tables_node)
# Open Object -> View/Edit data
self._view_data_grid(table_name)
@@ -354,7 +357,11 @@ CREATE TABLE public.nonintpkey
# scroll browser back to the left
# to reset position so other assertions can succeed
- for idx in reversed(list(config_check_data.keys())):
+ list_item = list(config_check_data.keys())
+ for item in range(0, len(list_item)):
+ list_item[item] = int(list_item[item])
+ list_item.sort(reverse=True)
+ for idx in list_item:
time.sleep(0.4)
element = result_row.find_element_by_class_name("r" + str(idx))
self.page.driver.execute_script(
diff --git a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
index aed1f36f1..15aad7be9 100644
--- a/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_panels_and_query_tool_test.py
@@ -16,6 +16,7 @@ from regression.feature_utils.base_feature_test import BaseFeatureTest
from selenium.webdriver import ActionChains
from selenium.common.exceptions import StaleElementReferenceException
from regression.feature_utils.locators import QueryToolLocators
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
class CheckForXssFeatureTest(BaseFeatureTest):
@@ -100,7 +101,9 @@ class CheckForXssFeatureTest(BaseFeatureTest):
self.page.toggle_open_tables_node(self.server['name'],
self.server['db_password'],
self.test_db, 'public')
- self.page.select_tree_item(self.test_table_name)
+ self.page.click_a_tree_node(
+ self.test_table_name,
+ TreeAreaLocators.sub_nodes_of_tables_node)
def _check_xss_in_browser_tree(self):
print(
diff --git a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
index b42d3f12d..6af1af82e 100644
--- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
@@ -14,6 +14,7 @@ from selenium.webdriver import ActionChains
from selenium.common.exceptions import TimeoutException
from regression.python_test_utils import test_utils
from regression.feature_utils.base_feature_test import BaseFeatureTest
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
@@ -65,7 +66,9 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
self.server['db_password'],
self.test_db, 'public')
self.page.toggle_open_function_node()
- self.page.select_tree_item(self.function_name + "()")
+ self.page.click_a_tree_node(
+ self.function_name + "()",
+ TreeAreaLocators.sub_nodes_of_functions_node)
def _debug_function(self):
self.page.driver.find_element_by_link_text("Object").click()
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index ac1e25fcd..a1735b152 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -245,6 +245,36 @@ class PgadminPage:
if attempts == 0:
raise Exception(e)
+ def click_a_tree_node(self, element_name, list_of_element):
+ """It will click a tree node eg. server, schema, table name etc
+ will take server name and list of element where this node lies"""
+ operation_status = False
+ elements = list_of_element = self.find_by_xpath_list(
+ list_of_element)
+ if len(elements) > 0:
+ index_of_element = self.get_index_of_element(
+ elements, element_name)
+ if index_of_element >= 0:
+ self.driver.execute_script(
+ "arguments[0].scrollIntoView()",
+ list_of_element[index_of_element])
+ self.wait_for_elements_to_appear(
+ self.driver, list_of_element[index_of_element])
+ time.sleep(1)
+ self.driver.execute_script(
+ "arguments[0].click()",
+ list_of_element[index_of_element])
+ operation_status = True
+ else:
+ print("{ERROR} - The required element with name: " + str(
+ element_name) +
+ " is not found in function click_a_tree_node, "
+ "so click operation is not performed")
+ else:
+ print("{ERROR} - The element list passed to function "
+ "click_a_tree_node seems empty")
+ return operation_status
+
def toggle_open_servers_group(self):
"""This will open Servers group to display underlying nodes"""
is_expanded = False
diff --git a/web/regression/feature_utils/tree_area_locators.py b/web/regression/feature_utils/tree_area_locators.py
index 0b98e7547..3c4e8e5d4 100644
--- a/web/regression/feature_utils/tree_area_locators.py
+++ b/web/regression/feature_utils/tree_area_locators.py
@@ -48,6 +48,11 @@ class TreeAreaLocators():
"contains(text(),'Tables')]]]]]]]]]]/" \
"following-sibling::ul/li/div//div/span[2]/span[2]"
+ sub_nodes_of_functions_node = \
+ "//div[div[div[div[div[div[div[div[span[span[" \
+ "contains(text(),'Functions')]]]]]]]]]]/" \
+ "following-sibling::ul/li/div//div/span[2]/span[2]"
+
@staticmethod
def sub_nodes_of_a_server_node(server_name):
xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \
diff --git a/web/regression/python_test_utils/test_gui_helper.py b/web/regression/python_test_utils/test_gui_helper.py
index 7515ee158..aaa9707b7 100644
--- a/web/regression/python_test_utils/test_gui_helper.py
+++ b/web/regression/python_test_utils/test_gui_helper.py
@@ -45,7 +45,7 @@ def close_bgprocess_popup(tester):
def close_process_watcher(tester):
- attempt = 5
+ attempt = 10
while attempt > 0:
close_btn = tester.page.find_by_xpath(
NavMenuLocators.process_watcher_close_button_xpath)
diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py
index 2e8a0eb8c..56d5cb0f9 100644
--- a/web/regression/python_test_utils/test_utils.py
+++ b/web/regression/python_test_utils/test_utils.py
@@ -820,6 +820,7 @@ def reset_layout_db(user_id=None):
'("Browser/Layout", "SQLEditor/Layout", "Debugger/Layout")'
' AND USER_ID=?', user_id
)
+ cur.execute('DELETE FROM process')
conn.commit()
conn.close()
break
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
@ 2019-11-13 05:49 ` Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Akshay Joshi @ 2019-11-13 05:49 UTC (permalink / raw)
To: Shubham Agarwal <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
[email protected]> wrote:
> Hi Team,
> PFA patch containing some more fixes for random feature test failures.
>
> Thanks and regards,
> Shubham Agarwal
>
> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
> [email protected]> wrote:
>
>> Thanks, patch applied with a minor change. Menu for 'Delete Drop' server
>> has been changed to 'Remove Server' which causes all the test cases failing
>> on my machine.
>>
>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>>
>>> Attached is the patch containing fixes for the failed feature test cases.
>>> This patch contains-
>>> 1. Newly created function for traversing the browser tree.
>>> 2. Some synchronization issue fixes.
>>> 3. Modified locators.
>>> 4. Test cases fix for the recent commits.
>>>
>>> --
>>> Thanks & Regards,
>>> Shubham Agarwal
>>> EnterpriseDB Corporation
>>>
>>> The Postgres Database Company
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>>
>> *Sr. Software Architect*
>> *EnterpriseDB Software India Private Limited*
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> Thanks & Regards,
> Shubham Agarwal
> EnterpriseDB Corporation
>
> The Postgres Database Company
>
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
@ 2019-11-15 12:29 ` Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Shubham Agarwal @ 2019-11-15 12:29 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Team,
PFA feature test fixture patch containing the following fixes:
1. Process watcher loading logs fix
2. Auto commit/rollback issue in query_tool_tests
3. Fixed the scrolling issue while verifying values in a table.
4. Modified some functions in pgadmin_page.py
On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied.
>
> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
> [email protected]> wrote:
>
>> Hi Team,
>> PFA patch containing some more fixes for random feature test failures.
>>
>> Thanks and regards,
>> Shubham Agarwal
>>
>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop' server
>>> has been changed to 'Remove Server' which causes all the test cases failing
>>> on my machine.
>>>
>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>> [email protected]> wrote:
>>>
>>>> Hi Team,
>>>>
>>>> Attached is the patch containing fixes for the failed feature test
>>>> cases.
>>>> This patch contains-
>>>> 1. Newly created function for traversing the browser tree.
>>>> 2. Some synchronization issue fixes.
>>>> 3. Modified locators.
>>>> 4. Test cases fix for the recent commits.
>>>>
>>>> --
>>>> Thanks & Regards,
>>>> Shubham Agarwal
>>>> EnterpriseDB Corporation
>>>>
>>>> The Postgres Database Company
>>>>
>>>
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>>
>>> *Sr. Software Architect*
>>> *EnterpriseDB Software India Private Limited*
>>> *Mobile: +91 976-788-8246*
>>>
>>
>>
>> --
>> Thanks & Regards,
>> Shubham Agarwal
>> EnterpriseDB Corporation
>>
>> The Postgres Database Company
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
>
> *Sr. Software Architect*
> *EnterpriseDB Software India Private Limited*
> *Mobile: +91 976-788-8246*
>
--
Thanks & Regards,
Shubham Agarwal
EnterpriseDB Corporation
The Postgres Database Company
Attachments:
[application/octet-stream] feature_test_fix_v3.patch (19.3K, 3-feature_test_fix_v3.patch)
download | inline diff:
diff --git a/web/pgadmin/feature_tests/file_manager_test.py b/web/pgadmin/feature_tests/file_manager_test.py
index c76f20386..6e4f52e1d 100644
--- a/web/pgadmin/feature_tests/file_manager_test.py
+++ b/web/pgadmin/feature_tests/file_manager_test.py
@@ -15,6 +15,7 @@ import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException, \
TimeoutException
from regression.feature_utils.base_feature_test import BaseFeatureTest
@@ -83,7 +84,7 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
self.page.find_by_css_selector('.change_file_types')
self.page.fill_input_by_css_selector(
QueryToolLocators.input_file_path_css,
- "/tmp/", key_after_input=Keys.RETURN)
+ "/tmp", key_after_input=Keys.RETURN)
if self.page.driver.capabilities['browserName'] == 'firefox':
table = self.page.wait_for_element_to_reload(
@@ -91,6 +92,12 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
QueryToolLocators.select_file_content_css)
)
else:
+ self.wait.until(EC.visibility_of_element_located(
+ (By.CSS_SELECTOR, QueryToolLocators.select_file_content_css)))
+ self.wait.until(lambda element:
+ self.page.driver.find_element_by_css_selector(
+ '[name=home]').is_enabled())
+
table = self.page.driver.find_element_by_css_selector(
QueryToolLocators.select_file_content_css)
retry_count = 0
@@ -113,7 +120,8 @@ class CheckFileManagerFeatureTest(BaseFeatureTest):
# For XSS we need to search against element's html code
assert source_code.find(
string_to_find
- ) != -1, "{0} might be vulnerable to XSS ".format(source)
+ ) != -1, "{0} might be vulnerable to XSS, source code is: {1}".format(
+ source, source_code)
def _check_file_sorting(self):
load_file = self.page.find_by_css_selector(
diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
index cc2e89b59..5ae86734c 100644
--- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
@@ -108,16 +108,17 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
status = test_utils.get_watcher_dialogue_status(self)
- if status != "Successfully completed.":
- test_gui_helper.close_bgprocess_popup(self)
-
- self.assertEquals(status, "Successfully completed.")
-
self.page.retry_click(
(By.CSS_SELECTOR,
NavMenuLocators.status_alertifier_more_btn_css),
(By.XPATH,
NavMenuLocators.process_watcher_alertfier))
+ self.page.wait_for_element_to_disappear(
+ lambda driver: driver.find_element_by_css_selector(".loading-logs")
+ )
+
+ if status != "Successfully completed.":
+ self.assertEquals(status, "Successfully completed.")
backup_file = None
# Check for XSS in Backup details
@@ -177,16 +178,17 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
status = test_utils.get_watcher_dialogue_status(self)
- if status != "Successfully completed.":
- test_gui_helper.close_bgprocess_popup(self)
-
- self.assertEquals(status, "Successfully completed.")
-
self.page.retry_click(
(By.CSS_SELECTOR,
NavMenuLocators.status_alertifier_more_btn_css),
(By.XPATH,
NavMenuLocators.process_watcher_alertfier))
+ self.page.wait_for_element_to_disappear(
+ lambda driver: driver.find_element_by_css_selector(".loading-logs")
+ )
+
+ if status != "Successfully completed.":
+ self.assertEquals(status, "Successfully completed.")
# Check for XSS in Restore details
if self.is_xss_check:
diff --git a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
index 728323b49..0e6586d0e 100644
--- a/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_maintenance_test.py
@@ -26,19 +26,19 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
scenarios = [
("Test for PG maintenance: database", dict(
- database_name='pg_maintenance',
- table_name='pg_maintenance_table',
+ database_name='pg_maintenance_',
+ table_name='table_',
test_level='database',
is_xss_check=False,
)),
("Test for PG maintenance: table", dict(
- database_name='pg_maintenance',
- table_name='pg_maintenance_table',
+ database_name='pg_maintenance_',
+ table_name='table_',
test_level='table',
is_xss_check=False,
)),
("Test for XSS in maintenance dialog", dict(
- database_name='pg_maintenance',
+ database_name='pg_maintenance_',
table_name='<h1>test_me</h1>',
test_level='table',
is_xss_check=True,
@@ -67,7 +67,9 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
self.server['sslmode']
)
- self.table_name = self.table_name + str(random.randint(1000, 3000))
+ self.table_name = self.table_name + str(random.randint(100, 1000))
+ self.database_name = \
+ self.database_name + str(random.randint(100, 1000))
test_utils.drop_database(connection, self.database_name)
test_utils.create_database(self.server, self.database_name)
test_utils.create_table(self.server, self.database_name,
@@ -87,7 +89,6 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR,
NavMenuLocators.bcg_process_status_alertifier_css)))
-
self.verify_command()
def _open_maintenance_dialogue(self):
@@ -101,9 +102,18 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
self.page.toggle_open_tables_node(self.server['name'],
self.server['db_password'],
self.database_name, 'public')
- self.page.click_a_tree_node(
- self.table_name,
- TreeAreaLocators.sub_nodes_of_tables_node)
+ retry = 5
+ status = False
+ while retry > 0:
+ status = self.page.click_a_tree_node(
+ self.table_name,
+ TreeAreaLocators.sub_nodes_of_tables_node)
+ if status:
+ break
+ else:
+ retry -= 1
+ self.assertTrue(status, "Table name {} is not selected".format(
+ self.table_name))
self.page.retry_click(
(By.LINK_TEXT,
@@ -118,17 +128,17 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
def verify_command(self):
status = test_utils.get_watcher_dialogue_status(self)
- if status != "Successfully completed.":
-
- test_gui_helper.close_bgprocess_popup(self)
-
- self.assertEquals(status, "Successfully completed.")
-
self.page.retry_click(
(By.CSS_SELECTOR,
NavMenuLocators.status_alertifier_more_btn_css),
(By.XPATH,
NavMenuLocators.process_watcher_alertfier))
+ self.page.wait_for_element_to_disappear(
+ lambda driver: driver.find_element_by_css_selector(".loading-logs")
+ )
+
+ if status != "Successfully completed.":
+ self.assertEquals(status, "Successfully completed.")
command = self.page.find_by_css_selector(
NavMenuLocators.
@@ -158,9 +168,9 @@ class PGUtilitiesMaintenanceFeatureTest(BaseFeatureTest):
def after(self):
test_gui_helper.close_bgprocess_popup(self)
- self.page.remove_server(self.server)
test_utils.delete_table(self.server, self.database_name,
self.table_name)
+ self.page.remove_server(self.server)
connection = test_utils.get_db_connection(
self.server['db'],
self.server['username'],
diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py
index 3bcc5e8e4..a0f350320 100644
--- a/web/pgadmin/feature_tests/query_tool_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_tests.py
@@ -135,18 +135,10 @@ class QueryToolFeatureTest(BaseFeatureTest):
query_op.click()
# disable auto rollback only if they are enabled
- btn = self.page.find_by_css_selector(
- QueryToolLocators.btn_auto_rollback)
- check = btn.find_element_by_tag_name('i')
- if 'visibility-hidden' not in check.get_attribute('class'):
- btn.click()
+ self.uncheck_execute_option('auto_rollback')
# enable autocommit only if it's disabled
- btn = self.page.find_by_css_selector(
- QueryToolLocators.btn_auto_commit)
- check = btn.find_element_by_tag_name('i')
- if 'visibility-hidden' in check.get_attribute('class'):
- btn.click()
+ self.check_execute_option('auto_commit')
# close menu
query_op.click()
@@ -181,8 +173,7 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
print("On demand result set on grid select all... ",
file=sys.stderr, end="")
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
+ self.page.click_execute_query_button()
# wait for header of the table to be visible
canvas = self.page.find_by_css_selector(
@@ -213,8 +204,7 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
print("On demand result set on column select all... ",
file=sys.stderr, end="")
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
+ self.page.click_execute_query_button()
self.page.wait_for_query_tool_loading_indicator_to_disappear()
@@ -349,18 +339,16 @@ CREATE TABLE public.{}();""".format(table_name)
self.page.fill_codemirror_area_with(query)
- # open auto commit option and disable it
+ # disable auto commit option
query_op = self.page.find_by_css_selector(
QueryToolLocators.btn_query_dropdown)
query_op.click()
- self.page.find_by_css_selector(
- QueryToolLocators.btn_auto_commit).click()
+ self.uncheck_execute_option('auto_commit')
# close option
query_op.click()
# execute query
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
+ self.page.click_execute_query_button()
self.page.wait_for_query_tool_loading_indicator_to_disappear()
self.page.click_tab('Messages')
@@ -424,13 +412,12 @@ END;"""
QueryToolLocators.btn_query_dropdown)
query_op.click()
- self.page.find_by_css_selector(
- QueryToolLocators.btn_auto_commit).click()
+ # Enable auto_commit if it is disabled
+ self.check_execute_option('auto_commit')
query_op.click()
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
+ self.page.click_execute_query_button()
self.page.wait_for_query_tool_loading_indicator_to_disappear()
@@ -504,14 +491,13 @@ END;"""
QueryToolLocators.btn_query_dropdown)
query_op.click()
- # uncheckt auto commit and check auto-rollback
+ # uncheck auto commit and check auto-rollback
self.uncheck_execute_option('auto_commit')
self.check_execute_option('auto_rollback')
query_op.click()
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
+ self.page.click_execute_query_button()
self.page.wait_for_query_tool_loading_indicator_to_disappear()
self.page.clear_query_tool()
@@ -606,11 +592,20 @@ SELECT 1, pg_sleep(300)"""
self.uncheck_execute_option('auto_rollback')
# close drop down
query_op.click()
+ # Execute query
+ retry = 5
+ execute_button = self.page.find_by_css_selector(
+ QueryToolLocators.btn_execute_query_css)
+ while retry > 0:
+ execute_button.click()
+ if self.page.wait_for_query_tool_loading_indicator_to_appear():
+ break
+ else:
+ retry -= 1
+ # Providing a second of sleep since clicks on the execute and stop
+ # query button is too quick that the query is not able run properly
+ time.sleep(1)
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
-
- self.page.find_by_xpath("//*[@id='fetching_data']")
self.page.find_by_css_selector(
QueryToolLocators.btn_cancel_query).click()
self.page.wait_for_query_tool_loading_indicator_to_disappear()
diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py
index 02a449971..14591cdae 100644
--- a/web/pgadmin/feature_tests/view_data_dml_queries.py
+++ b/web/pgadmin/feature_tests/view_data_dml_queries.py
@@ -308,7 +308,11 @@ CREATE TABLE public.nonintpkey
self._verify_row_data(False, updated_row_data)
def _add_update_save_row(self, data, row=1):
- for idx in data.keys():
+ items = list(data.keys())
+ for item in range(0, len(items)):
+ items[item] = int(items[item])
+ items.sort(reverse=False)
+ for idx in items:
cell_xpath = CheckForViewDataTest._get_cell_xpath(
'r' + str(idx), row
)
@@ -347,9 +351,21 @@ CREATE TABLE public.nonintpkey
result_row = self.page.find_by_xpath(xpath)
- # List of row values in an array
- for idx in config_check_data.keys():
- element = result_row.find_element_by_class_name("r" + str(idx))
+ # Verify the List of actual values with the expected list
+ actual_list = list(config_check_data.keys())
+ for value in range(0, len(actual_list)):
+ actual_list[value] = int(actual_list[value])
+ actual_list.sort(reverse=False)
+ retry = 5
+ for idx in actual_list:
+ while retry > 0:
+ try:
+ element = \
+ result_row.find_element_by_class_name("r" + str(idx))
+ break
+ except Exception:
+ print("stale reference exception at id:", idx)
+ retry -= 1
self.page.driver.execute_script(
"arguments[0].scrollIntoView(false)", element)
time.sleep(0.4)
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index a1735b152..61aa4cf5a 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -176,6 +176,18 @@ class PgadminPage:
execute_button.click()
self.wait_for_query_tool_loading_indicator_to_disappear()
+ def click_execute_query_button(self):
+ retry = 5
+ execute_button = self.find_by_css_selector(
+ QueryToolLocators.btn_execute_query_css)
+ while retry > 0:
+ execute_button.click()
+ if self.wait_for_query_tool_loading_indicator_to_appear():
+ break
+ else:
+ retry -= 1
+ self.wait_for_query_tool_loading_indicator_to_disappear()
+
def check_execute_option(self, option):
""""This function will check auto commit or auto roll back based on
user input. If button is already checked, no action will be taken"""
@@ -394,6 +406,7 @@ class PgadminPage:
name_of_database):
"""will expand database node under databases node"""
db_node_expanded_status = False
+ retry = 5
if self.expand_databases_node(server_name, server_password):
sub_nodes_of_databases_node = self.find_by_xpath_list(
TreeAreaLocators.sub_nodes_of_databases_node(server_name))
@@ -410,9 +423,17 @@ class PgadminPage:
self.driver.execute_script("arguments[0].scrollIntoView()",
sub_nodes_of_databases_node[
index_of_required_db_node])
- webdriver.ActionChains(self.driver).double_click(
- sub_nodes_of_databases_node[
- index_of_required_db_node]).perform()
+ while retry > 0:
+ webdriver.ActionChains(self.driver).double_click(
+ sub_nodes_of_databases_node[
+ index_of_required_db_node]).perform()
+ if self.check_if_element_exist_by_xpath(
+ "//div[@class='ajs-header'and text()='INTERNAL SERVER "
+ "ERROR']", 1):
+ self.click_modal('OK')
+ retry -= 1
+ else:
+ break
if self.wait_for_elements_to_appear(
self.driver, TreeAreaLocators.
sub_nodes_of_database_node(
@@ -935,7 +956,7 @@ class PgadminPage:
return False
return True
- except NoSuchElementException:
+ except (NoSuchElementException, StaleElementReferenceException):
return True
return self._wait_for("element to disappear", element_if_it_disappears)
@@ -976,9 +997,10 @@ class PgadminPage:
self._wait_for("spinner to disappear", spinner_has_disappeared, 20)
def wait_for_query_tool_loading_indicator_to_appear(self):
- self.check_if_element_exist_by_xpath(
+ status = self.check_if_element_exist_by_xpath(
"//div[@id='editor-panel']//"
- "div[@class='pg-sp-container sql-editor-busy-fetching']")
+ "div[@class='pg-sp-container sql-editor-busy-fetching']", 1)
+ return status
def wait_for_app(self):
def page_shows_app(driver):
diff --git a/web/regression/runtests.py b/web/regression/runtests.py
index 540eae65e..8c52753f3 100644
--- a/web/regression/runtests.py
+++ b/web/regression/runtests.py
@@ -234,6 +234,8 @@ def get_test_modules(arguments):
if 'headless_chrome' in test_setup.config_data:
if test_setup.config_data['headless_chrome']:
options.add_argument("--headless")
+ options.add_argument("--no-sandbox")
+ options.add_argument("--disable-setuid-sandbox")
options.add_argument("--window-size=1280,1024")
options.add_argument("--disable-infobars")
options.add_experimental_option('w3c', False)
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
@ 2019-11-15 12:33 ` Akshay Joshi <[email protected]>
2019-11-20 07:03 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Akshay Joshi @ 2019-11-15 12:33 UTC (permalink / raw)
To: Shubham Agarwal <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied
On Fri, Nov 15, 2019 at 5:59 PM Shubham Agarwal <
[email protected]> wrote:
> Hi Team,
>
> PFA feature test fixture patch containing the following fixes:
> 1. Process watcher loading logs fix
> 2. Auto commit/rollback issue in query_tool_tests
> 3. Fixed the scrolling issue while verifying values in a table.
> 4. Modified some functions in pgadmin_page.py
>
> On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <
> [email protected]> wrote:
>
>> Thanks, patch applied.
>>
>> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>> PFA patch containing some more fixes for random feature test failures.
>>>
>>> Thanks and regards,
>>> Shubham Agarwal
>>>
>>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop'
>>>> server has been changed to 'Remove Server' which causes all the test cases
>>>> failing on my machine.
>>>>
>>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Team,
>>>>>
>>>>> Attached is the patch containing fixes for the failed feature test
>>>>> cases.
>>>>> This patch contains-
>>>>> 1. Newly created function for traversing the browser tree.
>>>>> 2. Some synchronization issue fixes.
>>>>> 3. Modified locators.
>>>>> 4. Test cases fix for the recent commits.
>>>>>
>>>>> --
>>>>> Thanks & Regards,
>>>>> Shubham Agarwal
>>>>> EnterpriseDB Corporation
>>>>>
>>>>> The Postgres Database Company
>>>>>
>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect*
>>>> *EnterpriseDB Software India Private Limited*
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>>
>>> --
>>> Thanks & Regards,
>>> Shubham Agarwal
>>> EnterpriseDB Corporation
>>>
>>> The Postgres Database Company
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>>
>> *Sr. Software Architect*
>> *EnterpriseDB Software India Private Limited*
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> Thanks & Regards,
> Shubham Agarwal
> EnterpriseDB Corporation
>
> The Postgres Database Company
>
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
@ 2019-11-20 07:03 ` Shubham Agarwal <[email protected]>
2019-11-20 07:39 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Shubham Agarwal @ 2019-11-20 07:03 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
PFA feature test fixture patch containing the following things:
1. Added an attribute 'data-click-counter' in query execute button which
gets incremented once query button is clicked up to 9 and then reset to 0.
This is added just to support automation.
2. Locator for login_group_role is added and used to expand tree.
3. Functions for enabling and disable auto_commit and auto_rollback are
made more precise.
4. Some scrolling problem is addressed in view_data_dml_query test.
5. Handled the stale element reference exception in query_tool_journey_test
Regards,
Shubham Agarwal
On Fri, Nov 15, 2019 at 6:03 PM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied
>
> On Fri, Nov 15, 2019 at 5:59 PM Shubham Agarwal <
> [email protected]> wrote:
>
>> Hi Team,
>>
>> PFA feature test fixture patch containing the following fixes:
>> 1. Process watcher loading logs fix
>> 2. Auto commit/rollback issue in query_tool_tests
>> 3. Fixed the scrolling issue while verifying values in a table.
>> 4. Modified some functions in pgadmin_page.py
>>
>> On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Thanks, patch applied.
>>>
>>> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
>>> [email protected]> wrote:
>>>
>>>> Hi Team,
>>>> PFA patch containing some more fixes for random feature test failures.
>>>>
>>>> Thanks and regards,
>>>> Shubham Agarwal
>>>>
>>>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop'
>>>>> server has been changed to 'Remove Server' which causes all the test cases
>>>>> failing on my machine.
>>>>>
>>>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Team,
>>>>>>
>>>>>> Attached is the patch containing fixes for the failed feature test
>>>>>> cases.
>>>>>> This patch contains-
>>>>>> 1. Newly created function for traversing the browser tree.
>>>>>> 2. Some synchronization issue fixes.
>>>>>> 3. Modified locators.
>>>>>> 4. Test cases fix for the recent commits.
>>>>>>
>>>>>> --
>>>>>> Thanks & Regards,
>>>>>> Shubham Agarwal
>>>>>> EnterpriseDB Corporation
>>>>>>
>>>>>> The Postgres Database Company
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Thanks & Regards*
>>>>> *Akshay Joshi*
>>>>>
>>>>> *Sr. Software Architect*
>>>>> *EnterpriseDB Software India Private Limited*
>>>>> *Mobile: +91 976-788-8246*
>>>>>
>>>>
>>>>
>>>> --
>>>> Thanks & Regards,
>>>> Shubham Agarwal
>>>> EnterpriseDB Corporation
>>>>
>>>> The Postgres Database Company
>>>>
>>>
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>>
>>> *Sr. Software Architect*
>>> *EnterpriseDB Software India Private Limited*
>>> *Mobile: +91 976-788-8246*
>>>
>>
>>
>> --
>> Thanks & Regards,
>> Shubham Agarwal
>> EnterpriseDB Corporation
>>
>> The Postgres Database Company
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
>
> *Sr. Software Architect*
> *EnterpriseDB Software India Private Limited*
> *Mobile: +91 976-788-8246*
>
--
Thanks & Regards,
Shubham Agarwal
EnterpriseDB Corporation
The Postgres Database Company
Attachments:
[application/octet-stream] feature_test_fix_v4.patch (15.9K, 3-feature_test_fix_v4.patch)
download | inline diff:
diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py
index 88d30a1c1..216de6926 100644
--- a/web/pgadmin/feature_tests/query_tool_journey_test.py
+++ b/web/pgadmin/feature_tests/query_tool_journey_test.py
@@ -429,7 +429,12 @@ class QueryToolJourneyTest(BaseFeatureTest):
ActionChains(self.driver).double_click(cell_el).perform()
ActionChains(self.driver).send_keys(new_value). \
send_keys(Keys.ENTER).perform()
+
# Check if the value was updated
+ # Finding element again to avoid stale element reference exception
+ cell_el = self.page.find_by_xpath(
+ "//div[contains(@style, 'top:0px')]//div[contains(@class, "
+ "'l{0} r{1}')]".format(cell_index, cell_index))
return int(cell_el.text) == new_value
def _check_can_add_row(self):
@@ -438,6 +443,8 @@ class QueryToolJourneyTest(BaseFeatureTest):
def after(self):
self.page.close_query_tool()
- self.page.remove_server(self.server)
test_utils.delete_table(
self.server, self.test_db, self.test_table_name)
+ test_utils.delete_table(
+ self.server, self.test_db, self.test_editable_table_name)
+ self.page.remove_server(self.server)
diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py
index a0f350320..de6c479f5 100644
--- a/web/pgadmin/feature_tests/query_tool_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_tests.py
@@ -135,10 +135,10 @@ class QueryToolFeatureTest(BaseFeatureTest):
query_op.click()
# disable auto rollback only if they are enabled
- self.uncheck_execute_option('auto_rollback')
+ self.page.uncheck_execute_option('auto_rollback')
# enable autocommit only if it's disabled
- self.check_execute_option('auto_commit')
+ self.page.check_execute_option('auto_commit')
# close menu
query_op.click()
@@ -343,7 +343,7 @@ CREATE TABLE public.{}();""".format(table_name)
query_op = self.page.find_by_css_selector(
QueryToolLocators.btn_query_dropdown)
query_op.click()
- self.uncheck_execute_option('auto_commit')
+ self.page.uncheck_execute_option('auto_commit')
# close option
query_op.click()
@@ -413,7 +413,7 @@ END;"""
query_op.click()
# Enable auto_commit if it is disabled
- self.check_execute_option('auto_commit')
+ self.page.check_execute_option('auto_commit')
query_op.click()
@@ -492,8 +492,8 @@ END;"""
query_op.click()
# uncheck auto commit and check auto-rollback
- self.uncheck_execute_option('auto_commit')
- self.check_execute_option('auto_rollback')
+ self.page.uncheck_execute_option('auto_commit')
+ self.page.check_execute_option('auto_rollback')
query_op.click()
@@ -588,8 +588,8 @@ SELECT 1, pg_sleep(300)"""
query_op.click()
# enable auto-commit and disable auto-rollback
- self.check_execute_option('auto_commit')
- self.uncheck_execute_option('auto_rollback')
+ self.page.check_execute_option('auto_commit')
+ self.page.uncheck_execute_option('auto_rollback')
# close drop down
query_op.click()
# Execute query
@@ -729,38 +729,6 @@ SELECT 1, pg_sleep(300)"""
self.page.clear_query_tool()
- def check_execute_option(self, option):
- """"This function will check auto commit or auto roll back based on
- user input. If button is already checked, no action will be taken"""
- if option == 'auto_commit':
- check_status = self.driver.find_element_by_css_selector(
- QueryToolLocators.btn_auto_commit_check_status)
- if 'visibility-hidden' in check_status.get_attribute('class'):
- self.page.find_by_css_selector(QueryToolLocators.
- btn_auto_commit).click()
- if option == 'auto_rollback':
- check_status = self.driver.find_element_by_css_selector(
- QueryToolLocators.btn_auto_rollback_check_status)
- if 'visibility-hidden' in check_status.get_attribute('class'):
- self.page.find_by_css_selector(QueryToolLocators.
- btn_auto_rollback).click()
-
- def uncheck_execute_option(self, option):
- """"This function will uncheck auto commit or auto roll back based on
- user input. If button is already unchecked, no action will be taken"""
- if option == 'auto_commit':
- check_status = self.driver.find_element_by_css_selector(
- QueryToolLocators.btn_auto_commit_check_status)
- if 'visibility-hidden' not in check_status.get_attribute('class'):
- self.page.find_by_css_selector(QueryToolLocators.
- btn_auto_commit).click()
- if option == 'auto_rollback':
- check_status = self.driver.find_element_by_css_selector(
- QueryToolLocators.btn_auto_rollback_check_status)
- if 'visibility-hidden' not in check_status.get_attribute('class'):
- self.page.find_by_css_selector(QueryToolLocators.
- btn_auto_rollback).click()
-
class WaitForAnyElementWithText(object):
def __init__(self, locator, text):
diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py
index 14591cdae..381be22dc 100644
--- a/web/pgadmin/feature_tests/view_data_dml_queries.py
+++ b/web/pgadmin/feature_tests/view_data_dml_queries.py
@@ -349,8 +349,6 @@ CREATE TABLE public.nonintpkey
self.page.wait_for_query_tool_loading_indicator_to_disappear()
- result_row = self.page.find_by_xpath(xpath)
-
# Verify the List of actual values with the expected list
actual_list = list(config_check_data.keys())
for value in range(0, len(actual_list)):
@@ -360,14 +358,15 @@ CREATE TABLE public.nonintpkey
for idx in actual_list:
while retry > 0:
try:
+ result_row = self.page.find_by_xpath(xpath)
element = \
result_row.find_element_by_class_name("r" + str(idx))
+ self.page.driver.execute_script(
+ "arguments[0].scrollIntoView(false)", element)
break
except Exception:
print("stale reference exception at id:", idx)
retry -= 1
- self.page.driver.execute_script(
- "arguments[0].scrollIntoView(false)", element)
time.sleep(0.4)
self.assertEquals(element.text, config_check_data[str(idx)][1])
diff --git a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
index ab4c4241e..3a6e09adb 100644
--- a/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_roles_control_test.py
@@ -13,6 +13,7 @@ import random
from regression.python_test_utils import test_utils
from regression.feature_utils.base_feature_test import BaseFeatureTest
from regression.feature_utils.locators import NavMenuLocators
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
@@ -61,7 +62,8 @@ class CheckRoleMembershipControlFeatureTest(BaseFeatureTest):
self.page.expand_server_node(
self.server['name'], self.server['db_password'])
self.page.toggle_open_tree_item('Login/Group Roles')
- self.page.select_tree_item(role)
+ self.page.click_a_tree_node(
+ role, TreeAreaLocators.sub_nodes_of_login_group_node)
def _check_role_membership_control(self):
self.page.driver.find_element_by_link_text(
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 9c05e641b..aaf5f91b5 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -240,7 +240,7 @@
</button>
<button id="btn-flash" data-test-selector="execute-refresh-button" type="button" class="btn btn-sm btn-secondary" style="width: 32px;"
title=""
- tabindex="0" disabled>
+ tabindex="0" data-click-counter="0" disabled>
<i class="fa fa-bolt sql-icon-lg" aria-hidden="true"></i>
</button>
<button id="btn-query-dropdown" type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split"
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 70d4bd348..9d9ab5c84 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -1653,6 +1653,10 @@ define('tools.querytool', [
// Callback function for the flash button click.
on_flash: function() {
+ let data_click_counter = $('#btn-flash').attr('data-click-counter');
+ data_click_counter = (parseInt(data_click_counter) + 1)%10;
+ $('#btn-flash').attr('data-click-counter', data_click_counter);
+
this.handler.history_query_source = QuerySources.EXECUTE;
queryToolActions.executeQuery(this.handler);
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index 61aa4cf5a..a754a3e25 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -180,9 +180,15 @@ class PgadminPage:
retry = 5
execute_button = self.find_by_css_selector(
QueryToolLocators.btn_execute_query_css)
+ first_click = execute_button.get_attribute('data-click-counter')
while retry > 0:
execute_button.click()
- if self.wait_for_query_tool_loading_indicator_to_appear():
+ execute_button = self.find_by_css_selector(
+ QueryToolLocators.btn_execute_query_css)
+ second_click = execute_button.get_attribute(
+ 'data-click-counter')
+ if first_click != second_click:
+ self.wait_for_query_tool_loading_indicator_to_appear()
break
else:
retry -= 1
@@ -191,34 +197,65 @@ class PgadminPage:
def check_execute_option(self, option):
""""This function will check auto commit or auto roll back based on
user input. If button is already checked, no action will be taken"""
+ retry = 3
if option == 'auto_commit':
check_status = self.driver.find_element_by_css_selector(
QueryToolLocators.btn_auto_commit_check_status)
if 'visibility-hidden' in check_status.get_attribute('class'):
- self.find_by_css_selector(
- QueryToolLocators.btn_auto_commit).click()
+ while retry > 0:
+ self.find_by_css_selector(
+ QueryToolLocators.btn_auto_commit).click()
+ time.sleep(0.2)
+ if 'visibility-hidden' not in \
+ check_status.get_attribute('class'):
+ break
+ else:
+ retry -= 1
+
if option == 'auto_rollback':
check_status = self.driver.find_element_by_css_selector(
QueryToolLocators.btn_auto_rollback_check_status)
if 'visibility-hidden' in check_status.get_attribute('class'):
- self.find_by_css_selector(
- QueryToolLocators.btn_auto_rollback).click()
+ while retry > 0:
+ self.find_by_css_selector(
+ QueryToolLocators.btn_auto_rollback).click()
+ time.sleep(0.2)
+ if 'visibility-hidden' not in \
+ check_status.get_attribute('class'):
+ break
+ else:
+ retry -= 1
def uncheck_execute_option(self, option):
""""This function will uncheck auto commit or auto roll back based on
user input. If button is already unchecked, no action will be taken"""
+ retry = 3
if option == 'auto_commit':
check_status = self.driver.find_element_by_css_selector(
QueryToolLocators.btn_auto_commit_check_status)
if 'visibility-hidden' not in check_status.get_attribute('class'):
- self.find_by_css_selector(
- QueryToolLocators.btn_auto_commit).click()
+ while retry > 0:
+ self.find_by_css_selector(
+ QueryToolLocators.btn_auto_commit).click()
+ time.sleep(0.2)
+ if 'visibility-hidden' in \
+ check_status.get_attribute('class'):
+ break
+ else:
+ retry -= 1
if option == 'auto_rollback':
check_status = self.driver.find_element_by_css_selector(
QueryToolLocators.btn_auto_rollback_check_status)
if 'visibility-hidden' not in check_status.get_attribute('class'):
- self.find_by_css_selector(
- QueryToolLocators.btn_auto_rollback).click()
+ while retry > 0:
+ self.find_by_css_selector(
+ QueryToolLocators.btn_auto_rollback).click()
+ time.sleep(0.2)
+ if 'visibility-hidden' in \
+ check_status.get_attribute('class'):
+ break
+ else:
+ retry -= 1
def close_data_grid(self):
self.driver.switch_to_default_content()
@@ -273,9 +310,7 @@ class PgadminPage:
self.wait_for_elements_to_appear(
self.driver, list_of_element[index_of_element])
time.sleep(1)
- self.driver.execute_script(
- "arguments[0].click()",
- list_of_element[index_of_element])
+ list_of_element[index_of_element].click()
operation_status = True
else:
print("{ERROR} - The required element with name: " + str(
@@ -430,7 +465,10 @@ class PgadminPage:
if self.check_if_element_exist_by_xpath(
"//div[@class='ajs-header'and text()='INTERNAL SERVER "
"ERROR']", 1):
- self.click_modal('OK')
+ try:
+ self.click_modal('OK')
+ except Exception:
+ pass
retry -= 1
else:
break
diff --git a/web/regression/feature_utils/tree_area_locators.py b/web/regression/feature_utils/tree_area_locators.py
index 3c4e8e5d4..e3dbb61ac 100644
--- a/web/regression/feature_utils/tree_area_locators.py
+++ b/web/regression/feature_utils/tree_area_locators.py
@@ -53,6 +53,10 @@ class TreeAreaLocators():
"contains(text(),'Functions')]]]]]]]]]]/" \
"following-sibling::ul/li/div//div/span[2]/span[2]"
+ sub_nodes_of_login_group_node = \
+ "//div[div[div[span[span[contains(text(),'Login/Group Roles')]]]]]" \
+ "/following::ul/li/div[@class='aciTreeLine']"
+
@staticmethod
def sub_nodes_of_a_server_node(server_name):
xpath = "//div[div[div[span[span[contains(text(),'%s')]]]]]/" \
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-20 07:03 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
@ 2019-11-20 07:39 ` Akshay Joshi <[email protected]>
2019-11-21 10:09 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Akshay Joshi @ 2019-11-20 07:39 UTC (permalink / raw)
To: Shubham Agarwal <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Wed, Nov 20, 2019 at 12:34 PM Shubham Agarwal <
[email protected]> wrote:
> Hi Team,
> PFA feature test fixture patch containing the following things:
>
> 1. Added an attribute 'data-click-counter' in query execute button which
> gets incremented once query button is clicked up to 9 and then reset to 0.
> This is added just to support automation.
> 2. Locator for login_group_role is added and used to expand tree.
> 3. Functions for enabling and disable auto_commit and auto_rollback are
> made more precise.
> 4. Some scrolling problem is addressed in view_data_dml_query test.
> 5. Handled the stale element reference exception in query_tool_journey_test
>
> Regards,
> Shubham Agarwal
>
> On Fri, Nov 15, 2019 at 6:03 PM Akshay Joshi <
> [email protected]> wrote:
>
>> Thanks, patch applied
>>
>> On Fri, Nov 15, 2019 at 5:59 PM Shubham Agarwal <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>>
>>> PFA feature test fixture patch containing the following fixes:
>>> 1. Process watcher loading logs fix
>>> 2. Auto commit/rollback issue in query_tool_tests
>>> 3. Fixed the scrolling issue while verifying values in a table.
>>> 4. Modified some functions in pgadmin_page.py
>>>
>>> On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Thanks, patch applied.
>>>>
>>>> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Team,
>>>>> PFA patch containing some more fixes for random feature test failures.
>>>>>
>>>>> Thanks and regards,
>>>>> Shubham Agarwal
>>>>>
>>>>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop'
>>>>>> server has been changed to 'Remove Server' which causes all the test cases
>>>>>> failing on my machine.
>>>>>>
>>>>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Team,
>>>>>>>
>>>>>>> Attached is the patch containing fixes for the failed feature test
>>>>>>> cases.
>>>>>>> This patch contains-
>>>>>>> 1. Newly created function for traversing the browser tree.
>>>>>>> 2. Some synchronization issue fixes.
>>>>>>> 3. Modified locators.
>>>>>>> 4. Test cases fix for the recent commits.
>>>>>>>
>>>>>>> --
>>>>>>> Thanks & Regards,
>>>>>>> Shubham Agarwal
>>>>>>> EnterpriseDB Corporation
>>>>>>>
>>>>>>> The Postgres Database Company
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Thanks & Regards*
>>>>>> *Akshay Joshi*
>>>>>>
>>>>>> *Sr. Software Architect*
>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>> *Mobile: +91 976-788-8246*
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Thanks & Regards,
>>>>> Shubham Agarwal
>>>>> EnterpriseDB Corporation
>>>>>
>>>>> The Postgres Database Company
>>>>>
>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect*
>>>> *EnterpriseDB Software India Private Limited*
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>>
>>> --
>>> Thanks & Regards,
>>> Shubham Agarwal
>>> EnterpriseDB Corporation
>>>
>>> The Postgres Database Company
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>>
>> *Sr. Software Architect*
>> *EnterpriseDB Software India Private Limited*
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> Thanks & Regards,
> Shubham Agarwal
> EnterpriseDB Corporation
>
> The Postgres Database Company
>
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-20 07:03 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-20 07:39 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
@ 2019-11-21 10:09 ` Shubham Agarwal <[email protected]>
2019-11-21 11:52 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Shubham Agarwal @ 2019-11-21 10:09 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
Attach is the patch for feature test fix containing the following:
1. Handled click event in query tool due to intermediate clicking issue.
2. Observed that the database is not getting created in a test case, so
failed the test case there only.
On Wed, Nov 20, 2019 at 1:09 PM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied.
>
> On Wed, Nov 20, 2019 at 12:34 PM Shubham Agarwal <
> [email protected]> wrote:
>
>> Hi Team,
>> PFA feature test fixture patch containing the following things:
>>
>> 1. Added an attribute 'data-click-counter' in query execute button which
>> gets incremented once query button is clicked up to 9 and then reset to 0.
>> This is added just to support automation.
>> 2. Locator for login_group_role is added and used to expand tree.
>> 3. Functions for enabling and disable auto_commit and auto_rollback are
>> made more precise.
>> 4. Some scrolling problem is addressed in view_data_dml_query test.
>> 5. Handled the stale element reference exception in
>> query_tool_journey_test
>>
>> Regards,
>> Shubham Agarwal
>>
>> On Fri, Nov 15, 2019 at 6:03 PM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Thanks, patch applied
>>>
>>> On Fri, Nov 15, 2019 at 5:59 PM Shubham Agarwal <
>>> [email protected]> wrote:
>>>
>>>> Hi Team,
>>>>
>>>> PFA feature test fixture patch containing the following fixes:
>>>> 1. Process watcher loading logs fix
>>>> 2. Auto commit/rollback issue in query_tool_tests
>>>> 3. Fixed the scrolling issue while verifying values in a table.
>>>> 4. Modified some functions in pgadmin_page.py
>>>>
>>>> On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Thanks, patch applied.
>>>>>
>>>>> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Team,
>>>>>> PFA patch containing some more fixes for random feature test failures.
>>>>>>
>>>>>> Thanks and regards,
>>>>>> Shubham Agarwal
>>>>>>
>>>>>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop'
>>>>>>> server has been changed to 'Remove Server' which causes all the test cases
>>>>>>> failing on my machine.
>>>>>>>
>>>>>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Hi Team,
>>>>>>>>
>>>>>>>> Attached is the patch containing fixes for the failed feature test
>>>>>>>> cases.
>>>>>>>> This patch contains-
>>>>>>>> 1. Newly created function for traversing the browser tree.
>>>>>>>> 2. Some synchronization issue fixes.
>>>>>>>> 3. Modified locators.
>>>>>>>> 4. Test cases fix for the recent commits.
>>>>>>>>
>>>>>>>> --
>>>>>>>> Thanks & Regards,
>>>>>>>> Shubham Agarwal
>>>>>>>> EnterpriseDB Corporation
>>>>>>>>
>>>>>>>> The Postgres Database Company
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> *Thanks & Regards*
>>>>>>> *Akshay Joshi*
>>>>>>>
>>>>>>> *Sr. Software Architect*
>>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Thanks & Regards,
>>>>>> Shubham Agarwal
>>>>>> EnterpriseDB Corporation
>>>>>>
>>>>>> The Postgres Database Company
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Thanks & Regards*
>>>>> *Akshay Joshi*
>>>>>
>>>>> *Sr. Software Architect*
>>>>> *EnterpriseDB Software India Private Limited*
>>>>> *Mobile: +91 976-788-8246*
>>>>>
>>>>
>>>>
>>>> --
>>>> Thanks & Regards,
>>>> Shubham Agarwal
>>>> EnterpriseDB Corporation
>>>>
>>>> The Postgres Database Company
>>>>
>>>
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>>
>>> *Sr. Software Architect*
>>> *EnterpriseDB Software India Private Limited*
>>> *Mobile: +91 976-788-8246*
>>>
>>
>>
>> --
>> Thanks & Regards,
>> Shubham Agarwal
>> EnterpriseDB Corporation
>>
>> The Postgres Database Company
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
>
> *Sr. Software Architect*
> *EnterpriseDB Software India Private Limited*
> *Mobile: +91 976-788-8246*
>
--
Thanks & Regards,
Shubham Agarwal
EnterpriseDB Corporation
The Postgres Database Company
Attachments:
[application/octet-stream] feature_test_fix_v5.patch (2.6K, 3-feature_test_fix_v5.patch)
download | inline diff:
diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
index 5ae86734c..22c4a99df 100644
--- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
@@ -17,6 +17,7 @@ from regression.feature_utils.base_feature_test import BaseFeatureTest
from regression.python_test_utils import test_utils
from regression.python_test_utils import test_gui_helper
from regression.feature_utils.locators import NavMenuLocators
+from regression.feature_utils.tree_area_locators import TreeAreaLocators
class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
@@ -55,7 +56,10 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
self.server['sslmode']
)
test_utils.drop_database(connection, self.database_name)
- test_utils.create_database(self.server, self.database_name)
+ db_id = test_utils.create_database(self.server, self.database_name)
+ if not db_id:
+ self.assertTrue(False, "Database {} is not "
+ "created".format(self.database_name))
test_gui_helper.close_bgprocess_popup(self)
self.page.add_server(self.server)
diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py
index 381be22dc..62aa09858 100644
--- a/web/pgadmin/feature_tests/view_data_dml_queries.py
+++ b/web/pgadmin/feature_tests/view_data_dml_queries.py
@@ -338,9 +338,7 @@ CREATE TABLE public.nonintpkey
self.assertEquals(text, messages_ele.text)
def _verify_row_data(self, is_new_row, config_check_data):
- self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css).click()
-
+ self.page.click_execute_query_button()
# First row if row height = 0, second row if its 25
row_height = 0 if is_new_row else 25
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index a754a3e25..8bec1a74b 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -171,10 +171,7 @@ class PgadminPage:
def execute_query(self, query):
self.fill_codemirror_area_with(query)
- execute_button = self.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css)
- execute_button.click()
- self.wait_for_query_tool_loading_indicator_to_disappear()
+ self.click_execute_query_button()
def click_execute_query_button(self):
retry = 5
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-20 07:03 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-20 07:39 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-21 10:09 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
@ 2019-11-21 11:52 ` Akshay Joshi <[email protected]>
2019-12-03 12:39 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Akshay Joshi @ 2019-11-21 11:52 UTC (permalink / raw)
To: Shubham Agarwal <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Thu, Nov 21, 2019 at 3:40 PM Shubham Agarwal <
[email protected]> wrote:
> Hi Team,
> Attach is the patch for feature test fix containing the following:
> 1. Handled click event in query tool due to intermediate clicking issue.
> 2. Observed that the database is not getting created in a test case, so
> failed the test case there only.
>
> On Wed, Nov 20, 2019 at 1:09 PM Akshay Joshi <
> [email protected]> wrote:
>
>> Thanks, patch applied.
>>
>> On Wed, Nov 20, 2019 at 12:34 PM Shubham Agarwal <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>> PFA feature test fixture patch containing the following things:
>>>
>>> 1. Added an attribute 'data-click-counter' in query execute button which
>>> gets incremented once query button is clicked up to 9 and then reset to 0.
>>> This is added just to support automation.
>>> 2. Locator for login_group_role is added and used to expand tree.
>>> 3. Functions for enabling and disable auto_commit and auto_rollback are
>>> made more precise.
>>> 4. Some scrolling problem is addressed in view_data_dml_query test.
>>> 5. Handled the stale element reference exception in
>>> query_tool_journey_test
>>>
>>> Regards,
>>> Shubham Agarwal
>>>
>>> On Fri, Nov 15, 2019 at 6:03 PM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Thanks, patch applied
>>>>
>>>> On Fri, Nov 15, 2019 at 5:59 PM Shubham Agarwal <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Team,
>>>>>
>>>>> PFA feature test fixture patch containing the following fixes:
>>>>> 1. Process watcher loading logs fix
>>>>> 2. Auto commit/rollback issue in query_tool_tests
>>>>> 3. Fixed the scrolling issue while verifying values in a table.
>>>>> 4. Modified some functions in pgadmin_page.py
>>>>>
>>>>> On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Thanks, patch applied.
>>>>>>
>>>>>> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Team,
>>>>>>> PFA patch containing some more fixes for random feature test
>>>>>>> failures.
>>>>>>>
>>>>>>> Thanks and regards,
>>>>>>> Shubham Agarwal
>>>>>>>
>>>>>>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop'
>>>>>>>> server has been changed to 'Remove Server' which causes all the test cases
>>>>>>>> failing on my machine.
>>>>>>>>
>>>>>>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> Hi Team,
>>>>>>>>>
>>>>>>>>> Attached is the patch containing fixes for the failed feature test
>>>>>>>>> cases.
>>>>>>>>> This patch contains-
>>>>>>>>> 1. Newly created function for traversing the browser tree.
>>>>>>>>> 2. Some synchronization issue fixes.
>>>>>>>>> 3. Modified locators.
>>>>>>>>> 4. Test cases fix for the recent commits.
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Thanks & Regards,
>>>>>>>>> Shubham Agarwal
>>>>>>>>> EnterpriseDB Corporation
>>>>>>>>>
>>>>>>>>> The Postgres Database Company
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *Thanks & Regards*
>>>>>>>> *Akshay Joshi*
>>>>>>>>
>>>>>>>> *Sr. Software Architect*
>>>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Thanks & Regards,
>>>>>>> Shubham Agarwal
>>>>>>> EnterpriseDB Corporation
>>>>>>>
>>>>>>> The Postgres Database Company
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Thanks & Regards*
>>>>>> *Akshay Joshi*
>>>>>>
>>>>>> *Sr. Software Architect*
>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>> *Mobile: +91 976-788-8246*
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Thanks & Regards,
>>>>> Shubham Agarwal
>>>>> EnterpriseDB Corporation
>>>>>
>>>>> The Postgres Database Company
>>>>>
>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect*
>>>> *EnterpriseDB Software India Private Limited*
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>>
>>> --
>>> Thanks & Regards,
>>> Shubham Agarwal
>>> EnterpriseDB Corporation
>>>
>>> The Postgres Database Company
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>>
>> *Sr. Software Architect*
>> *EnterpriseDB Software India Private Limited*
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> Thanks & Regards,
> Shubham Agarwal
> EnterpriseDB Corporation
>
> The Postgres Database Company
>
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-20 07:03 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-20 07:39 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-21 10:09 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-21 11:52 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
@ 2019-12-03 12:39 ` Shubham Agarwal <[email protected]>
2019-12-03 14:08 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
0 siblings, 1 reply; 12+ messages in thread
From: Shubham Agarwal @ 2019-12-03 12:39 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
PFA patch for feature tests containing following fixes-
1. Modified the get_chromedriver utility for supporting python version
below 3.5.
2. Handled some exceptions getting intermittently on some databases.
3. Generalized some functions with additional parameters.
4. Disabled the auto-expansion of the children nodes for maintaining the
synchronization.
On Thu, Nov 21, 2019 at 5:22 PM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied.
>
> On Thu, Nov 21, 2019 at 3:40 PM Shubham Agarwal <
> [email protected]> wrote:
>
>> Hi Team,
>> Attach is the patch for feature test fix containing the following:
>> 1. Handled click event in query tool due to intermediate clicking issue.
>> 2. Observed that the database is not getting created in a test case, so
>> failed the test case there only.
>>
>> On Wed, Nov 20, 2019 at 1:09 PM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Thanks, patch applied.
>>>
>>> On Wed, Nov 20, 2019 at 12:34 PM Shubham Agarwal <
>>> [email protected]> wrote:
>>>
>>>> Hi Team,
>>>> PFA feature test fixture patch containing the following things:
>>>>
>>>> 1. Added an attribute 'data-click-counter' in query execute button
>>>> which gets incremented once query button is clicked up to 9 and then reset
>>>> to 0. This is added just to support automation.
>>>> 2. Locator for login_group_role is added and used to expand tree.
>>>> 3. Functions for enabling and disable auto_commit and auto_rollback are
>>>> made more precise.
>>>> 4. Some scrolling problem is addressed in view_data_dml_query test.
>>>> 5. Handled the stale element reference exception in
>>>> query_tool_journey_test
>>>>
>>>> Regards,
>>>> Shubham Agarwal
>>>>
>>>> On Fri, Nov 15, 2019 at 6:03 PM Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Thanks, patch applied
>>>>>
>>>>> On Fri, Nov 15, 2019 at 5:59 PM Shubham Agarwal <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Team,
>>>>>>
>>>>>> PFA feature test fixture patch containing the following fixes:
>>>>>> 1. Process watcher loading logs fix
>>>>>> 2. Auto commit/rollback issue in query_tool_tests
>>>>>> 3. Fixed the scrolling issue while verifying values in a table.
>>>>>> 4. Modified some functions in pgadmin_page.py
>>>>>>
>>>>>> On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Thanks, patch applied.
>>>>>>>
>>>>>>> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Hi Team,
>>>>>>>> PFA patch containing some more fixes for random feature test
>>>>>>>> failures.
>>>>>>>>
>>>>>>>> Thanks and regards,
>>>>>>>> Shubham Agarwal
>>>>>>>>
>>>>>>>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop'
>>>>>>>>> server has been changed to 'Remove Server' which causes all the test cases
>>>>>>>>> failing on my machine.
>>>>>>>>>
>>>>>>>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Team,
>>>>>>>>>>
>>>>>>>>>> Attached is the patch containing fixes for the failed feature
>>>>>>>>>> test cases.
>>>>>>>>>> This patch contains-
>>>>>>>>>> 1. Newly created function for traversing the browser tree.
>>>>>>>>>> 2. Some synchronization issue fixes.
>>>>>>>>>> 3. Modified locators.
>>>>>>>>>> 4. Test cases fix for the recent commits.
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Thanks & Regards,
>>>>>>>>>> Shubham Agarwal
>>>>>>>>>> EnterpriseDB Corporation
>>>>>>>>>>
>>>>>>>>>> The Postgres Database Company
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> *Thanks & Regards*
>>>>>>>>> *Akshay Joshi*
>>>>>>>>>
>>>>>>>>> *Sr. Software Architect*
>>>>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Thanks & Regards,
>>>>>>>> Shubham Agarwal
>>>>>>>> EnterpriseDB Corporation
>>>>>>>>
>>>>>>>> The Postgres Database Company
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> *Thanks & Regards*
>>>>>>> *Akshay Joshi*
>>>>>>>
>>>>>>> *Sr. Software Architect*
>>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Thanks & Regards,
>>>>>> Shubham Agarwal
>>>>>> EnterpriseDB Corporation
>>>>>>
>>>>>> The Postgres Database Company
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Thanks & Regards*
>>>>> *Akshay Joshi*
>>>>>
>>>>> *Sr. Software Architect*
>>>>> *EnterpriseDB Software India Private Limited*
>>>>> *Mobile: +91 976-788-8246*
>>>>>
>>>>
>>>>
>>>> --
>>>> Thanks & Regards,
>>>> Shubham Agarwal
>>>> EnterpriseDB Corporation
>>>>
>>>> The Postgres Database Company
>>>>
>>>
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>>
>>> *Sr. Software Architect*
>>> *EnterpriseDB Software India Private Limited*
>>> *Mobile: +91 976-788-8246*
>>>
>>
>>
>> --
>> Thanks & Regards,
>> Shubham Agarwal
>> EnterpriseDB Corporation
>>
>> The Postgres Database Company
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
>
> *Sr. Software Architect*
> *EnterpriseDB Software India Private Limited*
> *Mobile: +91 976-788-8246*
>
--
Thanks & Regards,
Shubham Agarwal
EnterpriseDB Corporation
The Postgres Database Company
Attachments:
[application/octet-stream] feature_test_fix_v6.patch (15.9K, 3-feature_test_fix_v6.patch)
download | inline diff:
diff --git a/tools/get_chromedriver.py b/tools/get_chromedriver.py
index 0a5630609..dfd62afe3 100644
--- a/tools/get_chromedriver.py
+++ b/tools/get_chromedriver.py
@@ -17,7 +17,12 @@ import os
import platform
import subprocess
import sys
-import urllib.request
+try:
+ from urllib.request import urlopen, urlretrieve
+ from urllib.error import URLError
+except Exception:
+ from urllib import urlopen, urlretrieve
+ URLError = Exception
import zipfile
@@ -85,13 +90,13 @@ def get_chrome_version(args):
# On Linux/Mac we run the Chrome executable with the --version flag,
# then parse the output.
try:
- result = subprocess.run([args.chrome, '--version'],
- stdout=subprocess.PIPE)
- except FileNotFoundError as e:
+ result = subprocess.Popen([args.chrome, '--version'],
+ stdout=subprocess.PIPE)
+ except FileNotFoundError:
print('The specified Chrome executable could not be found.')
sys.exit(1)
- version_str = result.stdout.decode("utf-8").strip()
+ version_str = result.stdout.read().decode("utf-8")
# Check for 'Chrom' not 'Chrome' in case the user is using Chromium.
if "Chrom" not in version_str:
print('The specified Chrome executable output an unexpected '
@@ -120,8 +125,8 @@ def get_chromedriver_version(chrome_version):
.format(chrome_version)
try:
- fp = urllib.request.urlopen(url)
- except urllib.error.URLError as e:
+ fp = urlopen(url)
+ except URLError as e:
print('The chromedriver catalog URL could not be accessed: {}'
.format(e))
sys.exit(1)
@@ -173,8 +178,8 @@ print('Downloading chromedriver v{} for Chrome v{} on {}...'
.format(chromedriver_version, chrome_version, system))
try:
- file, headers = urllib.request.urlretrieve(url)
-except urllib.error.URLError as e:
+ file, headers = urlretrieve(url)
+except URLError as e:
print('The chromedriver download URL could not be accessed: {}'
.format(e))
sys.exit(1)
diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
index c4d368df1..6bac34737 100644
--- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py
+++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
@@ -164,11 +164,7 @@ class PGDataypeFeatureTest(BaseFeatureTest):
self._create_enum_type()
for batch in config_data:
query = self.construct_select_query(batch)
- self.page.fill_codemirror_area_with(query)
- execute_query = self.page.find_by_css_selector(
- QueryToolLocators.btn_execute_query_css)
- execute_query.click()
-
+ self.page.execute_query(query)
wait = WebDriverWait(self.page.driver, 5)
# wait for the visibility of the grid to appear
diff --git a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
index 22c4a99df..4c311c08e 100644
--- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
+++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py
@@ -118,8 +118,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
(By.XPATH,
NavMenuLocators.process_watcher_alertfier))
self.page.wait_for_element_to_disappear(
- lambda driver: driver.find_element_by_css_selector(".loading-logs")
- )
+ lambda driver: driver.find_element_by_css_selector(
+ ".loading-logs"), 10)
if status != "Successfully completed.":
self.assertEquals(status, "Successfully completed.")
@@ -188,8 +188,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
(By.XPATH,
NavMenuLocators.process_watcher_alertfier))
self.page.wait_for_element_to_disappear(
- lambda driver: driver.find_element_by_css_selector(".loading-logs")
- )
+ lambda driver: driver.find_element_by_css_selector(
+ ".loading-logs"), 10)
if status != "Successfully completed.":
self.assertEquals(status, "Successfully completed.")
@@ -215,6 +215,7 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest):
os.remove(backup_file)
def after(self):
+ test_gui_helper.close_process_watcher(self)
test_gui_helper.close_bgprocess_popup(self)
self.page.remove_server(self.server)
connection = test_utils.get_db_connection(
diff --git a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
index fe6d68e4d..63246f999 100644
--- a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py
@@ -37,22 +37,22 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest):
self.page.add_server(self.server)
self.first_schema_name = "test_schema" + \
- str(random.randint(1000, 3000))
+ str(random.randint(1000, 2000))
test_utils.create_schema(self.server, self.test_db,
self.first_schema_name)
self.second_schema_name = "comp_schema" + \
- str(random.randint(1000, 3000))
+ str(random.randint(2000, 3000))
test_utils.create_schema(self.server, self.test_db,
self.second_schema_name)
self.first_table_name = "auto_comp_" + \
- str(random.randint(1000, 3000))
+ str(random.randint(1000, 2000))
test_utils.create_table(self.server, self.test_db,
self.first_table_name)
self.second_table_name = "auto_comp_" + \
- str(random.randint(1000, 3000))
+ str(random.randint(2000, 3000))
test_utils.create_table(self.server, self.test_db,
self.second_table_name)
diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py
index de6c479f5..bcb74ddb4 100644
--- a/web/pgadmin/feature_tests/query_tool_tests.py
+++ b/web/pgadmin/feature_tests/query_tool_tests.py
@@ -218,12 +218,6 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
QueryToolLocators.query_output_cells))
)
- # click on first data column to select all column.
- column_1 = \
- self.page.find_by_css_selector(
- QueryToolLocators.output_column_header_css.format('id1'))
- column_1.click()
-
canvas = self.wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css)))
@@ -235,6 +229,11 @@ SELECT generate_series(1, {}) as id1, 'dummy' as id2""".format(
scroll = 10
status = False
while scroll:
+ # click on first data column to select all column.
+ column_1 = \
+ self.page.find_by_css_selector(
+ QueryToolLocators.output_column_header_css.format('id1'))
+ column_1.click()
canvas_ele = self.page.find_by_css_selector('.grid-canvas')
scrolling_height = canvas_ele.size['height']
self.driver.execute_script(
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index 8bec1a74b..09fc30ac8 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -173,7 +173,7 @@ class PgadminPage:
self.fill_codemirror_area_with(query)
self.click_execute_query_button()
- def click_execute_query_button(self):
+ def click_execute_query_button(self, timeout=20):
retry = 5
execute_button = self.find_by_css_selector(
QueryToolLocators.btn_execute_query_css)
@@ -189,7 +189,7 @@ class PgadminPage:
break
else:
retry -= 1
- self.wait_for_query_tool_loading_indicator_to_disappear()
+ self.wait_for_query_tool_loading_indicator_to_disappear(timeout)
def check_execute_option(self, option):
""""This function will check auto commit or auto roll back based on
@@ -689,15 +689,17 @@ class PgadminPage:
try:
webdriver.ActionChains(self.driver).double_click(
server_element).perform()
- if self.wait_for_element_to_appear(self.driver,
- ConnectToServerDiv.ok_button):
- self.fill_input_by_xpath(
- ConnectToServerDiv.password_field, password)
+ if self.check_if_element_exist_by_xpath(
+ ConnectToServerDiv.ok_button):
+ field = self.find_by_xpath(
+ ConnectToServerDiv.password_field)
+ self.fill_input(field, password)
self.find_by_xpath(ConnectToServerDiv.ok_button).click()
- self.wait_until_element_not_visible(
- ConnectToServerDiv.ok_button)
- if self.wait_for_element_to_be_visible(
- self.driver, ConnectToServerDiv.error_message, 2):
+ self.wait_for_element_to_disappear(
+ lambda driver: driver.find_element_by_xpath(
+ ConnectToServerDiv.ok_button))
+ if self.check_if_element_exist_by_xpath(
+ ConnectToServerDiv.error_message, 2):
print(
"While entering password in click_and_connect_server "
"function, error is occurred : " + str(
@@ -983,7 +985,7 @@ class PgadminPage:
self._wait_for("element to exist", element_if_it_exists)
return find_method_with_args(self.driver)
- def wait_for_element_to_disappear(self, find_method_with_args):
+ def wait_for_element_to_disappear(self, find_method_with_args, timeout=5):
def element_if_it_disappears(driver):
try:
element = find_method_with_args(driver)
@@ -994,7 +996,8 @@ class PgadminPage:
except (NoSuchElementException, StaleElementReferenceException):
return True
- return self._wait_for("element to disappear", element_if_it_disappears)
+ return self._wait_for("element to disappear",
+ element_if_it_disappears, timeout)
def wait_for_reloading_indicator_to_disappear(self):
def reloading_indicator_has_disappeared(driver):
@@ -1017,7 +1020,7 @@ class PgadminPage:
self._wait_for("spinner to disappear", spinner_has_disappeared, 20)
- def wait_for_query_tool_loading_indicator_to_disappear(self):
+ def wait_for_query_tool_loading_indicator_to_disappear(self, timeout=20):
def spinner_has_disappeared(driver):
try:
spinner = driver.find_element_by_css_selector(
@@ -1029,7 +1032,8 @@ class PgadminPage:
time.sleep(0.5)
return True
- self._wait_for("spinner to disappear", spinner_has_disappeared, 20)
+ self._wait_for(
+ "spinner to disappear", spinner_has_disappeared, timeout)
def wait_for_query_tool_loading_indicator_to_appear(self):
status = self.check_if_element_exist_by_xpath(
@@ -1151,7 +1155,7 @@ class PgadminPage:
try:
element = self.driver.find_element(*click_locator)
element.click()
- WebDriverWait(self.driver, 2).until(
+ WebDriverWait(self.driver, 10).until(
EC.visibility_of_element_located(verify_locator))
click_status = True
except Exception:
diff --git a/web/regression/python_test_utils/test_gui_helper.py b/web/regression/python_test_utils/test_gui_helper.py
index aaa9707b7..d2f87a6fb 100644
--- a/web/regression/python_test_utils/test_gui_helper.py
+++ b/web/regression/python_test_utils/test_gui_helper.py
@@ -47,11 +47,14 @@ def close_bgprocess_popup(tester):
def close_process_watcher(tester):
attempt = 10
while attempt > 0:
- close_btn = tester.page.find_by_xpath(
- NavMenuLocators.process_watcher_close_button_xpath)
- close_btn.click()
- if not tester.page.check_if_element_exist_by_xpath(
- NavMenuLocators.process_watcher_close_button_xpath, 1):
- break
- else:
+ try:
+ if not tester.page.check_if_element_exist_by_xpath(
+ NavMenuLocators.process_watcher_close_button_xpath, 1):
+ break
+ else:
+ close_btn = tester.page.find_by_xpath(
+ NavMenuLocators.process_watcher_close_button_xpath)
+ close_btn.click()
+ attempt -= 1
+ except Exception:
attempt -= 1
diff --git a/web/regression/python_test_utils/test_utils.py b/web/regression/python_test_utils/test_utils.py
index 56d5cb0f9..5d182ece2 100644
--- a/web/regression/python_test_utils/test_utils.py
+++ b/web/regression/python_test_utils/test_utils.py
@@ -108,6 +108,7 @@ def clear_node_info_dict():
def create_database(server, db_name, encoding=None):
"""This function used to create database and returns the database id"""
+ db_id = ''
try:
connection = get_db_connection(
server['db'],
@@ -135,13 +136,13 @@ def create_database(server, db_name, encoding=None):
pg_cursor.execute("SELECT db.oid from pg_database db WHERE"
" db.datname='%s'" % db_name)
oid = pg_cursor.fetchone()
- db_id = ''
if oid:
db_id = oid[0]
connection.close()
return db_id
except Exception:
traceback.print_exc(file=sys.stderr)
+ return db_id
def create_table(server, db_name, table_name, extra_columns=[]):
@@ -777,6 +778,27 @@ def configure_preferences(default_binary_path=None):
' WHERE PID = ?', (-1, pref_tree_state_save_interval.pid)
)
+ # Disable auto expand sole children tree state for tests
+ pref_auto_expand_sol_children = \
+ browser_pref.preference('auto_expand_sole_children')
+
+ user_pref = cur.execute(
+ 'SELECT pid, uid FROM user_preferences '
+ 'where pid=?', (pref_auto_expand_sol_children.pid,)
+ )
+
+ if len(user_pref.fetchall()) == 0:
+ cur.execute(
+ 'INSERT INTO user_preferences(pid, uid, value)'
+ ' VALUES (?,?,?)', (pref_auto_expand_sol_children.pid, 1, 'False')
+ )
+ else:
+ cur.execute(
+ 'UPDATE user_preferences'
+ ' SET VALUE = ?'
+ ' WHERE PID = ?', ('False', pref_auto_expand_sol_children.pid)
+ )
+
# Disable reload warning on browser
pref_confirm_on_refresh_close = \
browser_pref.preference('confirm_on_refresh_close')
@@ -1103,18 +1125,21 @@ def get_watcher_dialogue_status(self):
"""This will get watcher dialogue status"""
import time
attempts = 120
-
+ status = None
while attempts > 0:
- status = self.page.find_by_css_selector(
- ".pg-bg-status-text").text
-
- if 'Failed' in status:
- break
- if status == 'Started' or status == 'Running...':
+ try:
+ status = self.page.find_by_css_selector(
+ ".pg-bg-status-text").text
+
+ if 'Failed' in status:
+ break
+ if status == 'Started' or status == 'Running...':
+ attempts -= 1
+ time.sleep(.5)
+ else:
+ break
+ except Exception:
attempts -= 1
- time.sleep(.5)
- else:
- break
return status
^ permalink raw reply [nested|flat] 12+ messages in thread
* Re: Fixes for pgAdmin feature tests
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-20 07:03 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-20 07:39 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-11-21 10:09 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-21 11:52 ` Re: Fixes for pgAdmin feature tests Akshay Joshi <[email protected]>
2019-12-03 12:39 ` Re: Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
@ 2019-12-03 14:08 ` Akshay Joshi <[email protected]>
0 siblings, 0 replies; 12+ messages in thread
From: Akshay Joshi @ 2019-12-03 14:08 UTC (permalink / raw)
To: Shubham Agarwal <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Tue, Dec 3, 2019 at 6:09 PM Shubham Agarwal <
[email protected]> wrote:
> Hi Team,
>
> PFA patch for feature tests containing following fixes-
>
> 1. Modified the get_chromedriver utility for supporting python version
> below 3.5.
> 2. Handled some exceptions getting intermittently on some databases.
> 3. Generalized some functions with additional parameters.
> 4. Disabled the auto-expansion of the children nodes for maintaining the
> synchronization.
>
> On Thu, Nov 21, 2019 at 5:22 PM Akshay Joshi <
> [email protected]> wrote:
>
>> Thanks, patch applied.
>>
>> On Thu, Nov 21, 2019 at 3:40 PM Shubham Agarwal <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>> Attach is the patch for feature test fix containing the following:
>>> 1. Handled click event in query tool due to intermediate clicking issue.
>>> 2. Observed that the database is not getting created in a test case, so
>>> failed the test case there only.
>>>
>>> On Wed, Nov 20, 2019 at 1:09 PM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Thanks, patch applied.
>>>>
>>>> On Wed, Nov 20, 2019 at 12:34 PM Shubham Agarwal <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Team,
>>>>> PFA feature test fixture patch containing the following things:
>>>>>
>>>>> 1. Added an attribute 'data-click-counter' in query execute button
>>>>> which gets incremented once query button is clicked up to 9 and then reset
>>>>> to 0. This is added just to support automation.
>>>>> 2. Locator for login_group_role is added and used to expand tree.
>>>>> 3. Functions for enabling and disable auto_commit and auto_rollback
>>>>> are made more precise.
>>>>> 4. Some scrolling problem is addressed in view_data_dml_query test.
>>>>> 5. Handled the stale element reference exception in
>>>>> query_tool_journey_test
>>>>>
>>>>> Regards,
>>>>> Shubham Agarwal
>>>>>
>>>>> On Fri, Nov 15, 2019 at 6:03 PM Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Thanks, patch applied
>>>>>>
>>>>>> On Fri, Nov 15, 2019 at 5:59 PM Shubham Agarwal <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Team,
>>>>>>>
>>>>>>> PFA feature test fixture patch containing the following fixes:
>>>>>>> 1. Process watcher loading logs fix
>>>>>>> 2. Auto commit/rollback issue in query_tool_tests
>>>>>>> 3. Fixed the scrolling issue while verifying values in a table.
>>>>>>> 4. Modified some functions in pgadmin_page.py
>>>>>>>
>>>>>>> On Wed, Nov 13, 2019 at 11:19 AM Akshay Joshi <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Thanks, patch applied.
>>>>>>>>
>>>>>>>> On Tue, Nov 12, 2019 at 6:27 PM Shubham Agarwal <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> Hi Team,
>>>>>>>>> PFA patch containing some more fixes for random feature test
>>>>>>>>> failures.
>>>>>>>>>
>>>>>>>>> Thanks and regards,
>>>>>>>>> Shubham Agarwal
>>>>>>>>>
>>>>>>>>> On Mon, Nov 11, 2019 at 10:55 AM Akshay Joshi <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Thanks, patch applied with a minor change. Menu for 'Delete Drop'
>>>>>>>>>> server has been changed to 'Remove Server' which causes all the test cases
>>>>>>>>>> failing on my machine.
>>>>>>>>>>
>>>>>>>>>> On Mon, Nov 11, 2019 at 10:18 AM Shubham Agarwal <
>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>
>>>>>>>>>>> Hi Team,
>>>>>>>>>>>
>>>>>>>>>>> Attached is the patch containing fixes for the failed feature
>>>>>>>>>>> test cases.
>>>>>>>>>>> This patch contains-
>>>>>>>>>>> 1. Newly created function for traversing the browser tree.
>>>>>>>>>>> 2. Some synchronization issue fixes.
>>>>>>>>>>> 3. Modified locators.
>>>>>>>>>>> 4. Test cases fix for the recent commits.
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Thanks & Regards,
>>>>>>>>>>> Shubham Agarwal
>>>>>>>>>>> EnterpriseDB Corporation
>>>>>>>>>>>
>>>>>>>>>>> The Postgres Database Company
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> *Thanks & Regards*
>>>>>>>>>> *Akshay Joshi*
>>>>>>>>>>
>>>>>>>>>> *Sr. Software Architect*
>>>>>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Thanks & Regards,
>>>>>>>>> Shubham Agarwal
>>>>>>>>> EnterpriseDB Corporation
>>>>>>>>>
>>>>>>>>> The Postgres Database Company
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *Thanks & Regards*
>>>>>>>> *Akshay Joshi*
>>>>>>>>
>>>>>>>> *Sr. Software Architect*
>>>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Thanks & Regards,
>>>>>>> Shubham Agarwal
>>>>>>> EnterpriseDB Corporation
>>>>>>>
>>>>>>> The Postgres Database Company
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Thanks & Regards*
>>>>>> *Akshay Joshi*
>>>>>>
>>>>>> *Sr. Software Architect*
>>>>>> *EnterpriseDB Software India Private Limited*
>>>>>> *Mobile: +91 976-788-8246*
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Thanks & Regards,
>>>>> Shubham Agarwal
>>>>> EnterpriseDB Corporation
>>>>>
>>>>> The Postgres Database Company
>>>>>
>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect*
>>>> *EnterpriseDB Software India Private Limited*
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>>
>>> --
>>> Thanks & Regards,
>>> Shubham Agarwal
>>> EnterpriseDB Corporation
>>>
>>> The Postgres Database Company
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>>
>> *Sr. Software Architect*
>> *EnterpriseDB Software India Private Limited*
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> Thanks & Regards,
> Shubham Agarwal
> EnterpriseDB Corporation
>
> The Postgres Database Company
>
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 12+ messages in thread
end of thread, other threads:[~2019-12-03 14:08 UTC | newest]
Thread overview: 12+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2019-11-11 04:44 Fixes for pgAdmin feature tests Shubham Agarwal <[email protected]>
2019-11-11 05:24 ` Akshay Joshi <[email protected]>
2019-11-12 12:57 ` Shubham Agarwal <[email protected]>
2019-11-13 05:49 ` Akshay Joshi <[email protected]>
2019-11-15 12:29 ` Shubham Agarwal <[email protected]>
2019-11-15 12:33 ` Akshay Joshi <[email protected]>
2019-11-20 07:03 ` Shubham Agarwal <[email protected]>
2019-11-20 07:39 ` Akshay Joshi <[email protected]>
2019-11-21 10:09 ` Shubham Agarwal <[email protected]>
2019-11-21 11:52 ` Akshay Joshi <[email protected]>
2019-12-03 12:39 ` Shubham Agarwal <[email protected]>
2019-12-03 14:08 ` Akshay Joshi <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox