From 20c11eed76237c7969c65f975ef2387ccb00fed7 Mon Sep 17 00:00:00 2001
From: Joao Pereira and Tira Odhner <pair+jpereira+aodhner@pivotal.io>
Date: Wed, 1 Mar 2017 16:18:48 -0500
Subject: [PATCH 2/3] Create screenshot with timestamp when tests fail

---
 web/regression/feature_utils/base_feature_test.py | 32 +++++++++++++++++++----
 web/regression/feature_utils/pgadmin_page.py      |  4 +--
 web/regression/test_utils.py                      |  2 +-
 3 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/web/regression/feature_utils/base_feature_test.py b/web/regression/feature_utils/base_feature_test.py
index 2d275a05..f0c0167f 100644
--- a/web/regression/feature_utils/base_feature_test.py
+++ b/web/regression/feature_utils/base_feature_test.py
@@ -1,3 +1,5 @@
+from datetime import datetime
+
 import config as app_config
 from pgadmin.utils.route import BaseTestGenerator
 from regression.feature_utils.pgadmin_page import PgadminPage
@@ -6,16 +8,21 @@ import os
 
 class BaseFeatureTest(BaseTestGenerator):
     CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
+
     def setUp(self):
         if app_config.SERVER_MODE:
             self.skipTest("Currently, config is set to start pgadmin in server mode. "
                           "This test doesn't know username and password so doesn't work in server mode")
 
         self.page = PgadminPage(self.driver, app_config)
-        self.page.wait_for_app()
-        self.page.wait_for_spinner_to_disappear()
-        self.page.reset_layout()
-        self.page.wait_for_spinner_to_disappear()
+        try:
+            self.page.wait_for_app()
+            self.page.wait_for_spinner_to_disappear()
+            self.page.reset_layout()
+            self.page.wait_for_spinner_to_disappear()
+        except:
+            self._screenshot()
+            raise
 
     def runTest(self):
         pass
@@ -24,6 +31,21 @@ class BaseFeatureTest(BaseTestGenerator):
         pass
 
     def tearDown(self):
-        self.page.driver.save_screenshot('{0}/../screenshots/{1}.png'.format(self.CURRENT_PATH, self.__class__.__name__))
+        python2_failures = hasattr(self, "_resultForDoCleanups") and (
+            self._resultForDoCleanups.errors or self._resultForDoCleanups.failures)
+        python3_failures = hasattr(self, '_outcome') and self.any_step_failed()
+
+        if python2_failures or python3_failures:
+            self._screenshot()
+
         self.after()
 
+    def any_step_failed(self):
+        for step in self._outcome.errors:
+            if step[1] is not None:
+                return True
+        return False
+
+    def _screenshot(self):
+        self.page.driver.save_screenshot(
+            '{0}/../screenshots/{1}-{2}.png'.format(self.CURRENT_PATH, self.__class__.__name__, str(datetime.now())))
diff --git a/web/regression/feature_utils/pgadmin_page.py b/web/regression/feature_utils/pgadmin_page.py
index 952b3722..8622690c 100644
--- a/web/regression/feature_utils/pgadmin_page.py
+++ b/web/regression/feature_utils/pgadmin_page.py
@@ -55,10 +55,10 @@ class PgadminPage:
         self.find_by_xpath("//*[@id='tree']//*[.='" + tree_item_text + "']/../*[@class='aciTreeButton']").click()
 
     def find_by_xpath(self, xpath):
-        return self.wait_for_element(lambda (driver): driver.find_element_by_xpath(xpath))
+        return self.wait_for_element(lambda driver: driver.find_element_by_xpath(xpath))
 
     def find_by_id(self, element_id):
-        return self.wait_for_element(lambda (driver): driver.find_element_by_id(element_id))
+        return self.wait_for_element(lambda driver: driver.find_element_by_id(element_id))
 
     def find_by_partial_link_text(self, link_text):
         return self._wait_for(
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
index 199934d8..0848905c 100644
--- a/web/regression/test_utils.py
+++ b/web/regression/test_utils.py
@@ -16,8 +16,8 @@ import sqlite3
 from functools import partial
 
 import config
-import test_setup
 import regression
+from regression import test_setup
 
 SERVER_GROUP = test_setup.config_data['server_group']
 file_name = os.path.realpath(__file__)
-- 
2.11.0

