From 9093389bf4a7cc8b060c7598326eb0c00c0953d3 Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Tue, 14 May 2019 22:12:22 +0200
Subject: [PATCH] Fixed #431 - Save screenshots on error

---
 .../budgetmaster/integration/ImportTest.java  | 42 ++++++++++++++---
 .../integration/LoginControllerTest.java      | 45 ++++++++++++++++---
 .../budgetmaster/integration/SearchTest.java  | 28 +++++++++---
 .../helpers/IntegrationTestHelper.java        | 40 ++++++++++++++---
 .../SeleniumTestExecutionListener.java        | 17 -------
 5 files changed, 133 insertions(+), 39 deletions(-)

diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java
index 3722006bc..f39acd459 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/ImportTest.java
@@ -4,30 +4,62 @@ import de.deadlocker8.budgetmaster.Main;
 import de.deadlocker8.budgetmaster.authentication.UserService;
 import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTest;
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestName;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
 import org.junit.runner.RunWith;
 import org.openqa.selenium.WebDriver;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.firefox.FirefoxOptions;
 import org.springframework.boot.context.embedded.LocalServerPort;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
 
 import java.io.File;
 import java.util.Arrays;
 import java.util.List;
 
-@RunWith(SpringJUnit4ClassRunner.class)
+@RunWith(SpringRunner.class)
 @SpringBootTest(classes = Main.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
 @SeleniumTest
 public class ImportTest
 {
-	@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
-	@Autowired
 	private WebDriver driver;
 
 	@LocalServerPort
 	int port;
 
+	@Rule
+	public TestName name = new TestName();
+
+	@Rule
+	public TestWatcher testWatcher = new TestWatcher()
+	{
+		@Override
+		protected void finished(Description description)
+		{
+			driver.quit();
+		}
+
+		@Override
+		protected void failed(Throwable e, Description description)
+		{
+			IntegrationTestHelper.saveScreenshots(driver, name, SearchTest.class);
+		}
+	};
+
+	@Before
+	public void prepare()
+	{
+		FirefoxOptions options = new FirefoxOptions();
+		options.setHeadless(true);
+		driver = new FirefoxDriver(options);
+	}
 	@Test
 	public void requestImport()
 	{
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java
index 1b4c17f45..f6a269539 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/LoginControllerTest.java
@@ -5,31 +5,64 @@ import de.deadlocker8.budgetmaster.authentication.UserService;
 import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
 import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTest;
 import de.thecodelabs.utils.util.Localization;
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestName;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
 import org.junit.runner.RunWith;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.firefox.FirefoxOptions;
 import org.springframework.boot.context.embedded.LocalServerPort;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-@RunWith(SpringJUnit4ClassRunner.class)
+@RunWith(SpringRunner.class)
 @SpringBootTest(classes = Main.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
 @SeleniumTest
 public class LoginControllerTest
 {
-	@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
-	@Autowired
 	private WebDriver driver;
 
 	@LocalServerPort
 	int port;
 
+	@Rule
+	public TestName name = new TestName();
+
+	@Rule
+	public TestWatcher testWatcher = new TestWatcher()
+	{
+		@Override
+		protected void finished(Description description)
+		{
+			driver.quit();
+		}
+
+		@Override
+		protected void failed(Throwable e, Description description)
+		{
+			IntegrationTestHelper.saveScreenshots(driver, name, SearchTest.class);
+		}
+	};
+
+	@Before
+	public void prepare()
+	{
+		FirefoxOptions options = new FirefoxOptions();
+		options.setHeadless(true);
+		driver = new FirefoxDriver(options);
+	}
+
 	@Test
 	public void getLoginPage()
 	{
@@ -63,6 +96,7 @@ public class LoginControllerTest
 		IntegrationTestHelper helper = new IntegrationTestHelper(driver, port);
 		helper.start();
 		helper.login(UserService.DEFAULT_PASSWORD);
+		helper.hideBackupReminder();
 
 		WebElement label = driver.findElement(By.id("logo-home"));
 		String expected = helper.getUrl() + "/images/Logo_with_text_medium_res.png";
@@ -75,6 +109,7 @@ public class LoginControllerTest
 		IntegrationTestHelper helper = new IntegrationTestHelper(driver, port);
 		helper.start();
 		helper.login(UserService.DEFAULT_PASSWORD);
+		helper.hideBackupReminder();
 
 		WebElement buttonLogout = driver.findElement(By.xpath("//body/ul/li/a[contains(text(), 'Logout')]"));
 		buttonLogout.click();
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java
index 5a003a664..1b4b3004e 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/SearchTest.java
@@ -7,7 +7,11 @@ import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTest;
 import de.thecodelabs.utils.util.Localization;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestName;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
 import org.junit.runner.RunWith;
 import org.openqa.selenium.By;
 import org.openqa.selenium.JavascriptExecutor;
@@ -39,6 +43,25 @@ public class SearchTest
 	@LocalServerPort
 	int port;
 
+	@Rule
+	public TestName name = new TestName();
+
+	@Rule
+	public TestWatcher testWatcher = new TestWatcher()
+	{
+		@Override
+		protected void finished(Description description)
+		{
+			driver.quit();
+		}
+
+		@Override
+		protected void failed(Throwable e, Description description)
+		{
+			IntegrationTestHelper.saveScreenshots(driver, name, SearchTest.class);
+		}
+	};
+
 	@Before
 	public void prepare()
 	{
@@ -61,11 +84,6 @@ public class SearchTest
 		driver.findElement(By.id("buttonSearch")).click();
 	}
 
-	@After
-	public void adftet() {
-		driver.quit();
-	}
-
 	@Test
 	public void searchFromNavbar()
 	{
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/IntegrationTestHelper.java b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/IntegrationTestHelper.java
index 66d440e9c..d6a0e1793 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/IntegrationTestHelper.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/IntegrationTestHelper.java
@@ -1,11 +1,14 @@
 package de.deadlocker8.budgetmaster.integration.helpers;
 
 import de.thecodelabs.utils.util.Localization;
-import org.openqa.selenium.By;
-import org.openqa.selenium.NoSuchElementException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-
+import org.junit.rules.TestName;
+import org.openqa.selenium.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -23,7 +26,7 @@ public class IntegrationTestHelper
 		return text;
 	}
 
-	private final static String BASE_URL = "https://localhost:";
+	private final static String BASE_URL = "http://localhost:";
 	private WebDriver driver;
 	private String url;
 
@@ -123,8 +126,31 @@ public class IntegrationTestHelper
 			assertEquals(sourceAccounts.get(i), IntegrationTestHelper.getTextNode(sourceAccount));
 
 			row.findElement(By.className("select-dropdown")).click();
-			WebElement accountToSelect = row.findElement(By.xpath("//form/table/tbody/tr[" + (i+1) + "]/td[5]/div/div/ul/li/span[text()='" + account + "']"));
+			WebElement accountToSelect = row.findElement(By.xpath("//form/table/tbody/tr[" + (i + 1) + "]/td[5]/div/div/ul/li/span[text()='" + account + "']"));
 			accountToSelect.click();
 		}
 	}
+
+	public static void saveScreenshots(WebDriver webDriver, TestName testName, Class testClass)
+	{
+		File screenshot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
+
+		String className = testClass.getSimpleName();
+		String methodName = testName.getMethodName();
+		final Path destination = Paths.get("screenshots", className + "_" + methodName + "_" + screenshot.getName());
+
+		try
+		{
+			if(Files.notExists(destination.getParent()))
+			{
+				Files.createDirectories(destination.getParent());
+			}
+
+			Files.copy(screenshot.toPath(), destination);
+		}
+		catch(IOException e)
+		{
+			throw new RuntimeException(e);
+		}
+	}
 }
diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java
index 742d3dba7..335885a2a 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/helpers/SeleniumTestExecutionListener.java
@@ -40,22 +40,5 @@ public class SeleniumTestExecutionListener extends AbstractTestExecutionListener
 		{
 			e.printStackTrace();
 		}
-
-//		if(testContext.getTestException() == null)
-//		{
-//			return;
-//		}
-//		File screenshot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
-//
-//		String testName = testContext.getTestClass().getSimpleName();
-//		String methodName = testContext.getTestMethod().getName();
-//		final Path destination = Paths.get("screenshots", testName + "_" + methodName + "_" + screenshot.getName());
-//
-//		if(Files.notExists(destination.getParent()))
-//		{
-//			Files.createDirectories(destination.getParent());
-//		}
-//
-//		Files.copy(screenshot.toPath(), destination);
 	}
 }
-- 
GitLab