Hi, As we have been facing many issues with different data-type display in Query Tool output, Dave suggested to write the feature test for the same.
I have started with some basic set of data-type values and will add more. Please find the attached initial patch for the same. Thanks, Khushboo
diff --git a/web/pgadmin/feature_tests/pg_datatype_validation_test.py b/web/pgadmin/feature_tests/pg_datatype_validation_test.py new file mode 100644 index 0000000..2400b6d --- /dev/null +++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py @@ -0,0 +1,138 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2017, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +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 +import time + + +class PGDataypeFeatureTest(BaseFeatureTest): + """ + This feature test will test the different Postgres + data-type output. + """ + + scenarios = [ + ("Test checks for PG data-types output", dict()) + ] + + def before(self): + connection = test_utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + test_utils.drop_database(connection, "acceptance_test_db") + test_utils.create_database(self.server, "acceptance_test_db") + + def runTest(self): + self.page.wait_for_spinner_to_disappear() + self._connects_to_server() + self._schema_node_expandable() + + # Check data types + self._check_datatype() + + def after(self): + time.sleep(1) + self.page.remove_server(self.server) + connection = test_utils.get_db_connection(self.server['db'], + self.server['username'], + self.server['db_password'], + self.server['host'], + self.server['port']) + test_utils.drop_database(connection, "acceptance_test_db") + + def _connects_to_server(self): + self.page.find_by_xpath("//*[@class='aciTreeText' and .='Servers']").click() + self.page.driver.find_element_by_link_text("Object").click() + ActionChains(self.page.driver) \ + .move_to_element(self.page.driver.find_element_by_link_text("Create")) \ + .perform() + self.page.find_by_partial_link_text("Server...").click() + + server_config = self.server + self.page.fill_input_by_field_name("name", server_config['name']) + self.page.find_by_partial_link_text("Connection").click() + self.page.fill_input_by_field_name("host", server_config['host']) + self.page.fill_input_by_field_name("port", server_config['port']) + self.page.fill_input_by_field_name("username", server_config['username']) + self.page.fill_input_by_field_name("password", server_config['db_password']) + self.page.find_by_xpath("//button[contains(.,'Save')]").click() + + 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('acceptance_test_db') + self.page.toggle_open_tree_item('Schemas') + self.page.toggle_open_tree_item('public') + + def _check_datatype(self): + sample_values = ['-32767', '32767', '-2147483647', '2147483647', '9223372036854775807', '9223372036854775807', + '922337203685.4775807', '92203685.477', '922337203685.922337203685', '-92233720368547758.08', + "ARRAY[1, 2, 'nan']::float[]" + ] + + expected_output = ['-32767', '32767', '-2147483647', '2147483647', '9223372036854775807', '9223372036854775807', + '922337203685.4775807', '92203685.477', '922337203685.922337203685', '-92233720368547758.08', + "1, 2, 'nan'" + ] + + # For every sample data-type value, run the query and check the expected output. + # The query tool will open and close for every single value as in case of ARRAY[1, 2, 'nan']::float[], + # we didn't get the output in the panel instead just the message. + cnt = 0 + for val in sample_values: + self._open_query_tool() + self.page.fill_codemirror_area_with("SELECT " + val + ";") + time.sleep(1) + self.page.find_by_id("btn-flash").click() + time.sleep(2) + + try: + source_code = self.page.find_by_xpath( + "//*[@id='0']//*[@id='datagrid']/div[5]/div/div[1]/div[2]/span" + ).get_attribute('innerHTML') + + self._check_result( + source_code, + expected_output[cnt] + ) + cnt += 1 + except TimeoutException: + assert False, "{0} does not match with {1}".format(val, expected_output[cnt]) + self._close_query_tool() + + def _open_query_tool(self): + self.page.driver.find_element_by_link_text("Tools").click() + self.page.find_by_partial_link_text("Query Tool").click() + time.sleep(3) + self.page.driver.switch_to.frame(self.page.driver.find_element_by_tag_name('iframe')) + + def _close_query_tool(self): + self.page.driver.switch_to_default_content() + self.page.click_element( + self.page.find_by_xpath("//*[@id='dockerContainer']/div/div[3]/div/div[2]/div[1]") + ) + time.sleep(0.5) + self.page.driver.switch_to.frame(self.page.driver.find_element_by_tag_name('iframe')) + time.sleep(1) + self.page.click_element(self.page.find_by_xpath("//button[contains(.,'Yes')]")) + time.sleep(0.5) + self.page.driver.switch_to_default_content() + + def _check_result(self, source_code, string_to_find): + if source_code.find(string_to_find) == -1: + assert False, "{0} does not match with {1}".format(source_code, string_to_find) + else: + assert True + +
-- Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-hackers