Skip to content

Commit

Permalink
rewrote resolveVars method (#117)
Browse files Browse the repository at this point in the history
refactored resolveVars method. changed regexp for VARIABLE_NAME_PATTERN
  • Loading branch information
sergeyuttsel authored and GannaChernyshova committed Dec 21, 2018
1 parent cca7194 commit ccc3bc1
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 49 deletions.
54 changes: 15 additions & 39 deletions src/main/java/ru/alfabank/alfatest/cucumber/ScopedVariables.java
Expand Up @@ -21,6 +21,8 @@
import ru.alfabank.alfatest.cucumber.api.AkitaScenario;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand All @@ -33,7 +35,8 @@
*/
public class ScopedVariables {

public static final String CURVE_BRACES_PATTERN = "\\{([^{}]+)\\}";
public static final String VARIABLE_NAME_PATTERN = "[{]([\\wа-яА-Я]+[\\wа-яА-Я.-]+[\\wа-яА-Я]+)[}]";

private Map<String, Object> variables = Maps.newHashMap();

/**
Expand Down Expand Up @@ -61,7 +64,7 @@ public Object evaluate(String expression) {
* @param textToReplaceIn строка, в которой необходимо выполнить замену (не модифицируется)
*/
public String replaceVariables(String textToReplaceIn) {
Pattern p = Pattern.compile(CURVE_BRACES_PATTERN);
Pattern p = Pattern.compile(VARIABLE_NAME_PATTERN);
Matcher m = p.matcher(textToReplaceIn);
StringBuffer buffer = new StringBuffer();
while (m.find()) {
Expand All @@ -81,54 +84,27 @@ public String replaceVariables(String textToReplaceIn) {
* @return новая строка
*/
public static String resolveVars(String inputString) {
Pattern p = Pattern.compile(CURVE_BRACES_PATTERN);
Pattern p = Pattern.compile(VARIABLE_NAME_PATTERN);
Matcher m = p.matcher(inputString);
String newString = "";
while (m.find()) {
String varName = m.group(1);
String value = loadProperty(varName, (String) AkitaScenario.getInstance().tryGetVar(varName));
if (value == null)
throw new IllegalArgumentException(
"Значение " + varName +
" не было найдено ни в application.properties, ни в environment переменной");
newString = m.replaceFirst(value);
m = p.matcher(newString);
}
if (newString.isEmpty()) {
newString = inputString;
} else {
AkitaScenario.getInstance().write(format("Значение переменной %s = %s", inputString, newString));
}
return newString;
}


/**
* Производит поиск параметров в переданном строкой json.
* В случае нахождения параметра - заменяет его значение на значение из properties или хранилища переменных
*
* @param inputJsonAsString заданная строка
* @return новая строка
*/
public static String resolveJsonVars(String inputJsonAsString) {
if (isJSONValid(inputJsonAsString)) return inputJsonAsString;
Pattern p = Pattern.compile(CURVE_BRACES_PATTERN);
Matcher m = p.matcher(inputJsonAsString);
String newString = "";
List<String> unresolvedVariables = new ArrayList<>();
while (m.find()) {
String varName = m.group(1);
String value = loadProperty(varName, (String) AkitaScenario.getInstance().tryGetVar(varName));
if (value == null) {
AkitaScenario.getInstance().write(
"Значение " + varName +
" не было найдено ни в application.properties, ни в environment переменной");
unresolvedVariables.add(varName);
value = varName;
}
newString = m.replaceFirst(value);
if (isJSONValid(newString)) return newString;
m = p.matcher(newString);
}
if (!unresolvedVariables.isEmpty()) {
throw new IllegalArgumentException(
"Значения " + unresolvedVariables +
" не были найдены ни в application.properties, ни в environment переменной");
}
if (newString.isEmpty()) {
newString = inputJsonAsString;
newString = inputString;
}
return newString;
}
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/ru/alfabank/steps/DefaultApiSteps.java
Expand Up @@ -39,7 +39,6 @@
import static io.restassured.RestAssured.given;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static ru.alfabank.alfatest.cucumber.ScopedVariables.resolveJsonVars;
import static ru.alfabank.alfatest.cucumber.ScopedVariables.resolveVars;
import static ru.alfabank.tests.core.helpers.PropertyLoader.*;

Expand Down Expand Up @@ -178,7 +177,7 @@ private RequestSender createRequest(List<RequestParam> paramsTable) {
break;
case BODY:
value = loadValueFromFileOrPropertyOrVariableOrDefault(value);
body = resolveJsonVars(value);
body = resolveVars(value);
request.body(body);
break;
default:
Expand Down
Expand Up @@ -28,7 +28,6 @@

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static ru.alfabank.alfatest.cucumber.ScopedVariables.resolveJsonVars;
import static ru.alfabank.alfatest.cucumber.ScopedVariables.resolveVars;

public class PropertyLoaderTests {
Expand Down Expand Up @@ -111,7 +110,7 @@ public void getNotExistingValue() {
@Test
public void getJsonStringType() {
String expectedValue = "{\"accounts\": []}";
String actualValue = resolveJsonVars(expectedValue);
String actualValue = resolveVars(expectedValue);
assertThat(actualValue, is(expectedValue));
}
}
58 changes: 57 additions & 1 deletion src/test/java/ru/alfabank/other/ScopedVariablesTest.java
Expand Up @@ -15,9 +15,14 @@
*/
package ru.alfabank.other;

import com.codeborne.selenide.WebDriverRunner;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import ru.alfabank.StubScenario;
import ru.alfabank.alfatest.cucumber.ScopedVariables;
import ru.alfabank.alfatest.cucumber.api.AkitaEnvironment;
import ru.alfabank.alfatest.cucumber.api.AkitaScenario;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
Expand All @@ -27,10 +32,17 @@ public class ScopedVariablesTest {
private static ScopedVariables variables;

@BeforeClass
public static void init() {
public static void setup() {
AkitaScenario akitaScenario = AkitaScenario.getInstance();
akitaScenario.setEnvironment(new AkitaEnvironment(new StubScenario()));
variables = new ScopedVariables();
}

@AfterClass
public static void close() {
WebDriverRunner.closeWebDriver();
}

@Test
public void evaluatePositive() {
assertThat(variables.evaluate("\"test\".equals(\"test\")"), equalTo(true));
Expand Down Expand Up @@ -78,4 +90,48 @@ public void removePositive() {
public void removeNegative() {
assertThat(variables.remove("WRONG_KEY"), equalTo(null));
}

@Test
public void resolveVariableFromJsonString() {
String inputJsonString = "{\"object1\": {\"var1\": 1}, " +
"\"person\": {\"name\": \"{bodyWithParams1}\", \"age\": {bodyWithParams2}}, " +
"\"object\": {\"var1\": 1}, " +
"\"length\": {resolve.Переменная-1_2}}";
String expectedJsonString = "{\"object1\": {\"var1\": 1}, " +
"\"person\": {\"name\": \"Jack\", \"age\": 35}, " +
"\"object\": {\"var1\": 1}, " +
"\"length\": 180}";
assertThat(ScopedVariables.resolveVars(inputJsonString), equalTo(expectedJsonString));
}

@Test
public void resolveVariableFromXmlString() {
String inputJsonString = "<note>" +
"<from>{bodyWithParams1}</from>" +
"</note>";
String expectedJsonString = "<note>" +
"<from>Jack</from>" +
"</note>";
assertThat(ScopedVariables.resolveVars(inputJsonString), equalTo(expectedJsonString));
}

@Test(expected = IllegalArgumentException.class)
public void resolveVariableFromJsonStringWithUnknownVariable() {
String inputJsonString = "{\"unknown\": {unknownVariable}, " +
"\"object1\": {\"var1\": 1}, " +
"\"person\": {\"name\": \"{bodyWithParams1}\", \"age\": {bodyWithParams2}}, " +
"\"object\": {\"var1\": 1}, " +
"\"length\": {resolve.Переменная-1_2}}";
ScopedVariables.resolveVars(inputJsonString);
}

@Test(expected = IllegalArgumentException.class)
public void resolveVariableFromXmlStringWithUnknownVariable() {
String inputJsonString = "<note>" +
"<from>{bodyWithParams1}</from>" +
"<from>{unknownVariable}</from>" +
"</note>";
ScopedVariables.resolveVars(inputJsonString);
}

}
9 changes: 4 additions & 5 deletions src/test/java/ru/alfabank/steps/ApiStepsTest.java
Expand Up @@ -36,7 +36,6 @@
import static java.util.Arrays.asList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static ru.alfabank.alfatest.cucumber.ScopedVariables.resolveJsonVars;
import static ru.alfabank.alfatest.cucumber.ScopedVariables.resolveVars;
import static ru.alfabank.tests.core.helpers.PropertyLoader.loadValueFromFileOrPropertyOrVariableOrDefault;
import static ru.alfabank.tests.core.rest.RequestParamType.PARAMETER;
Expand Down Expand Up @@ -200,21 +199,21 @@ public void shouldSendPutRequest() throws Exception {
@Test()
public void shouldNotFindBodyByPath() throws Exception {
String expectedBodyValue = "{\"value\": \"true\"}";
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveJsonVars(expectedBodyValue));
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveVars(expectedBodyValue));
assertThat(actualBodyValue, equalTo(expectedBodyValue));
}

@Test()
public void shouldFindBodyByPath() throws Exception {
String expectedBodyValue = "{\"asn\": \"1\"}";
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveJsonVars("/src/test/resources/body.json"));
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveVars("/src/test/resources/body.json"));
assertThat(actualBodyValue, equalTo(expectedBodyValue));
}

@Test()
public void shouldFindBodyByPropertyKey() throws Exception {
String expectedBodyValue = "{\"property\":\"body\"}";
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveJsonVars("bodyValue"));
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveVars("bodyValue"));
assertThat(actualBodyValue, equalTo(expectedBodyValue));
}

Expand All @@ -223,7 +222,7 @@ public void shouldFindBodyWithVarResolving() throws Exception {
akitaScenario.setVar("var1", "\"1\"");
String defaultBodyValue = "{\"a\":{var1}, \"b\": {\"c\": {var2}}}";
String expectedBodyValue = "{\"a\":\"1\", \"b\": {\"c\": \"2\"}}";
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveJsonVars(defaultBodyValue));
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveVars(defaultBodyValue));
assertThat(actualBodyValue, equalTo(expectedBodyValue));
}
}
2 changes: 2 additions & 0 deletions src/test/resources/application.properties
Expand Up @@ -37,5 +37,7 @@ titleFromProperty=Title
bodyWithParams1=Jack
bodyWithParams2=35

resolve.Переменная-1_2 = 180

strJson = {"object1" : { "array" : ["stringInArray", 0.003, true, false, null], "innerObject": {"str": "qwer"} }, "object2": {"number" : 0.003, "string" : "stringValue", "boolean" : true, "nullName" : null}, "object3": {"number": -3579.09}}
strTemplate = {"name": "_name_", "age": _age_}

0 comments on commit ccc3bc1

Please sign in to comment.