-
Notifications
You must be signed in to change notification settings - Fork 175
/
EtsyDotComStories.java
163 lines (140 loc) · 7.63 KB
/
EtsyDotComStories.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package org.jbehave.tutorials.etsy;
import org.jbehave.core.annotations.AfterStories;
import org.jbehave.core.annotations.BeforeStory;
import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.embedder.StoryControls;
import org.jbehave.core.failures.FailingUponPendingStep;
import org.jbehave.core.failures.PendingStepStrategy;
import org.jbehave.core.failures.RethrowingFailure;
import org.jbehave.core.io.CodeLocations;
import org.jbehave.core.io.LoadFromClasspath;
import org.jbehave.core.io.StoryFinder;
import org.jbehave.core.junit.JUnitStories;
import org.jbehave.core.reporters.CrossReference;
import org.jbehave.core.reporters.Format;
import org.jbehave.core.reporters.StoryReporterBuilder;
import org.jbehave.core.steps.pico.PicoStepsFactory;
import org.jbehave.web.selenium.ContextView;
import org.jbehave.web.selenium.FirefoxWebDriverProvider;
import org.jbehave.web.selenium.LocalFrameContextView;
import org.jbehave.web.selenium.PerStoryWebDriverSteps;
import org.jbehave.web.selenium.RemoteWebDriverProvider;
import org.jbehave.web.selenium.SauceContextOutput;
import org.jbehave.web.selenium.SauceLabsContextView;
import org.jbehave.web.selenium.SauceWebDriverProvider;
import org.jbehave.web.selenium.SeleniumConfiguration;
import org.jbehave.web.selenium.SeleniumContext;
import org.jbehave.web.selenium.SeleniumContextOutput;
import org.jbehave.web.selenium.SeleniumStepMonitor;
import org.jbehave.web.selenium.WebDriverProvider;
import org.jbehave.web.selenium.WebDriverScreenshotOnFailure;
import org.picocontainer.Characteristics;
import org.picocontainer.MutablePicoContainer;
import org.picocontainer.PicoBuilder;
import org.picocontainer.behaviors.Storing;
import org.picocontainer.behaviors.ThreadCaching;
import org.picocontainer.classname.ClassLoadingPicoContainer;
import org.picocontainer.classname.ClassName;
import org.picocontainer.classname.DefaultClassLoadingPicoContainer;
import org.picocontainer.injectors.CompositeInjection;
import org.picocontainer.injectors.ConstructorInjection;
import org.picocontainer.injectors.SetterInjection;
import java.util.HashMap;
import java.util.List;
import static java.util.Arrays.asList;
import static org.jbehave.core.io.CodeLocations.codeLocationFromClass;
import static org.jbehave.core.reporters.Format.CONSOLE;
import static org.jbehave.web.selenium.WebDriverHtmlOutput.WEB_DRIVER_HTML;
public class EtsyDotComStories extends JUnitStories {
public EtsyDotComStories() {
PendingStepStrategy pendingStepStrategy = new FailingUponPendingStep();
CrossReference crossReference = new SauceContextOutput.SauceLabsCrossReference(new HashMap<String, String>())
.withJsonOnly().withOutputAfterEachStory(true).withPendingStepStrategy(pendingStepStrategy)
.excludingStoriesWithNoExecutedScenarios(true);
SeleniumContext seleniumContext = new SeleniumContext();
WebDriverProvider driverProvider;
Format[] formats;
ContextView contextView;
if (System.getProperty("SAUCE_USERNAME") != null) {
driverProvider = new SauceWebDriverProvider();
formats = new Format[] { new SeleniumContextOutput(seleniumContext), CONSOLE, WEB_DRIVER_HTML };
contextView = new SauceLabsContextView(driverProvider);
crossReference.withThreadSafeDelegateFormat(new SauceContextOutput(driverProvider, seleniumContext,
new HashMap<String, String>()));
} else if (System.getProperty("REMOTE") != null) {
driverProvider = new RemoteWebDriverProvider();
formats = new Format[] { CONSOLE, WEB_DRIVER_HTML };
contextView = new ContextView.NULL();
} else {
driverProvider = new FirefoxWebDriverProvider();
formats = new Format[] { new SeleniumContextOutput(seleniumContext), CONSOLE, WEB_DRIVER_HTML };
contextView = new LocalFrameContextView().sized(640, 120);
}
StoryReporterBuilder reporterBuilder = new StoryReporterBuilder()
.withCodeLocation(CodeLocations.codeLocationFromClass(EtsyDotComStories.class)).withFailureTrace(true)
.withFailureTraceCompression(true).withDefaultFormats().withFormats(formats)
.withCrossReference(crossReference);
Configuration configuration = new SeleniumConfiguration().useWebDriverProvider(driverProvider)
.useSeleniumContext(seleniumContext).useFailureStrategy(new RethrowingFailure())
.usePendingStepStrategy(pendingStepStrategy)
.useStoryControls(new StoryControls().doResetStateBeforeScenario(false))
.useStepMonitor(new SeleniumStepMonitor(contextView, seleniumContext, crossReference.getStepMonitor()))
.useStoryLoader(new LoadFromClasspath(EtsyDotComStories.class))
.useStoryReporterBuilder(reporterBuilder);
useConfiguration(configuration);
final ThreadCaching primordialCaching = new ThreadCaching();
MutablePicoContainer primordial = new PicoBuilder().withBehaviors(primordialCaching).build();
primordial.addComponent(WebDriverProvider.class, driverProvider);
// Groovy Steps - can be stateful per story.
final Storing store = (Storing) new Storing().wrap(new CompositeInjection(new ConstructorInjection(),
new SetterInjection("set", "setMetaClass")));
ClassLoader currentClassLoader = this.getClass().getClassLoader();
final DefaultClassLoadingPicoContainer pageObjects = new DefaultClassLoadingPicoContainer(currentClassLoader,
store, primordial);
pageObjects.change(Characteristics.USE_NAMES);
// This loads all the Groovy page objects - can be stateful
pageObjects.visit(new ClassName("pages.Home"), ".*\\.class", true,
new DefaultClassLoadingPicoContainer.ClassVisitor() {
public void classFound(@SuppressWarnings("rawtypes") Class clazz) {
pageObjects.addComponent(clazz);
}
});
ClassLoadingPicoContainer steps = pageObjects.makeChildContainer("steps");
steps.addComponent(new CacheFlusher(store));
steps.addComponent(new ClassName("HousekeepingSteps"));
steps.addComponent(new ClassName("EtsyDotComSteps"));
// Before And After Steps registered by instance
steps.addComponent(new PerStoryWebDriverSteps(driverProvider));
steps.addComponent(new WebDriverScreenshotOnFailure(driverProvider, configuration.storyReporterBuilder()));
// steps.addComponent(new WebDriverPageDumpOnFailure(driverProvider,
// configuration.storyReporterBuilder()));
steps.addComponent(new PerStoriesContextView(contextView));
useStepsFactory(new PicoStepsFactory(configuration, steps));
}
@Override
protected List<String> storyPaths() {
return new StoryFinder().findPaths(codeLocationFromClass(this.getClass()).getFile(),
asList("**/" + System.getProperty("storyFilter", "*") + ".story"),
asList("**/etsy_given.story"));
}
public static class PerStoriesContextView {
private final ContextView contextView;
public PerStoriesContextView(ContextView contextView) {
this.contextView = contextView;
}
@AfterStories
public void afterStory() {
contextView.close();
}
}
public static class CacheFlusher {
private final Storing store;
public CacheFlusher(Storing store) {
this.store = store;
}
@BeforeStory
public void resetThreadLocalCaches() {
store.resetCacheForThread();
}
}
}