Skip to content

Commit 86c1b50

Browse files
committed
[java] implement visual options from Map
1 parent 11d7745 commit 86c1b50

File tree

3 files changed

+200
-0
lines changed

3 files changed

+200
-0
lines changed

java/main/src/main/java/com/saucelabs/saucebindings/options/VisualOptions.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,22 @@ public MutableCapabilities toCapabilities() {
8484

8585
return toReturn;
8686
}
87+
88+
/**
89+
* Use Case is pulling serialized information from JSON/YAML, converting it to a HashMap and passing it in
90+
* This is a preferred pattern as it avoids conditionals in code
91+
* Warning: For VisualOptions this adds a hard coded Test Name that needs to be updated
92+
*
93+
* @param capabilitiesToMerge a Map object representing key value pairs to convert to capabilities
94+
*/
95+
public void mergeCapabilities(Map<String, Object> capabilitiesToMerge) {
96+
for (Map.Entry<String, Object> entry : capabilitiesToMerge.entrySet()) {
97+
String key = entry.getKey();
98+
if (key.equals("visual")) {
99+
((Map<String, Object>) entry.getValue()).forEach(this::setCapability);
100+
} else {
101+
sauceOptions.setCapability(key, entry.getValue());
102+
}
103+
}
104+
}
87105
}

java/main/src/test/java/com/saucelabs/saucebindings/options.yml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,77 @@ exampleValues:
4949
tunnelIdentifier: 'tunnelname'
5050
videoUploadOnPass: false
5151

52+
visualValues:
53+
browserName: 'firefox'
54+
browserVersion: '68'
55+
platformName: 'macOS 10.13'
56+
acceptInsecureCerts: true
57+
pageLoadStrategy: 'eager'
58+
setWindowRect: true
59+
unhandledPromptBehavior: "accept"
60+
strictFileInteractability: true
61+
timeouts:
62+
implicit: 1000
63+
pageLoad: 59000
64+
script: 29000
65+
visual:
66+
projectName: 'My Project'
67+
viewportSize: 393x786
68+
baseBranch: baseBranch
69+
ignore: '#some-id, .some-selector'
70+
failOnNewStates: true
71+
alwaysAcceptBaseBranch: true
72+
disableBranchBaseline: true
73+
scrollAndStitchScreenshots: true
74+
disableCORS: true
75+
iframes: true
76+
diffOptions:
77+
structure: true
78+
layout: true
79+
style: true
80+
content: true
81+
minLayoutPosition: 4
82+
minLayoutDimension: 10
83+
iframesOptions:
84+
maxFrames: Infinity
85+
sauce:
86+
avoidProxy: true
87+
build: 'Sample Build Name'
88+
capturePerformance: true
89+
chromedriverVersion: '71'
90+
commandTimeout: 2
91+
customData:
92+
foo: 'foo'
93+
bar: 'bar'
94+
extendedDebugging: true
95+
idleTimeout: 3
96+
iedriverVersion: '3.141.0'
97+
maxDuration: 300
98+
name: 'Sample Test Name'
99+
parentTunnel: 'Mommy'
100+
prerun:
101+
executable: "http://url.to/your/executable.exe"
102+
args:
103+
- --silent
104+
- -a
105+
- -q
106+
background: false
107+
timeout: 120
108+
priority: 0
109+
jobVisibility: 'team'
110+
recordLogs: false
111+
recordScreenshots: false
112+
recordVideo: false
113+
screenResolution: '10x10'
114+
seleniumVersion: '3.141.59'
115+
tags:
116+
- foo
117+
- bar
118+
- foobar
119+
timeZone: 'San Francisco'
120+
tunnelIdentifier: 'tunnelname'
121+
videoUploadOnPass: false
122+
52123
badBrowser:
53124
browserName: "netscape"
54125

java/main/src/test/java/com/saucelabs/saucebindings/options/VisualOptionsTest.java

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,24 @@
33
import com.saucelabs.saucebindings.Browser;
44
import com.saucelabs.saucebindings.CITools;
55
import com.saucelabs.saucebindings.GitManager;
6+
import com.saucelabs.saucebindings.JobVisibility;
7+
import com.saucelabs.saucebindings.PageLoadStrategy;
8+
import com.saucelabs.saucebindings.Prerun;
69
import com.saucelabs.saucebindings.SaucePlatform;
710
import com.saucelabs.saucebindings.SystemManager;
11+
import com.saucelabs.saucebindings.UnhandledPromptBehavior;
12+
import lombok.SneakyThrows;
813
import org.junit.Test;
914
import org.openqa.selenium.MutableCapabilities;
15+
import org.yaml.snakeyaml.Yaml;
1016

17+
import java.io.File;
18+
import java.io.FileInputStream;
19+
import java.io.InputStream;
20+
import java.time.Duration;
21+
import java.util.ArrayList;
1122
import java.util.HashMap;
23+
import java.util.List;
1224
import java.util.Map;
1325

1426
import static org.junit.Assert.assertEquals;
@@ -155,4 +167,103 @@ public void requiresTestName() {
155167
// Expected result
156168
}
157169
}
170+
171+
@Test
172+
public void setsCapabilitiesFromMap() {
173+
Map<String, Object> map = serialize("visualValues");
174+
VisualOptions visualOptions = new VisualOptions("Required Test Name");
175+
176+
visualOptions.mergeCapabilities(map);
177+
178+
Map<String, Object> diffOptions = new HashMap<>();
179+
diffOptions.put("structure", true);
180+
diffOptions.put("layout", true);
181+
diffOptions.put("style", true);
182+
diffOptions.put("content", true);
183+
diffOptions.put("minLayoutPosition", 4);
184+
diffOptions.put("minLayoutDimension", 10);
185+
186+
Map<String, Object> iframesOptions = new HashMap<>();
187+
iframesOptions.put("maxFrames", "Infinity");
188+
189+
Map<String, Object> customData = new HashMap<>();
190+
customData.put("foo", "foo");
191+
customData.put("bar", "bar");
192+
193+
List<String> args = new ArrayList<>();
194+
args.add("--silent");
195+
args.add("-a");
196+
args.add("-q");
197+
198+
Map<Prerun, Object> prerun = new HashMap<>();
199+
prerun.put(Prerun.EXECUTABLE, "http://url.to/your/executable.exe");
200+
prerun.put(Prerun.ARGS, args);
201+
prerun.put(Prerun.BACKGROUND, false);
202+
prerun.put(Prerun.TIMEOUT, 120);
203+
204+
List<String> tags = new ArrayList<>();
205+
tags.add("foo");
206+
tags.add("bar");
207+
tags.add("foobar");
208+
209+
SauceOptions sauceOptions = visualOptions.getSauceOptions();
210+
211+
assertEquals(Browser.FIREFOX, sauceOptions.getBrowserName());
212+
assertEquals("68", sauceOptions.getBrowserVersion());
213+
assertEquals(SaucePlatform.MAC_HIGH_SIERRA, sauceOptions.getPlatformName());
214+
assertEquals(true, sauceOptions.getAcceptInsecureCerts());
215+
assertEquals(PageLoadStrategy.EAGER, sauceOptions.getPageLoadStrategy());
216+
assertEquals(true, sauceOptions.getSetWindowRect());
217+
assertEquals(UnhandledPromptBehavior.ACCEPT, sauceOptions.getUnhandledPromptBehavior());
218+
assertEquals(true, sauceOptions.getStrictFileInteractability());
219+
assertEquals(Duration.ofSeconds(1), sauceOptions.getImplicitWaitTimeout());
220+
assertEquals(Duration.ofSeconds(59), sauceOptions.getPageLoadTimeout());
221+
assertEquals(Duration.ofSeconds(29), sauceOptions.getScriptTimeout());
222+
assertEquals(true, sauceOptions.sauce().getAvoidProxy());
223+
assertEquals("Sample Build Name", sauceOptions.sauce().getBuild());
224+
assertEquals(true, sauceOptions.sauce().getCapturePerformance());
225+
assertEquals("71", sauceOptions.sauce().getChromedriverVersion());
226+
assertEquals(Integer.valueOf(2), sauceOptions.sauce().getCommandTimeout());
227+
assertEquals(customData, sauceOptions.sauce().getCustomData());
228+
assertEquals(true, sauceOptions.sauce().getExtendedDebugging());
229+
assertEquals(Integer.valueOf(3), sauceOptions.sauce().getIdleTimeout());
230+
assertEquals("3.141.0", sauceOptions.sauce().getIedriverVersion());
231+
assertEquals(Integer.valueOf(300), sauceOptions.sauce().getMaxDuration());
232+
assertEquals("Sample Test Name", sauceOptions.sauce().getName());
233+
assertEquals("Mommy", sauceOptions.sauce().getParentTunnel());
234+
assertEquals(prerun, sauceOptions.sauce().getPrerun());
235+
assertEquals(Integer.valueOf(0), sauceOptions.sauce().getPriority());
236+
assertEquals(JobVisibility.TEAM, sauceOptions.sauce().getJobVisibility());
237+
assertEquals(false, sauceOptions.sauce().getRecordLogs());
238+
assertEquals(false, sauceOptions.sauce().getRecordScreenshots());
239+
assertEquals(false, sauceOptions.sauce().getRecordVideo());
240+
assertEquals("10x10", sauceOptions.sauce().getScreenResolution());
241+
assertEquals("3.141.59", sauceOptions.sauce().getSeleniumVersion());
242+
assertEquals(tags, sauceOptions.sauce().getTags());
243+
assertEquals("San Francisco", sauceOptions.sauce().getTimeZone());
244+
assertEquals("tunnelname", sauceOptions.sauce().getTunnelIdentifier());
245+
assertEquals(false, sauceOptions.sauce().getVideoUploadOnPass());
246+
247+
assertEquals("My Project", visualOptions.getProjectName());
248+
assertEquals("393x786", visualOptions.getViewportSize());
249+
assertEquals("baseBranch", visualOptions.getBaseBranch());
250+
assertEquals(diffOptions, visualOptions.getDiffOptions());
251+
assertEquals("#some-id, .some-selector", visualOptions.getIgnore());
252+
assertTrue(visualOptions.getFailOnNewStates());
253+
assertTrue(visualOptions.getAlwaysAcceptBaseBranch());
254+
assertTrue(visualOptions.getDisableBranchBaseline());
255+
assertTrue(visualOptions.getScrollAndStitchScreenshots());
256+
assertTrue(visualOptions.getDisableCORS());
257+
assertTrue(visualOptions.getIframes());
258+
assertEquals(iframesOptions, visualOptions.getIframesOptions());
259+
}
260+
261+
@SneakyThrows
262+
public Map<String, Object> serialize(String key) {
263+
InputStream input = new FileInputStream(new File("src/test/java/com/saucelabs/saucebindings/options.yml"));
264+
Yaml yaml = new Yaml();
265+
Map<String, Object> data = yaml.load(input);
266+
return (Map<String, Object>) data.get(key);
267+
}
268+
158269
}

0 commit comments

Comments
 (0)