Hi, Please find patch which fixes 15 issues related to rule from feature test modules - 1.String literals should not be duplicated
Thanks, Yogesh Mahajan QA - Team EnterpriseDB Corporation Phone: +91-9741705709
diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py index 65d7bfbc5..a1c01df3d 100644 --- a/web/pgadmin/feature_tests/pg_datatype_validation_test.py +++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py @@ -115,18 +115,19 @@ class PGDataypeFeatureTest(BaseFeatureTest): NavMenuLocators.maximize_pref_dialogue_css) maximize_button.click() + specified_preference_tree_node_name = 'Query Tool' sql_editor = self.page.find_by_xpath( NavMenuLocators.specified_preference_tree_node. - format('Query Tool')) + format(specified_preference_tree_node_name)) if self.page.find_by_xpath( NavMenuLocators.specified_pref_node_exp_status. - format('Query Tool')).\ + format(specified_preference_tree_node_name)).\ get_attribute('aria-expanded') == 'false': ActionChains(self.driver).double_click(sql_editor).perform() option_node = self.page.find_by_xpath( NavMenuLocators.specified_sub_node_of_pref_tree_node.format( - 'Query Tool', 'Editor')) + specified_preference_tree_node_name, 'Editor')) option_node.click() self.page.set_switch_box_status( 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 5f4461205..9efdd9285 100644 --- a/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py +++ b/web/pgadmin/feature_tests/pg_utilities_backup_restore_test.py @@ -122,8 +122,9 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): lambda driver: driver.find_element_by_css_selector( ".loading-logs"), 10) - if status != "Successfully completed.": - self.assertEquals(status, "Successfully completed.") + expected_backup_success_msg = "Successfully completed." + if status != expected_backup_success_msg: + self.assertEquals(status, expected_backup_success_msg) backup_file = None # Check for XSS in Backup details @@ -192,8 +193,8 @@ class PGUtilitiesBackupFeatureTest(BaseFeatureTest): lambda driver: driver.find_element_by_css_selector( ".loading-logs"), 10) - if status != "Successfully completed.": - self.assertEquals(status, "Successfully completed.") + if status != expected_backup_success_msg: + self.assertEquals(status, expected_backup_success_msg) # Check for XSS in Restore details if self.is_xss_check: 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 cb9d3cdb0..e45f16055 100644 --- a/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py +++ b/web/pgadmin/feature_tests/query_tool_auto_complete_tests.py @@ -64,6 +64,7 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest): def runTest(self): # Test case for keywords + select_keyword = "SELECT * FROM public." print("\nAuto complete ALTER keyword... ", file=sys.stderr, end="") self._auto_complete("A", "ALTER") print("OK.", file=sys.stderr) @@ -116,29 +117,29 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest): print("Auto complete first table in public schema ... ", file=sys.stderr, end="") - self._auto_complete("SELECT * FROM public.", self.first_table_name) + self._auto_complete(select_keyword, self.first_table_name) print("OK.", file=sys.stderr) self.page.clear_query_tool() print("Auto complete second table in public schema ... ", file=sys.stderr, end="") - self._auto_complete("SELECT * FROM public.", self.second_table_name) + self._auto_complete(select_keyword, self.second_table_name) print("OK.", file=sys.stderr) self.page.clear_query_tool() print("Auto complete JOIN second table with after schema name ... ", file=sys.stderr, end="") - query = "SELECT * FROM public." + self.first_table_name + \ - " JOIN public." + query = select_keyword + self.first_table_name + \ + " JOIN public." self._auto_complete(query, self.second_table_name) print("OK.", file=sys.stderr) self.page.clear_query_tool() print("Auto complete JOIN ON some columns ... ", file=sys.stderr, end="") - query = "SELECT * FROM public." + self.first_table_name + \ - " JOIN public." + self.second_table_name + " ON " + \ - self.second_table_name + "." + query = select_keyword + self.first_table_name + \ + " JOIN public." + self.second_table_name + " ON " + \ + self.second_table_name + "." expected_string = "some_column = " + self.first_table_name + \ ".some_column" self._auto_complete(query, expected_string) @@ -147,8 +148,8 @@ class QueryToolAutoCompleteFeatureTest(BaseFeatureTest): print("Auto complete JOIN ON some columns using table alias ... ", file=sys.stderr, end="") - query = "SELECT * FROM public." + self.first_table_name + \ - " t1 JOIN public." + self.second_table_name + " t2 ON t2." + query = select_keyword + self.first_table_name + \ + " t1 JOIN public." + self.second_table_name + " t2 ON t2." self._auto_complete(query, "some_column = t1.some_column") print("OK.", file=sys.stderr) self.page.clear_query_tool() diff --git a/web/pgadmin/feature_tests/query_tool_journey_test.py b/web/pgadmin/feature_tests/query_tool_journey_test.py index f439917eb..98e365e1c 100644 --- a/web/pgadmin/feature_tests/query_tool_journey_test.py +++ b/web/pgadmin/feature_tests/query_tool_journey_test.py @@ -32,6 +32,10 @@ class QueryToolJourneyTest(BaseFeatureTest): test_editable_table_name = "" invalid_table_name = "" + select_query = "SELECT * FROM %s" + query_history_tab_name = "Query History" + query_editor_tab_name = "Query Editor" + def before(self): self.test_table_name = "test_table" + str(random.randint(1000, 3000)) self.invalid_table_name = \ @@ -148,12 +152,12 @@ class QueryToolJourneyTest(BaseFeatureTest): editor_input = self.page.find_by_css_selector( QueryToolLocators.query_editor_panel) self.page.click_element(editor_input) - self.page.execute_query("SELECT * FROM %s" % self.invalid_table_name) + self.page.execute_query(self.select_query % self.invalid_table_name) - self.page.click_tab("Query History") + self.page.click_tab(self.query_history_tab_name) selected_history_entry = self.page.find_by_css_selector( QueryToolLocators.query_history_selected) - self.assertIn("SELECT * FROM %s" % self.invalid_table_name, + self.assertIn(self.select_query % self.invalid_table_name, selected_history_entry.text) failed_history_detail_pane = self.page.find_by_css_selector( @@ -187,10 +191,10 @@ class QueryToolJourneyTest(BaseFeatureTest): invalid_history_entry = self.page.find_by_css_selector( QueryToolLocators.invalid_query_history_entry_css) - self.assertIn("SELECT * FROM %s" % self.invalid_table_name, + self.assertIn(self.select_query % self.invalid_table_name, invalid_history_entry.text) - self.page.click_tab("Query Editor") + self.page.click_tab(self.query_editor_tab_name) self.page.clear_query_tool() self.page.click_element(editor_input) @@ -202,7 +206,7 @@ class QueryToolJourneyTest(BaseFeatureTest): QueryToolLocators.btn_execute_query_css).click() self.page.wait_for_query_tool_loading_indicator_to_disappear() - self.page.click_tab("Query History") + self.page.click_tab(self.query_history_tab_name) query_list = self.page.wait_for_elements( lambda driver: driver.find_elements_by_css_selector( @@ -216,10 +220,10 @@ class QueryToolJourneyTest(BaseFeatureTest): self._test_toggle_generated_queries() def _test_history_query_sources(self): - self.page.click_tab("Query Editor") + self.page.click_tab(self.query_editor_tab_name) self._execute_sources_test_queries() - self.page.click_tab("Query History") + self.page.click_tab(self.query_history_tab_name) history_entries_icons = [ QueryToolLocators.commit_icon, @@ -235,9 +239,9 @@ class QueryToolJourneyTest(BaseFeatureTest): "UPDATE public.%s SET normal_column = '10'::numeric " "WHERE pk_column = '1';" % self.test_editable_table_name, "BEGIN;", - "SELECT * FROM %s" % self.test_editable_table_name, - "SELECT * FROM %s" % self.test_editable_table_name, - "SELECT * FROM %s" % self.test_editable_table_name + self.select_query % self.test_editable_table_name, + self.select_query % self.test_editable_table_name, + self.select_query % self.test_editable_table_name ] self._check_history_queries_and_icons(history_entries_queries, @@ -256,7 +260,7 @@ class QueryToolJourneyTest(BaseFeatureTest): def _test_updatable_resultset(self): if self.driver_version < 2.8: return - self.page.click_tab("Query Editor") + self.page.click_tab(self.query_editor_tab_name) # Select all data # (contains the primary key -> all columns should be editable) @@ -286,7 +290,7 @@ class QueryToolJourneyTest(BaseFeatureTest): def _test_is_editable_columns_icons(self): if self.driver_version < 2.8: return - self.page.click_tab("Query Editor") + self.page.click_tab(self.query_editor_tab_name) self.page.clear_query_tool() query = "SELECT pk_column FROM %s" % self.test_editable_table_name @@ -310,15 +314,15 @@ class QueryToolJourneyTest(BaseFeatureTest): self.page.clear_query_tool() self._explain_query( - "SELECT * FROM %s;" + self.select_query % self.test_editable_table_name ) self._explain_analyze_query( - "SELECT * FROM %s;" + self.select_query % self.test_editable_table_name ) self.page.execute_query( - "SELECT * FROM %s;" + self.select_query % self.test_editable_table_name ) @@ -376,12 +380,12 @@ class QueryToolJourneyTest(BaseFeatureTest): """ Updates a numeric cell in the first row of the resultset """ - self.page.check_if_element_exist_by_xpath( - "//div[contains(@style, 'top:0px')]//div[contains(@class, " - "'l{0} r{1}')]".format(cell_index, cell_index)) - cell_el = self.page.find_by_xpath( - "//div[contains(@style, 'top:0px')]//div[contains(@class, " - "'l{0} r{1}')]".format(cell_index, cell_index)) + cell_xpath = "//div[contains(@style, 'top:0px')]//" \ + "div[contains(@class,'l{0} r{1}')]". \ + format(cell_index, cell_index) + + self.page.check_if_element_exist_by_xpath(cell_xpath) + cell_el = self.page.find_by_xpath(cell_xpath) ActionChains(self.driver).double_click(cell_el).perform() ActionChains(self.driver).send_keys(value). \ send_keys(Keys.ENTER).perform() @@ -389,7 +393,7 @@ class QueryToolJourneyTest(BaseFeatureTest): QueryToolLocators.btn_save_data).click() def _insert_data_into_test_editable_table(self): - self.page.click_tab("Query Editor") + self.page.click_tab(self.query_editor_tab_name) self.page.clear_query_tool() self.page.execute_query( "INSERT INTO %s VALUES (1, 1), (2, 2);" diff --git a/web/pgadmin/feature_tests/query_tool_tests.py b/web/pgadmin/feature_tests/query_tool_tests.py index 9328d4b50..4b3b1537e 100644 --- a/web/pgadmin/feature_tests/query_tool_tests.py +++ b/web/pgadmin/feature_tests/query_tool_tests.py @@ -30,6 +30,8 @@ class QueryToolFeatureTest(BaseFeatureTest): scenarios = [ ("Query tool feature test", dict()) ] + data_output_tab_name = 'Data Output' + table_creation_fail_error = '"CREATE TABLE message does not displayed"' def before(self): self.page.wait_for_spinner_to_disappear() @@ -46,6 +48,7 @@ class QueryToolFeatureTest(BaseFeatureTest): # on demand result set on scrolling. print("\nOn demand query result... ", file=sys.stderr, end="") + skip_warning = "Skipped." self._on_demand_result() self.page.clear_query_tool() @@ -57,7 +60,7 @@ class QueryToolFeatureTest(BaseFeatureTest): print("OK.", file=sys.stderr) self.page.clear_query_tool() else: - print("Skipped.", file=sys.stderr) + print(skip_warning, file=sys.stderr) # explain analyze query with buffers and timing print("Explain analyze query with buffers and timing... ", @@ -67,7 +70,7 @@ class QueryToolFeatureTest(BaseFeatureTest): print("OK.", file=sys.stderr) self.page.clear_query_tool() else: - print("Skipped.", file=sys.stderr) + print(skip_warning, file=sys.stderr) # auto commit disabled. print("Auto commit disabled... ", file=sys.stderr, end="") @@ -106,7 +109,7 @@ class QueryToolFeatureTest(BaseFeatureTest): print("OK.", file=sys.stderr) self.page.clear_query_tool() else: - print("Skipped.", file=sys.stderr) + print(skip_warning, file=sys.stderr) def after(self): self.page.remove_server(self.server) @@ -276,7 +279,7 @@ SELECT generate_series(1, 1000) as id order by id desc""" self.page.wait_for_query_tool_loading_indicator_to_disappear() - self.page.click_tab('Data Output') + self.page.click_tab(self.data_output_tab_name) canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css)) @@ -310,7 +313,7 @@ SELECT generate_series(1, 1000) as id order by id desc""" self.page.wait_for_query_tool_loading_indicator_to_disappear() - self.page.click_tab('Data Output') + self.page.click_tab(self.data_output_tab_name) self.wait.until(EC.presence_of_element_located( (By.XPATH, QueryToolLocators.output_cell_xpath.format(1, 1))) @@ -351,7 +354,7 @@ CREATE TABLE public.{}();""".format(table_name) self.assertTrue(self.page.check_if_element_exist_by_xpath( QueryToolLocators.sql_editor_message.format('CREATE TABLE')), - "CREATE TABLE message does not displayed") + self.table_creation_fail_error) # do the ROLLBACK and check if the table is present or not self.page.clear_query_tool() @@ -375,7 +378,7 @@ SELECT relname FROM pg_class WHERE relkind IN ('r','s','t') and relnamespace = 2200::oid;""" self.page.execute_query(query) - self.page.click_tab('Data Output') + self.page.click_tab(self.data_output_tab_name) canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css))) @@ -432,7 +435,7 @@ CREATE TABLE public.{}();""".format(table_name) self.page.click_tab('Messages') self.assertTrue(self.page.check_if_element_exist_by_xpath( QueryToolLocators.sql_editor_message.format('CREATE TABLE')), - "CREATE TABLE message does not displayed") + self.table_creation_fail_error) self.page.clear_query_tool() query = """-- 1. (Done) END any open transaction if any. @@ -459,7 +462,7 @@ SELECT relname FROM pg_class WHERE relkind IN ('r','s','t') and relnamespace = 2200::oid;""" self.page.execute_query(query) - self.page.click_tab('Data Output') + self.page.click_tab(self.data_output_tab_name) self.page.wait_for_query_tool_loading_indicator_to_disappear() canvas = self.wait.until(EC.presence_of_element_located( @@ -510,7 +513,7 @@ CREATE TABLE public.{}();""".format(table_name) self.page.click_tab('Messages') self.assertTrue(self.page.check_if_element_exist_by_xpath( QueryToolLocators.sql_editor_message.format('CREATE TABLE')), - "CREATE TABLE message does not displayed") + self.table_creation_fail_error) self.page.clear_query_tool() query = """-- 1. (Done) END any open transaction. @@ -554,7 +557,7 @@ SELECT relname FROM pg_class WHERE relkind IN ('r','s','t') and relnamespace = 2200::oid;""" self.page.execute_query(query) self.page.wait_for_query_tool_loading_indicator_to_disappear() - self.page.click_tab('Data Output') + self.page.click_tab(self.data_output_tab_name) canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css))) @@ -710,7 +713,7 @@ SELECT 1, pg_sleep(300)""" QueryToolLocators.btn_explain_analyze).click() self.page.wait_for_query_tool_loading_indicator_to_disappear() - self.page.click_tab('Data Output') + self.page.click_tab(self.data_output_tab_name) canvas = self.wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, QueryToolLocators.query_output_canvas_css)) diff --git a/web/pgadmin/feature_tests/view_data_dml_queries.py b/web/pgadmin/feature_tests/view_data_dml_queries.py index 4b7d88e4f..663289fe2 100644 --- a/web/pgadmin/feature_tests/view_data_dml_queries.py +++ b/web/pgadmin/feature_tests/view_data_dml_queries.py @@ -346,6 +346,7 @@ CREATE TABLE public.nonintpkey xpath = "//*[contains(@class, 'ui-widget-content') and " \ "contains(@style, 'top:" + str(row_height) + "px')]" + scroll_on_arg_for_js = "arguments[0].scrollIntoView(false)" self.page.wait_for_query_tool_loading_indicator_to_disappear() @@ -362,7 +363,7 @@ 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) + scroll_on_arg_for_js, element) break except Exception: print("stale reference exception at id:", idx) @@ -380,4 +381,4 @@ CREATE TABLE public.nonintpkey 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) + scroll_on_arg_for_js, 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 439bbd147..a9bb99c54 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 @@ -38,6 +38,8 @@ class CheckForXssFeatureTest(BaseFeatureTest): ("Test XSS check for panels and query tool", dict()) ] test_type_name = '"<script>alert(1)</script>"' + check_xss_chars = '<h1>X' + check_xss_chars_set2 = '<script>alert(1)</script>' def before(self): self.test_table_name = "<h1>X" + str(random.randint(1000, 3000)) @@ -126,7 +128,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self._check_escaped_characters( source_code, - "<h1>X", + self.check_xss_chars, "Browser tree" ) @@ -144,7 +146,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self._check_escaped_characters( source_code, - "<h1>X", + self.check_xss_chars, "SQL tab (Code Mirror)" ) @@ -229,7 +231,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self._check_escaped_characters( source_code, - '<script>alert(1)</script>', + self.check_xss_chars_set2, "Query tool (History Entry)" ) @@ -246,7 +248,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self._check_escaped_characters( source_code, - '<script>alert(1)</script>', + self.check_xss_chars_set2, "Query tool (History Details-Message)" ) @@ -264,7 +266,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self._check_escaped_characters( source_code, - '<script>alert(1)</script>', + self.check_xss_chars_set2, "Query tool (History Details-Error)" ) @@ -286,7 +288,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self._check_escaped_characters( source_code, - '<script>alert(1)</script>', + self.check_xss_chars_set2, "View Data (SlickGrid)" ) @@ -329,7 +331,7 @@ class CheckForXssFeatureTest(BaseFeatureTest): self._check_escaped_characters( source_code, - "<h1>X", + self.check_xss_chars, "Explain tab (Graphical explain plan)" )