Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.xlrit.gears.runner.runnertarget.GenerateRunnerTarget Maven / Gradle / Ivy
package com.xlrit.gears.runner.runnertarget;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xlrit.gears.runner.run.Config;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.text.BadLocationException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class GenerateRunnerTarget implements RunnerTarget {
private final StringBuilder output = new StringBuilder();
private final ObjectMapper objectMapper = new ObjectMapper();
private final String path;
private final JsonNode gears;
private int methodCounter = 0;
public GenerateRunnerTarget(Config config) {
if (config.projectDir == null) {
throw new InterpreterException("No target project directory specified");
}
path = config.projectDir;
gears = readGears(path);
String name = gears.get("projectName").asText();
String groupId = gears.get("groupId").asText();
String capName = StringUtils.capitalize(gears.get("projectName").asText());
String packageName = String.format("%s.%s", groupId, name);
output
.append(String.format("package %s;", packageName))
.append("import com.fasterxml.jackson.core.JsonProcessingException;")
.append("import com.fasterxml.jackson.databind.JsonNode;")
.append("import com.fasterxml.jackson.databind.ObjectMapper;")
.append("import com.xlrit.gears.runner.run.Config;")
.append("import com.xlrit.gears.runner.runnertarget.RunnerTarget;")
.append("import com.xlrit.gears.runner.runnertarget.TaskExpression;")
.append("import com.xlrit.gears.runner.runnertarget.TaskType;")
.append("import org.junit.jupiter.api.*;")
.append("import org.springframework.boot.test.context.SpringBootTest;")
.append("import org.springframework.test.context.ActiveProfiles;");
if (config.generateRunnerTarget == null || config.generateRunnerTarget.equals("selenide")) {
output.append("import com.xlrit.gears.runner.runnertarget.SelenideRunnerTarget;");
appendClass(capName);
output
.append("private static RunnerTarget runnerTarget;")
.append("@BeforeAll ")
.append("public static void init() {")
.append("Config config = new Config();")
.append(String.format("config.endpoint = \"%s\";", config.endpoint))
.append(String.format("config.headless = %s;", config.headless))
.append(String.format("config.waitMillis = %s;", config.waitMillis))
.append(String.format("config.timeoutMillis = %s;", config.timeoutMillis))
.append("runnerTarget = new SelenideRunnerTarget(config);}");
}
else if (config.generateRunnerTarget.equals("graphql")) {
output.append("import com.xlrit.gears.runner.runnertarget.GraphQLRunnerTarget;");
appendClass(capName);
output
.append("private static RunnerTarget runnerTarget;")
.append("@BeforeAll ")
.append("public static void init() {")
.append("Config config = new Config();")
.append(String.format("config.endpoint = \"%s\";", config.endpoint))
.append("runnerTarget = new GraphQLRunnerTarget(config);}");
}
else {
throw new InterpreterException(String.format("Invalid runnertarget for generation: %s", config.generateRunnerTarget));
}
output
.append("private static final ObjectMapper objectMapper = new ObjectMapper();")
.append("private static JsonNode readJson(String json) { try { return objectMapper.readTree(json); }")
.append("catch (JsonProcessingException e) { throw new RuntimeException(e); } }");
}
private void appendClass(String className) {
output
.append("@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) ")
.append("@TestInstance(TestInstance.Lifecycle.PER_CLASS) ")
.append("@ActiveProfiles(\"local\") ")
.append("@TestMethodOrder(MethodOrderer.OrderAnnotation.class) ")
.append(String.format("public class %sScenarioTests { ", className));
}
private JsonNode readGears(String path) {
File gearsFile = new File(path + "/gears.json");
if (!gearsFile.exists() || !gearsFile.isFile()) {
throw new InterpreterException("No gears.json file found in target directory");
}
try {
return objectMapper.readTree(gearsFile);
}
catch (IOException e) {
throw new InterpreterException("Could not read " + path + "/gears.json as json", e.getCause());
}
}
@Override
public void loadData(String srcDir, String pattern) {
String dataDir = path + "/data";
output.append(String.format("runnerTarget.loadData(\"%s\", \"%s\");", dataDir, pattern));
}
@Override
public void login(String identifier) {
output.append(String.format("runnerTarget.login(\"%s\");", identifier));
}
@Override
public void startProcess(String key, JsonNode values) {
try {
String valuesString;
if (values != null) {
String escapedJson = objectMapper.writeValueAsString(values).replace("\"", "\\\"");
valuesString = String.format("readJson(\"%s\")", escapedJson);
}
else {
valuesString = "null";
}
output.append(String.format("runnerTarget.startProcess(\"%s\", %s);", key, valuesString));
}
catch (JsonProcessingException e) {
throw new InterpreterException("Error processing values: " + values);
}
}
private static String taskExpressionToCode(TaskExpression taskExpression) {
return String.format("new TaskExpression(TaskType.%s, \"%s\")",
taskExpression.type().toString(), taskExpression.id());
}
@Override
public void claimTask(String key, TaskExpression taskExpression) {
output.append(String.format("runnerTarget.claimTask(\"%s\", %s);",
key, taskExpressionToCode(taskExpression)));
}
@Override
public void submitTask(String processKey, TaskExpression taskExpression, JsonNode values) {
try {
String escapedJson = objectMapper.writeValueAsString(values).replace("\"", "\\\"");
output.append(String.format("runnerTarget.submitTask(\"%s\", %s, readJson(\"%s\"));",
processKey,
taskExpressionToCode(taskExpression),
escapedJson));
}
catch (JsonProcessingException e) {
throw new InterpreterException(String.format("Error processing values: %s", values));
}
}
@Override
public void basedOn(String value) {
output.append(String.format("runnerTarget.basedOn(\"%s\");", value));
}
@Override
public void dataAssertion(String key, String grql) {
output.append(String.format("runnerTarget.dataAssertion(\"%s\", \"%s\");", key, grql).replace("\n", ""));
}
@Override
public void processCompleted(String processKey) {
output.append(String.format("runnerTarget.processCompleted(\"%s\");", processKey));
}
@Override
public void setDateTime(String value) {
output.append(String.format("runnerTarget.setDateTime(\"%s\");", value));
}
private static String toMethod(String string) {
return string
.replace(".", "_")
.replace("-", "_")
.replace("/", "_");
}
@Override
public void scenarioStart(String scenario) {
output.append(String.format("@Test @Order(%d) public void %s() {", methodCounter++, toMethod(scenario)));
}
@Override
public void scenarioFinish() {
output.append('}');
}
@Override
public void finish() {
try {
String name = gears.get("projectName").asText();
String groupId = gears.get("groupId").asText();
String testPath = String.format("%s/target/%s/src/test/java/%s/%s",
path, name, groupId.replace('.', '/'), name);
File targetDir = new File(testPath);
targetDir.mkdirs();
File test = new File(targetDir, String.format("%sScenarioTests.java", StringUtils.capitalize(name)));
try (FileWriter writer = new FileWriter(test)) {
String source = output.append('}').toString();
writer.write(JavaFormatter.format(source));
}
}
catch (IOException e) {
throw new InterpreterException("Error writing to " + path, e.getCause());
}
catch (BadLocationException e) {
throw new InterpreterException("Error formatting code:\n" + output, e.getCause());
}
}
}