From 5f26c4edd1d02ef722a0a0a32d1d2518b7ef0f17 Mon Sep 17 00:00:00 2001
From: Joao Pereira and Sarah McAlear <pair+jpereira+smcalear@pivotal.io>
Date: Thu, 2 Mar 2017 16:58:38 -0500
Subject: [PATCH 3/3] Improves screenshots and reduces test flakiness

- rename screenshot files to add python version
- put screenshots into separate pg version folders
---
 .../connect_to_server_feature_test.py              |  4 +--
 .../template_selection_feature_test.py             |  4 +--
 .../settings/templates/settings/settings.js        |  8 +++--
 web/regression/feature_utils/base_feature_test.py  | 35 +++++++++++++++++++---
 web/regression/feature_utils/pgadmin_page.py       | 13 +++++++-
 5 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/web/pgadmin/feature_tests/connect_to_server_feature_test.py b/web/pgadmin/feature_tests/connect_to_server_feature_test.py
index 00fada81..211385f8 100644
--- a/web/pgadmin/feature_tests/connect_to_server_feature_test.py
+++ b/web/pgadmin/feature_tests/connect_to_server_feature_test.py
@@ -19,9 +19,7 @@ class ConnectsToServerFeatureTest(BaseFeatureTest):
     Tests that a database connection can be created from the UI
     """
 
-    def setUp(self):
-        super(ConnectsToServerFeatureTest, self).setUp()
-
+    def before(self):
         connection = test_utils.get_db_connection(self.server['db'],
                                                   self.server['username'],
                                                   self.server['db_password'],
diff --git a/web/pgadmin/feature_tests/template_selection_feature_test.py b/web/pgadmin/feature_tests/template_selection_feature_test.py
index 56e2d59e..7b7c039f 100644
--- a/web/pgadmin/feature_tests/template_selection_feature_test.py
+++ b/web/pgadmin/feature_tests/template_selection_feature_test.py
@@ -5,9 +5,7 @@ from regression.feature_utils.base_feature_test import BaseFeatureTest
 
 
 class TemplateSelectionFeatureTest(BaseFeatureTest):
-    def setUp(self):
-        super(TemplateSelectionFeatureTest, self).setUp()
-
+    def before(self):
         connection = test_utils.get_db_connection(self.server['db'],
                                                   self.server['username'],
                                                   self.server['db_password'],
diff --git a/web/pgadmin/settings/templates/settings/settings.js b/web/pgadmin/settings/templates/settings/settings.js
index 7bc9b3fe..716ca885 100644
--- a/web/pgadmin/settings/templates/settings/settings.js
+++ b/web/pgadmin/settings/templates/settings/settings.js
@@ -23,12 +23,14 @@ define(
       // and reload the window
       show: function() {
         var obj = this;
-        alertify.confirm('{{ _('Reset layout') }}',
-          '{{ _('Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost.') }}',
+        alertify.confirm("{{ _('Reset layout') }}",
+          "{{ _('Are you sure you want to reset the current layout? This will cause the application to reload and any un-saved data will be lost.') }}",
           function() {
+            var reloadingIndicator = $('<div id="reloading-indicator"></div>');
+            $('body').append(reloadingIndicator);
             // Delete the record from database as well, then only reload page
             $.ajax({
-              url: '{{ url_for('settings.reset_layout') }}',
+              url: "{{ url_for('settings.reset_layout') }}",
               type: 'DELETE',
               async: false,
               success: function() {
diff --git a/web/regression/feature_utils/base_feature_test.py b/web/regression/feature_utils/base_feature_test.py
index f0c0167f..34bf4f48 100644
--- a/web/regression/feature_utils/base_feature_test.py
+++ b/web/regression/feature_utils/base_feature_test.py
@@ -1,9 +1,12 @@
+import errno
+import sys
+import os
+
 from datetime import datetime
 
 import config as app_config
 from pgadmin.utils.route import BaseTestGenerator
 from regression.feature_utils.pgadmin_page import PgadminPage
-import os
 
 
 class BaseFeatureTest(BaseTestGenerator):
@@ -20,6 +23,7 @@ class BaseFeatureTest(BaseTestGenerator):
             self.page.wait_for_spinner_to_disappear()
             self.page.reset_layout()
             self.page.wait_for_spinner_to_disappear()
+            self.before()
         except:
             self._screenshot()
             raise
@@ -27,12 +31,15 @@ class BaseFeatureTest(BaseTestGenerator):
     def runTest(self):
         pass
 
+    def before(self):
+        pass
+
     def after(self):
         pass
 
     def tearDown(self):
-        python2_failures = hasattr(self, "_resultForDoCleanups") and (
-            self._resultForDoCleanups.errors or self._resultForDoCleanups.failures)
+        python2_failures = hasattr(self, "_resultForDoCleanups") and self.current_test_failed()
+
         python3_failures = hasattr(self, '_outcome') and self.any_step_failed()
 
         if python2_failures or python3_failures:
@@ -46,6 +53,26 @@ class BaseFeatureTest(BaseTestGenerator):
                 return True
         return False
 
+    def current_test_failed(self):
+        all_failures = self._resultForDoCleanups.errors + self._resultForDoCleanups.failures
+        for failure in all_failures:
+            if failure[0] == self:
+                return True
+        return False
+
     def _screenshot(self):
+        path = '{0}/../screenshots/{1}'.format(self.CURRENT_PATH, self.server["name"].replace(" ", "_"))
+
+        try:
+            os.mkdir(path)
+        except OSError as e:
+            if e.errno == errno.EEXIST:
+                pass
+            else:
+                raise
+
+        date = datetime.now().strftime("%Y.%m.%d_%H.%M.%S")
+        python_version = sys.version.split(" ")[0]
+
         self.page.driver.save_screenshot(
-            '{0}/../screenshots/{1}-{2}.png'.format(self.CURRENT_PATH, self.__class__.__name__, str(datetime.now())))
+            '{0}/{1}-{2}-Python-{3}.png'.format(path, self.__class__.__name__, date, python_version))
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index 8622690c..96c28210 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -22,9 +22,10 @@ class PgadminPage:
         self.click_element(self.find_by_partial_link_text("File"))
         self.find_by_partial_link_text("Reset Layout").click()
         self.click_modal_ok()
+        self.wait_for_reloading_indicator_to_disappear()
 
     def click_modal_ok(self):
-        time.sleep(0.1)
+        time.sleep(0.5)
         self.click_element(self.find_by_xpath("//button[contains(.,'OK')]"))
 
     def add_server(self, server_config):
@@ -113,6 +114,16 @@ class PgadminPage:
 
         return self._wait_for("element to exist", element_if_it_exists)
 
+    def wait_for_reloading_indicator_to_disappear(self):
+        def reloading_indicator_has_disappeared(driver):
+            try:
+                driver.find_element_by_id("reloading-indicator")
+                return False
+            except NoSuchElementException:
+                return True
+
+        self._wait_for("reloading indicator to disappear", reloading_indicator_has_disappeared)
+
     def wait_for_spinner_to_disappear(self):
         def spinner_has_disappeared(driver):
             try:
-- 
2.11.0

