Hi,

Please find the attached updated patch.

Thanks,
Khushboo

On Thu, May 11, 2017 at 2:41 PM, Dave Page <dp...@pgadmin.org> wrote:

> Hi
>
> On Thu, May 11, 2017 at 6:38 AM, Khushboo Vashi <
> khushboo.va...@enterprisedb.com> 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 (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to