Hi,
Please find the attached updated patch.
Thanks,
Khushboo
On Thu, May 11, 2017 at 2:41 PM, Dave Page <[email protected]> wrote:
> Hi
>
> On Thu, May 11, 2017 at 6:38 AM, Khushboo Vashi <
> [email protected]> wrote:
>
>> 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.
>>
>
> Some thoughts:
>
> - Instead of sleeping, which is almost always a bad design, can we wait
> for objects to appear?
>
> Fixed
> - Currently you're testing each datatype with an individual query, e.g.
>
> SELECT 32768;
>
> I would suggest we test all datatypes at once, e.g.
>
> SELECT 32768, 43723489023489, '2017-09-12 15:34:11', 12345.56;
>
> etc. That will massively reduce the time taken to execute the tests (which
> is a big concern).
>
> Fixed
> - Shouldn't we be casting the values in the SELECT, so we (and the
> database) know exactly what we're expecting? e.g.
>
> Fixed
> SELECT 32768::int, 43723489023489::bigint, '2017-09-12
> 15:34:11':timestamp, 12345.56::numeric(8,4);
>
> That would also allow us to verify the type name displayed in the column
> headers.
>
> Thanks!
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
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..343ed2b
--- /dev/null
+++ b/web/pgadmin/feature_tests/pg_datatype_validation_test.py
@@ -0,0 +1,135 @@
+##########################################################################
+#
+# 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 selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.common.by import By
+from regression.python_test_utils import test_utils
+from regression.feature_utils.base_feature_test import BaseFeatureTest
+
+
+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()
+ self._close_query_tool()
+
+ def after(self):
+ 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):
+ query = """SELECT -32767::smallint, 32767::smallint, -2147483647::integer, 2147483647::integer,
+9223372036854775807::bigint, 9223372036854775807::bigint,922337203685.4775807::decimal, 92203685.477::decimal,
+922337203685.922337203685::numeric,-92233720368547758.08::numeric;"""
+ # TODO :: Currently there is an issue with ARRAY[1, 2, 'nan']::float[] == "1, 2, 'nan'" datatype,
+ # so ignoring this, will add once the issue will be fixed.
+
+ expected_output = ['-32767', '32767', '-2147483647', '2147483647', '9223372036854775807', '9223372036854775807',
+ '922337203685.4775807', '92203685.477', '922337203685.922337203685', '-92233720368547758.08'
+ ]
+
+ self.page.driver.find_element_by_link_text("Tools").click()
+ self.page.find_by_partial_link_text("Query Tool").click()
+ wait = WebDriverWait(self.page.driver, 5)
+ element = wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, 'iframe')))
+
+ if element:
+ self.page.fill_codemirror_area_with(query)
+ self.page.find_by_id("btn-flash").click()
+ wait.until(EC.presence_of_element_located(
+ (By.XPATH, "//*[@id='0']//*[@id='datagrid']/div[5]/div/div[1]/div[2]/span")))
+
+ # For every sample data-type value, check the expected output.
+ cnt = 2
+ for val in expected_output:
+ try:
+ source_code = self.page.find_by_xpath(
+ "//*[@id='0']//*[@id='datagrid']/div[5]/div/div[1]/div[" + str(cnt) + "]/span"
+ ).get_attribute('innerHTML')
+
+ PGDataypeFeatureTest.check_result(
+ source_code,
+ expected_output[cnt - 2]
+ )
+ cnt += 1
+ except TimeoutException:
+ assert False, "{0} does not match with {1}".format(val, expected_output[cnt])
+
+ 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]")
+ )
+ wait = WebDriverWait(self.page.driver, 1)
+ wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, 'iframe')))
+ self.page.click_element(self.page.find_by_xpath("//button[contains(.,'Yes')]"))
+ self.page.driver.switch_to_default_content()
+
+ @staticmethod
+ def check_result(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
+
+
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index f5d0ac7..f037c75 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -8,6 +8,7 @@
##########################################################################
import time
+import math
from selenium.common.exceptions import NoSuchElementException, WebDriverException
from selenium.webdriver import ActionChains
@@ -115,7 +116,12 @@ class PgadminPage:
def fill_codemirror_area_with(self, field_content):
self.find_by_xpath(
"//pre[contains(@class,'CodeMirror-line')]/../../../*[contains(@class,'CodeMirror-code')]").click()
- ActionChains(self.driver).send_keys(field_content).perform()
+ action = ActionChains(self.driver)
+ action.send_keys(field_content)
+ sleep_time = math.ceil(len(field_content) / 50)
+ time.sleep(sleep_time)
+ action.perform()
+ time.sleep(1)
def click_tab(self, tab_name):
self.find_by_xpath("//*[contains(@class,'wcTabTop')]//*[contains(@class,'wcPanelTab') "
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers