1 package net.avcompris.guixer.core;
2
3 import static com.google.common.base.Preconditions.checkNotNull;
4 import static com.google.common.base.Preconditions.checkState;
5 import static net.avcompris.commons3.it.utils.IntegrationTestUtils.getTestProperty;
6 import static org.apache.commons.lang3.StringUtils.substringBetween;
7
8 import java.io.File;
9 import java.lang.annotation.Annotation;
10 import java.net.URL;
11
12 import org.apache.commons.lang3.NotImplementedException;
13 import org.junit.jupiter.api.AfterEach;
14 import org.junit.jupiter.api.BeforeEach;
15 import org.openqa.selenium.Capabilities;
16 import org.openqa.selenium.WebDriver;
17 import org.openqa.selenium.WebDriverException;
18 import org.openqa.selenium.remote.DesiredCapabilities;
19 import org.openqa.selenium.remote.RemoteWebDriver;
20
21 public abstract class AbstractUITest extends MyAbstractUITestCommandImpl {
22
23 private WebDriver driver;
24 private String baseURL;
25 private static final Contextext.html#Context">Context context = new Context(new File("target/ui-it-results"));
26
27 protected AbstractUITest() {
28
29 super(context);
30 }
31
32 protected final WebDriver getDriver() {
33
34 final WebDriver driverCopy = driver;
35
36 checkState(driverCopy != null, "driver should have been set");
37
38 return driverCopy;
39 }
40
41 protected final String getBaseURL() {
42
43 final String baseURLCopy = baseURL;
44
45 checkState(baseURLCopy != null, "baseURL should have been set");
46
47 return baseURLCopy;
48 }
49
50 @BeforeEach
51 public final void setUpFirefox() throws Exception {
52
53 final String seleniumServerURL = getTestProperty("selenium.server.url");
54 final String seleniumDesiredCapabilities = getTestProperty("selenium.desiredCapabilities");
55
56 System.out.println("selenium.server.url: " + seleniumServerURL);
57 System.out.println("selenium.desiredCapabilities: " + seleniumDesiredCapabilities);
58
59 context.setSeleniumServerURL(seleniumServerURL);
60 context.setSeleniumDesiredCapabilities(seleniumDesiredCapabilities);
61
62 final Capabilities capabilities;
63
64 if ("firefox".contentEquals(seleniumDesiredCapabilities)) {
65 capabilities = DesiredCapabilities.firefox();
66 } else if ("chrome".contentEquals(seleniumDesiredCapabilities)) {
67 capabilities = DesiredCapabilities.chrome();
68 } else {
69 throw new NotImplementedException("selenium.desiredCapabilities: " + seleniumDesiredCapabilities);
70 }
71
72 driver = new RemoteWebDriver(new URL(seleniumServerURL), capabilities);
73 }
74
75 @AfterEach
76 public final void tearDownFirefox() throws Exception {
77
78 if (driver != null) {
79
80 try {
81
82 driver.quit();
83
84 } catch (final WebDriverException e) {
85
86
87
88 e.printStackTrace();
89 }
90
91 driver = null;
92 }
93 }
94
95 @BeforeEach
96 public final void setUpContext() throws Exception {
97
98 context.reset(Long.toString(System.currentTimeMillis()));
99
100 final String oldBaseURL = baseURL;
101
102 final Class<? extends AbstractUITest> testClass = this.getClass();
103
104 String baseURL = extractAnnotation(testClass, UIEnv.class).baseURL();
105
106 if (baseURL.startsWith("${")) {
107
108 baseURL = getTestProperty(substringBetween(baseURL, "${", "}"));
109 }
110
111 if (oldBaseURL == null || !baseURL.contentEquals(oldBaseURL)) {
112
113 System.out.println("baseURL: " + baseURL);
114 }
115
116 this.baseURL = baseURL;
117
118 context.setBaseURL(baseURL);
119 }
120
121 @AfterEach
122 public final void tearDownContext() throws Exception {
123
124 context.close();
125 }
126
127 private <T extends Annotation> T extractAnnotation(final Class<?> clazz, final Class<T> annotationClass) {
128
129 checkNotNull(clazz, "clazz");
130 checkNotNull(annotationClass, "annotationClass");
131
132 final T annotation = clazz.getAnnotation(annotationClass);
133
134 if (annotation != null) {
135 return annotation;
136 }
137
138 final Class<?> superClass = clazz.getSuperclass();
139
140 if (superClass == null) {
141 throw new RuntimeException("Cannot find annotation: @" + annotationClass.getSimpleName() + ", on class: "
142 + this.getClass().getName());
143 }
144
145 return extractAnnotation(superClass, annotationClass);
146 }
147 }