All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.xlrit.gears.runner.runnertarget.GenerateRunnerTarget Maven / Gradle / Ivy

There is a newer version: 1.17.1
Show newest version
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());
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy