public inbox for [email protected]
help / color / mirror / Atom feedFrom: Shubham Agarwal <[email protected]>
To: pgadmin-hackers <[email protected]>
Subject: Re: Fixes for pgAdmin feature tests
Date: Tue, 12 Nov 2019 18:27:22 +0530
Message-ID: <CAKbCA9RQ8ebH4+XMZphrUfex4XfMfBZj2xGogUNyBqva2yPh4Q@mail.gmail.com> (raw)
In-Reply-To: <CANxoLDdhJht3Dzsuyakst9t4UVrUwrGYbE+M_-xichAJpfAkvg@mail.gmail.com>
References: <CAKbCA9QmGWkR4rZEYFa_CYoWvSvDes6smUtjBHkpYDUCrBn09w@mail.gmail.com>
<CANxoLDdhJht3Dzsuyakst9t4UVrUwrGYbE+M_-xichAJpfAkvg@mail.gmail.com>
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
view thread (12+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: Fixes for pgAdmin feature tests
In-Reply-To: <CAKbCA9RQ8ebH4+XMZphrUfex4XfMfBZj2xGogUNyBqva2yPh4Q@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox