Skip to content

Commit

Permalink
Added json steps (#108)
Browse files Browse the repository at this point in the history
add steps to work with json-path to be able to verify fast json responses #110
  • Loading branch information
sergeyuttsel authored and GannaChernyshova committed Nov 8, 2018
1 parent 8cd4e3e commit a19af91
Show file tree
Hide file tree
Showing 9 changed files with 367 additions and 21 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ dependencies {
compile group: 'io.rest-assured', name: 'rest-assured', version: '3.0.2'
compile group: 'com.google.inject', name: 'guice', version: '4.1.0'
compile group: 'com.galenframework', name: 'galen-java-support', version: '2.3.6'
compile group: 'com.jayway.jsonpath', name: 'json-path', version: '2.4.0'

testCompile "org.mockito:mockito-core:2.13.0"
testCompile "org.mockito:mockito-inline:2.13.0"
Expand Down
85 changes: 80 additions & 5 deletions src/main/java/ru/alfabank/steps/DefaultApiSteps.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,33 @@
*/
package ru.alfabank.steps;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException;
import com.jayway.jsonpath.ReadContext;
import com.jayway.jsonpath.spi.json.GsonJsonProvider;
import com.jayway.jsonpath.spi.mapper.GsonMappingProvider;
import cucumber.api.DataTable;
import cucumber.api.java.ru.И;
import cucumber.api.java.ru.Тогда;
import io.restassured.http.Method;
import io.restassured.response.Response;
import io.restassured.specification.RequestSender;
import io.restassured.specification.RequestSpecification;
import lombok.extern.slf4j.Slf4j;
import ru.alfabank.alfatest.cucumber.api.AkitaScenario;
import ru.alfabank.tests.core.rest.RequestParam;

import java.util.ArrayList;
import java.util.List;

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.*;
import java.util.ArrayList;
import java.util.List;

/**
* Шаги для тестирования API, доступные по умолчанию в каждом новом проекте
Expand Down Expand Up @@ -79,6 +88,72 @@ public void checkResponseCode(String method, String address, int expectedStatusC
assertTrue(checkStatusCode(response, expectedStatusCode));
}

/**
* В json строке, сохраннённой в переменной, происходит поиск значений по jsonpath из первого столбца таблицы.
* Полученные значения сравниваются с ожидаемым значением во втором столбце таблицы.
* Шаг работает со всеми типами json элементов: объекты, массивы, строки, числа, литералы true, false и null.
*/
@Тогда("^в json (?:строке|файле) \"([^\"]*)\" значения, найденные по jsonpath, равны значениям из таблицы$")
public void checkValuesInJsonAsString(String jsonVar, DataTable dataTable) {
String strJson = loadValueFromFileOrPropertyOrVariableOrDefault(jsonVar);
Gson gsonObject = new Gson();
JsonParser parser = new JsonParser();
ReadContext ctx = JsonPath.parse(strJson, createJsonPathConfiguration());
boolean error = false;
for (List<String> row : dataTable.raw()){
String jsonPath = row.get(0);
JsonElement actualJsonElement;
try {
actualJsonElement = gsonObject.toJsonTree(ctx.read(jsonPath));
} catch (PathNotFoundException e) {
error = true;
continue;
}
JsonElement expectedJsonElement = parser.parse(row.get(1));
if (!actualJsonElement.equals(expectedJsonElement)) {
error = true;
}
akitaScenario.write("JsonPath: " + jsonPath + ", ожидаемое значение: " + expectedJsonElement + ", фактическое значение: " + actualJsonElement);
}
if (error)
throw new RuntimeException("Ожидаемые и фактические значения в json не совпадают");
}

/**
* В json строке, сохраннённой в переменной, происходит поиск значений по jsonpath из первого столбца таблицы.
* Полученные значения сохраняются в переменных. Название переменной указывается во втором столбце таблицы.
* Шаг работает со всеми типами json элементов: объекты, массивы, строки, числа, литералы true, false и null.
*/
@Тогда("^значения из json (?:строки|файла) \"([^\"]*)\", найденные по jsonpath из таблицы, сохранены в переменные$")
public void getValuesFromJsonAsString(String jsonVar, DataTable dataTable) {
String strJson = loadValueFromFileOrPropertyOrVariableOrDefault(jsonVar);
Gson gsonObject = new Gson();
ReadContext ctx = JsonPath.parse(strJson, createJsonPathConfiguration());
boolean error = false;
for (List<String> row : dataTable.raw()){
String jsonPath = row.get(0);
String varName = row.get(1);
JsonElement jsonElement;
try {
jsonElement = gsonObject.toJsonTree(ctx.read(jsonPath));
} catch (PathNotFoundException e) {
error = true;
continue;
}
akitaScenario.setVar(varName, jsonElement.toString());
akitaScenario.write("JsonPath: " + jsonPath + ", значение: " + jsonElement + ", записано в переменную: " + varName);
}
if (error)
throw new RuntimeException("В json не найдено значение по заданному jsonpath");
}

private Configuration createJsonPathConfiguration() {
return new Configuration.ConfigurationBuilder()
.jsonProvider(new GsonJsonProvider())
.mappingProvider(new GsonMappingProvider())
.build();
}

/**
* Создание запроса
*
Expand All @@ -99,7 +174,7 @@ private RequestSender createRequest(List<RequestParam> paramsTable) {
request.header(name, value);
break;
case BODY:
request.body(loadValueFromFileOrPropertyOrDefault(value));
request.body(loadValueFromFileOrPropertyOrVariableOrDefault(value));
break;
default:
throw new IllegalArgumentException(String.format("Некорректно задан тип %s для параметра запроса %s ", requestParam.getType(), name));
Expand Down
29 changes: 27 additions & 2 deletions src/main/java/ru/alfabank/steps/DefaultSteps.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideElement;
import com.codeborne.selenide.WebDriverRunner;
import cucumber.api.DataTable;
import cucumber.api.java.ru.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
Expand Down Expand Up @@ -902,7 +904,7 @@ public void checkListTextsByRegExp(String listName, String pattern) {
*/
@Когда("^выполнен js-скрипт \"([^\"]*)\"")
public void executeJsScript(String scriptName) {
String content = loadValueFromFileOrPropertyOrDefault(scriptName);
String content = loadValueFromFileOrPropertyOrVariableOrDefault(scriptName);
Selenide.executeJavaScript(content);
}

Expand Down Expand Up @@ -997,11 +999,34 @@ public void checkIfValueFromVariableEqualPropertyVariable(String envVarible, Str
*/
@Когда("^выполнено нажатие на кнопку \"([^\"]*)\" и загружен файл \"([^\"]*)\"$")
public void clickOnButtonAndUploadFile(String buttonName, String fileName) {
String file = loadValueFromFileOrPropertyOrDefault(fileName);
String file = loadValueFromFileOrPropertyOrVariableOrDefault(fileName);
File attachmentFile = new File(file);
akitaScenario.getCurrentPage().getElement(buttonName).uploadFile(attachmentFile);
}

/*
* Выполняется чтение файла с шаблоном и заполнение его значениями из таблицы
*/
@И("^шаблон \"([^\"]*)\" заполнен данными из таблицы и сохранён в переменную \"([^\"]*)\"$")
public void fillTemplate(String templateName, String varName, DataTable table) {
String template = loadValueFromFileOrPropertyOrVariableOrDefault(templateName);
boolean error = false;
for (List<String> list : table.raw()) {
String regexp = list.get(0);
String replacement = list.get(1);
if (template.contains(regexp)) {
template = template.replaceAll(regexp, replacement);
}
else {
akitaScenario.write("В шаблоне не найден элемент " + regexp);
error = true;
}
}
if (error)
throw new RuntimeException("В шаблоне не найдены требуемые регулярные выражения");
akitaScenario.setVar(varName, template);
}

/**
* Возвращает значение из property файла, если отсутствует, то из пользовательских переменных,
* если и оно отсутствует, то возвращает значение переданной на вход переменной
Expand Down
13 changes: 8 additions & 5 deletions src/main/java/ru/alfabank/tests/core/helpers/PropertyLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -212,12 +212,12 @@ private static Properties getProfilePropertiesInstance() {
}

/**
* Получает значение из application.properties, файла по переданному пути или как String аргумент
* Получает значение из application.properties, файла по переданному пути, значение из хранилища переменных или как String аргумент
* Используется для получение body.json api шагах, либо для получения script.js в ui шагах
* @param valueToFind - ключ к значению в application.properties, путь к файлу c нужным значением, значение как String
* @return значение как String
*/
public static String loadValueFromFileOrPropertyOrDefault(String valueToFind) {
public static String loadValueFromFileOrPropertyOrVariableOrDefault(String valueToFind) {
String pathAsString = StringUtils.EMPTY;
String propertyValue = tryLoadProperty(valueToFind);
if (StringUtils.isNotBlank(propertyValue)) {
Expand All @@ -231,10 +231,13 @@ public static String loadValueFromFileOrPropertyOrDefault(String valueToFind) {
AkitaScenario.getInstance().write("Значение из файла " + valueToFind + " = " + fileValue);
return fileValue;
} catch (IOException | InvalidPathException e) {
AkitaScenario.getInstance().write("Значение не найдено по пути " + pathAsString
+ ". Будет исользовано значение по умолчанию " + valueToFind);
return valueToFind;
AkitaScenario.getInstance().write("Значение не найдено по пути " + pathAsString);
}
if (AkitaScenario.getInstance().tryGetVar(valueToFind) != null)
return (String) AkitaScenario.getInstance().getVar(valueToFind);
AkitaScenario.getInstance().write("Значение не найдено в хранилище. Будет исользовано значение по умолчанию " + valueToFind);
return valueToFind;
}

}

10 changes: 5 additions & 5 deletions src/test/java/ru/alfabank/steps/ApiStepsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
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.loadValueFromFileOrPropertyOrDefault;
import static ru.alfabank.tests.core.helpers.PropertyLoader.loadValueFromFileOrPropertyOrVariableOrDefault;
import static ru.alfabank.tests.core.rest.RequestParamType.PARAMETER;

public class ApiStepsTest {
Expand Down Expand Up @@ -178,21 +178,21 @@ public void shouldSendPutRequest() throws Exception {
@Test()
public void shouldNotFindBodyByPath() throws Exception {
String expectedBodyValue = "{\"value\": \"true\"}";
String actualBodyValue = loadValueFromFileOrPropertyOrDefault(resolveJsonVars(expectedBodyValue));
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveJsonVars(expectedBodyValue));
assertThat(actualBodyValue, equalTo(expectedBodyValue));
}

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

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

Expand All @@ -201,7 +201,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 = loadValueFromFileOrPropertyOrDefault(resolveJsonVars(defaultBodyValue));
String actualBodyValue = loadValueFromFileOrPropertyOrVariableOrDefault(resolveJsonVars(defaultBodyValue));
assertThat(actualBodyValue, equalTo(expectedBodyValue));
}
}
31 changes: 28 additions & 3 deletions src/test/java/ru/alfabank/steps/DefaultStepsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.codeborne.selenide.WebDriverRunner;
import com.codeborne.selenide.ex.ElementShouldNot;
import cucumber.api.DataTable;
import cucumber.api.Scenario;
import org.hamcrest.core.IsEqual;
import org.junit.*;
Expand All @@ -31,6 +32,7 @@

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static com.codeborne.selenide.Selenide.executeJavaScript;
Expand All @@ -40,7 +42,8 @@
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static ru.alfabank.tests.core.helpers.PropertyLoader.loadValueFromFileOrPropertyOrDefault;
import static ru.alfabank.tests.core.helpers.PropertyLoader.loadValueFromFileOrPropertyOrVariableOrDefault;
import static ru.alfabank.util.DataTableUtils.dataTableFromLists;

public class DefaultStepsTest {
private static DefaultSteps ds;
Expand Down Expand Up @@ -814,8 +817,14 @@ public void savePageTitleToVariablePositive() {
}

@Test
public void testStringOrLoadFilePropertyOrDefault2() {
assertThat(loadValueFromFileOrPropertyOrDefault("testScript"), equalTo("alert('privet');"));
public void testPropertyWhenLoadValueFromFileOrPropertyOrVariableOrDefault2() {
assertThat(loadValueFromFileOrPropertyOrVariableOrDefault("testScript"), equalTo("alert('privet');"));
}

@Test
public void testVariableWhenLoadValueFromFileOrPropertyOrVariableOrDefault3() {
akitaScenario.setVar("varName", "testVariable");
assertThat("testVariable", equalTo(loadValueFromFileOrPropertyOrVariableOrDefault("varName")));
}

@Test
Expand Down Expand Up @@ -964,4 +973,20 @@ public void testCloseCurrentTab() {
dmbs.closeCurrentTab();
dmbs.switchToTheTabWithTitle("Title");
}

@Test
public void testfillTemplate() {
String templateName = "strTemplate";
String varName = "varName";
List<String> row1 = new ArrayList<>(Arrays.asList("_name_", "Jack"));
List<String> row2 = new ArrayList<>(Arrays.asList("_age_", "35"));
List<List<String>> allLists= new ArrayList<>();
allLists.add(row1);
allLists.add(row2);
DataTable dataTable = dataTableFromLists(allLists);

ds.fillTemplate(templateName, varName, dataTable);
Assert.assertEquals("{\"name\": \"Jack\", \"age\": 35}", (String) akitaScenario.getVar(varName));
}

}
Loading

0 comments on commit a19af91

Please sign in to comment.