package uk.co.acuminous.julez.scenario;
import java.net.URL;
import java.util.List;
import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.embedder.Embedder;
import org.jbehave.core.failures.FailingUponPendingStep;
import org.jbehave.core.io.StoryFinder;
import org.jbehave.core.steps.CandidateSteps;
import org.jbehave.core.steps.InstanceStepsFactory;
public class JBehaveEmbedderScenario extends BaseScenario {
private final URL codeLocation;
private final String scenario;
private final Object[] steps;
public JBehaveEmbedderScenario(URL codeLocation, String scenario, Object... steps) {
this.codeLocation = codeLocation;
this.scenario = scenario;
this.steps = steps;
}
public void run() {
try {
Embedder embedder = getEmbedder();
EventRaisingEmbedderMonitor monitor = new EventRaisingEmbedderMonitor(eventFactory);
embedder.useEmbedderMonitor(monitor);
handler.onEvent(eventFactory.begin());
embedder.runStoriesAsPaths(getStoryPaths());
if (monitor.receivedEvent()) {
handler.onEvent(monitor.getEvent());
} else {
handler.onEvent(eventFactory.pass());
}
} catch (Throwable t) {
ScenarioEvent event = eventFactory.error();
event.getData().put("message", t.getMessage());
handler.onEvent(event);
} finally {
handler.onEvent(eventFactory.end());
}
}
private Embedder getEmbedder() {
Embedder embedder = new Embedder();
embedder.embedderControls().doIgnoreFailureInStories(true);
Configuration embedderConfiguration = new MostUsefulConfiguration().usePendingStepStrategy(new FailingUponPendingStep());
embedder.useConfiguration(embedderConfiguration);
List<CandidateSteps> candidateSteps = new InstanceStepsFactory(embedderConfiguration, steps).createCandidateSteps();
embedder.useCandidateSteps(candidateSteps);
return embedder;
}
private List<String> getStoryPaths() {
List<String> storyPaths = new StoryFinder().findPaths(codeLocation, scenario, "");
if (storyPaths.isEmpty()) {
throw new RuntimeException(String.format("Cannot find story for %s", scenario));
}
return storyPaths;
}
}