package org.syftkog.web.test.framework;
import java.util.ArrayList;
import org.syftkog.web.test.framework.retry.RetryTestContext;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.ITestResult;
import org.testng.SkipException;
/**
*
* @author BenjaminLimb
*/
public class TestCaseContext implements WrapsTestCaseContext, HasDriver, TagContext, HasStepLogger, DriverContext<TestCaseContext>, RetryTestContext<TestCaseContext> {
private TestCaseParameters testCaseParameters;
private transient DriverFactory driverFactory;
private transient Driver driver;
private transient StepLogger stepLogger = new StepLogger();
private transient int currentAttempt = 1;
private String name;
private transient ITestResult testResult;
private ArrayList<String> tags;
/**
*
* @param params
*/
public TestCaseContext(TestCaseParameters params) {
this.testCaseParameters = params;
}
/**
*
* @param bvp
*/
public TestCaseContext(BrowserVersionPlatform bvp) {
testCaseParameters = new TestCaseParameters(bvp);
}
/**
*
*/
public TestCaseContext() {
testCaseParameters = new TestCaseParameters();
}
/**
*
* @return
*/
@Override
public DriverFactory getDriverFactory() {
// if no Driver factory is specified, use the singleton instance.
if (driverFactory == null) {
driverFactory = DriverFactory.getInstance();
}
return driverFactory;
}
/**
*
* @param driverFactory
* @return
*/
@Override
public TestCaseContext setDriverFactory(DriverFactory driverFactory) {
this.driverFactory = driverFactory;
return this;
}
/**
*
* @return
*/
@Override
public StepLogger getStepLogger() {
return stepLogger;
}
/**
*
* @param stepLogger
*/
public void setStepLogger(StepLogger stepLogger) {
this.stepLogger = stepLogger;
}
/**
*
* @return
*/
@Override
public Integer getMaxRetryCount() {
if (parameters().getMaxAttempts() != null) {
return this.parameters().getMaxAttempts() +1;
} else {
return null;
}
}
/**
*
* @return
*/
@Override
public Boolean isDriverInitialized() {
return driver != null;
}
/**
*
* @return
*/
@Override
public Driver getDriver() {
if (driver == null) {
driver = getDriverFactory().getDriver(this);
}
return driver;
}
/**
*
* @param driver
* @return
*/
@Override
public TestCaseContext setDriver(Driver driver) {
this.driver = driver;
return this;
}
/**
*
* @return
*/
@Override
public TestCaseContext getWrappedTestCastContext() {
return this;
}
/**
*
* @return
*/
public TestCaseParameters parameters() {
return testCaseParameters;
}
/**
*
* @param testCaseParameters
*/
public void setTestCaseParameters(TestCaseParameters testCaseParameters) {
this.testCaseParameters = testCaseParameters;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
/**
*
* @return
*/
public int getCurrentAttempt() {
return currentAttempt;
}
/**
*
* @return
*/
@Override
public TestCaseContext retry() {
this.getStepLogger().log("RETRYING");
driver = null; // If we retry, then we must get a new driver becasue the driver was quit or dismissed.
currentAttempt++;
return this;
}
/**
*
* @return
*/
public String getName() {
return name;
}
/**
*
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* @return
*/
public ITestResult getTestResult() {
return testResult;
}
/**
*
* @param testResult
*/
public void setTestResult(ITestResult testResult) {
this.testResult = testResult;
}
/**
*
* @return
*/
public String getTestName() {
return testResult.getTestClass().getName() + "." + testResult.getMethod().getMethodName();
}
/**
*
* @return
*/
@Override
public ArrayList<String> getTags() {
ArrayList<String> tags = new ArrayList<>();
// if (testResult != null) {
// tags.add(testResult.getTestClass().getName() + "." + testResult.getMethod().getMethodName());
// }
tags.addAll(parameters().getTags());
return tags;
}
/**
*
* @param tag
*/
@Override
public void addTag(String tag) {
tags.add(tag);
}
/**
*
* @return
*/
public DesiredCapabilities toDesiredCapabilities() {
DesiredCapabilities caps = testCaseParameters.toDesiredCapabilities();
caps.setCapability("name", name);
return caps;
}
/**
*
* @param env
*/
public void assertEnvironment(EnvironmentType env) {
if (parameters().getEnvironment().getEnvironmentType() != env) {
throw new SkipException("This test is restricted to run in " + env);
}
}
}