diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml new file mode 100644 index 0000000..a6cc4c2 --- /dev/null +++ b/api-tests-module/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + + + + ru.qatools.school + steps-module + ${project.version} + + + com.squareup.retrofit2 + retrofit + 2.0.2 + + + com.jayway.restassured + rest-assured + 2.9.0 + test + + + com.squareup.retrofit2 + converter-gson + 2.0.2 + + + + api-tests-module + Web API tests + + \ No newline at end of file diff --git a/api-tests-module/src/test/java/RestassuredTests.java b/api-tests-module/src/test/java/RestassuredTests.java new file mode 100644 index 0000000..e6ae9a4 --- /dev/null +++ b/api-tests-module/src/test/java/RestassuredTests.java @@ -0,0 +1,31 @@ +import org.apache.http.HttpStatus; +import org.junit.Test; + +import static com.jayway.restassured.RestAssured.given; +import static org.hamcrest.Matchers.is; + +public class RestassuredTests { + + public static final String BASE_URI = "http://weather.lanwen.ru"; + public static final String BASE_PATH = "api"; + public static final String LIMIT_PARAMETER = "limit"; + public static final String CITIES_RESOURCE = "cities"; + public static final int POSITIVE_CITIES_LIMIT = 1; + public static final int CITIES_LIST_ONE = 1; + public static final int NEGATIVE_CITIES_LIMIT = -1; + + @Test + public void shouldGetCitiesListWhenRequestPositiveCitiesLimit() { + given().baseUri(BASE_URI) + .basePath(BASE_PATH).param(LIMIT_PARAMETER, POSITIVE_CITIES_LIMIT) + .get(CITIES_RESOURCE).then().assertThat().statusCode(HttpStatus.SC_OK) + .and().body("toSet.size()", is(CITIES_LIST_ONE)); + } + + @Test + public void shouldGetErrorWhenRequestNegativeCitiesLimit() { + given().baseUri(BASE_URI) + .basePath(BASE_PATH).param(LIMIT_PARAMETER, NEGATIVE_CITIES_LIMIT) + .get(CITIES_RESOURCE).then().assertThat().statusCode(HttpStatus.SC_BAD_REQUEST); + } +} \ No newline at end of file diff --git a/api-tests-module/src/test/java/RetrofitTests.java b/api-tests-module/src/test/java/RetrofitTests.java new file mode 100644 index 0000000..5c7556c --- /dev/null +++ b/api-tests-module/src/test/java/RetrofitTests.java @@ -0,0 +1,44 @@ +import org.apache.http.HttpStatus; +import org.junit.Test; +import retrofit2.Call; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import ru.qatools.school.apiData.Cities; +import ru.qatools.school.apiData.CityJSON; + +import java.io.IOException; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class RetrofitTests { + + private static final String BASE_URL = "http://weather.lanwen.ru"; + public static final int POSITIVE_CITIES_LIMIT = 1; + public static final int CITIES_LIST_ONE = 1; + private static final String NEGATIVE_CITIES_LIMIT = "-1"; + + private Retrofit citiesRetrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + @Test + public void shouldGetCitiesListWhenRequestPositiveCitiesLimit() throws IOException { + Cities cities = citiesRetrofit.create(Cities.class); + Call> request = cities.cities(String.valueOf(POSITIVE_CITIES_LIMIT)); + Response> response = request.execute(); + assertThat(response.code(), is(HttpStatus.SC_OK)); + assertThat(response.body().size(), is(CITIES_LIST_ONE)); + } + + @Test + public void shouldGetErrorWhenRequestNegativeCitiesLimit() throws IOException { + Cities cities = citiesRetrofit.create(Cities.class); + Call> request = cities.cities(NEGATIVE_CITIES_LIMIT); + Response> response = request.execute(); + assertThat(response.code(), is(HttpStatus.SC_BAD_REQUEST)); + } +} \ No newline at end of file diff --git a/commons-module/pom.xml b/commons-module/pom.xml new file mode 100644 index 0000000..b1372c7 --- /dev/null +++ b/commons-module/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + + commons-module + jar + + Commons Module + + + + ru.qatools.school + steps-module + ${project.version} + + + com.tngtech.java + junit-dataprovider + 1.10.4 + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + + + true + + + ru.yandex.qatools.allure + allure-maven-plugin + 2.0 + + + + + diff --git a/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java new file mode 100644 index 0000000..7b9da2e --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java @@ -0,0 +1,53 @@ +package ru.qatools.school; + +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.data.Place; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static ru.qatools.school.steps.UserSteps.user; + + +/** + * @author gladnik (Nikolai Gladkov) + */ +@RunWith(DataProviderRunner.class) +public class MyFirstTest { + + @DataProvider + public static List places() { + List placesList + = new ArrayList(Arrays.asList(Place.values())); + placesList.add(null); + return placesList; + } + + @Test + public void shouldBeAtNullWhenDefault() { + user().shouldBeAtPlace(null); + } + + @Test + @UseDataProvider("places") + public void afterGoSomewhereShouldBeThere(Place place) { + user().goTo(place).shouldBeAtPlace(place); + } + + @Test + @UseDataProvider("places") + public void afterGoSomewhereTwiceShouldBeThere(Place place) { + user().goTo(place).goTo(place).shouldBeAtPlace(place); + } + + @Test + public void afterGoSomewhereElseShouldBeThere() { + user().goTo(Place.HOME).goTo(Place.AT_YANDEX) + .shouldBeAtPlace(Place.AT_YANDEX); + } +} diff --git a/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java b/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java new file mode 100644 index 0000000..cc66bbe --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java @@ -0,0 +1,48 @@ +package ru.qatools.school.tp; + +import org.junit.Rule; +import org.junit.Test; +import ru.yandex.qatools.allure.annotations.TestCaseId; + +import java.io.IOException; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static junit.framework.TestCase.fail; +import static org.hamcrest.Matchers.is; +import static org.junit.Assume.assumeThat; + + +public class ConnectedToTPTest { + + @Rule + public TPInformerRule tms = new TPInformerRule("ruletest"); + + + @Test + @TestCaseId("1") + public void shouldMarkCaseStatusAsPassed() throws IOException, InterruptedException { + SECONDS.sleep(15); + } + + + @Test + @TestCaseId("2") + public void shouldFail() throws IOException, InterruptedException { + SECONDS.sleep(5); + fail(); + } + + @Test + @TestCaseId("3") + public void shouldBroke() throws IOException, InterruptedException { + SECONDS.sleep(5); + throw new RuntimeException(); + } + + @Test + @TestCaseId("4") + public void shouldBeSkipped() throws IOException, InterruptedException { + SECONDS.sleep(5); + assumeThat(true, is(false)); + } +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java new file mode 100644 index 0000000..a4c5a40 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -0,0 +1,36 @@ +package ru.qatools.school.webtests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import ru.qatools.school.pages.MainPage; +import ru.qatools.school.rules.WebDriverRule; +import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.yandex.qatools.allure.annotations.Title; + +public class WeatherWebTest { + + public static final String MOSCOW = "Moscow"; + + private DefaultSteps defaultSteps; + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + @Test + @Title("Должны видеть виджет на главной странице") + public void shouldSeeWidgetOnMainPage() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + } + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + +} diff --git a/dbclient-module/pom.xml b/dbclient-module/pom.xml new file mode 100644 index 0000000..2994039 --- /dev/null +++ b/dbclient-module/pom.xml @@ -0,0 +1,28 @@ + + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + 4.0.0 + + dbclient-module + + + + org.jooq + jooq + 3.7.3 + + + mysql + mysql-connector-java + 5.1.6 + + + + + \ No newline at end of file diff --git a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java new file mode 100644 index 0000000..12e1204 --- /dev/null +++ b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java @@ -0,0 +1,49 @@ +package ru.qatools.school; + +import org.jooq.*; +import org.jooq.impl.DSL; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import static org.jooq.impl.DSL.field; +import static org.jooq.impl.DSL.table; + +/** + * Created by omaz on 27.04.16. + */ +public class DbClient { + private static final String CONNECTION_STRING = + System.getProperty("db.url", "jdbc:mysql://db.host.ru:3310/db_name"); + private static final String USER = System.getProperty("db.user", "user"); + private static final String PASSWORD = System.getProperty("db.password", "password");; + + private Connection connection; + private DSLContext create; + + public DbClient() { + try { + connection = DriverManager.getConnection(CONNECTION_STRING, USER, PASSWORD); + } catch (SQLException e) { + throw new DbClientException("Не удалось установить подключение к " + CONNECTION_STRING, e); + } + create = DSL.using(connection, SQLDialect.MYSQL); + } + + public String getCityById(Integer id) { + Record1 result = create.select(field("name")) + .from(table("table_name")) + .where(field("id").equal(id)) + .fetchOne(); + return result.getValue(0, String.class); + } + + public void close() { + try { + connection.close(); + } catch (SQLException e) { + throw new DbClientException("Не удалось закрыть подключение к " + CONNECTION_STRING, e); + } + } +} diff --git a/dbclient-module/src/main/java/ru/qatools/school/DbClientException.java b/dbclient-module/src/main/java/ru/qatools/school/DbClientException.java new file mode 100644 index 0000000..31e9e94 --- /dev/null +++ b/dbclient-module/src/main/java/ru/qatools/school/DbClientException.java @@ -0,0 +1,25 @@ +package ru.qatools.school; + +/** + * Created by omaz on 27.04.16. + */ +public class DbClientException extends RuntimeException { + public DbClientException() { + } + + public DbClientException(String message) { + super(message); + } + + public DbClientException(String message, Throwable cause) { + super(message, cause); + } + + public DbClientException(Throwable cause) { + super(cause); + } + + public DbClientException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/pom.xml b/pom.xml index 206b663..012632d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,23 +1,122 @@ - 4.0.0 ru.qatools.school school-2016 - pom 1.0-SNAPSHOT - + pom + + Automation Foreva + First automation project ever + steps-module + commons-module + dbclient-module + api-tests-module - Automation Foreva - First automation project ever - + + 1.8 + + 1.4.23 + 2.53.0 + 1.15 + 1.8.5 + + - + + junit + junit + 4.12 + - - \ No newline at end of file + + + + + + + com.jayway.restassured + rest-assured + 2.9.0 + + + + ru.yandex.qatools.allure + allure-junit-adaptor + ${allure.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + ru.yandex.qatools.htmlelements + htmlelements-java + ${htmlelements.version} + + + org.apache.commons + commons-lang3 + 3.4 + + + org.hamcrest + hamcrest-all + 1.3 + + + ru.yandex.qatools.htmlelements + htmlelements-matchers + 1.12 + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + ${compiler.version} + ${compiler.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" + + + + listener + ru.yandex.qatools.allure.junit.AllureRunListener + + + + + + org.aspectj + aspectjweaver + ${aspectj.version} + + + + + + + + + diff --git a/steps-module/pom.xml b/steps-module/pom.xml index fa52f60..24fc373 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -1,18 +1,56 @@ - + 4.0.0 + school-2016 ru.qatools.school 1.0-SNAPSHOT - - 4.0.0 - jar - + steps-module + jar + Logic Module + + + ru.yandex.qatools.allure + allure-junit-adaptor + + + org.seleniumhq.selenium + selenium-java + + + ru.yandex.qatools.htmlelements + htmlelements-java + + + org.apache.commons + commons-lang3 + + + org.hamcrest + hamcrest-all + + + ru.yandex.qatools.htmlelements + htmlelements-matchers + + + + com.jayway.restassured + rest-assured + + + com.squareup.retrofit2 + retrofit + 2.0.2 + + + - \ No newline at end of file + diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/Cities.java b/steps-module/src/main/java/ru/qatools/school/apiData/Cities.java new file mode 100644 index 0000000..ef23a05 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/apiData/Cities.java @@ -0,0 +1,12 @@ +package ru.qatools.school.apiData; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +import java.util.List; + +public interface Cities { + @GET("api/cities") + Call> cities(@Query("limit") String limit); +} diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/CityJSON.java b/steps-module/src/main/java/ru/qatools/school/apiData/CityJSON.java new file mode 100644 index 0000000..b503130 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/apiData/CityJSON.java @@ -0,0 +1,21 @@ +package ru.qatools.school.apiData; + +public class CityJSON { + public int uid; + + public String name; + + public Country country; + + public int getUid() { + return uid; + } + + public String getName() { + return name; + } + + public Country getCountry() { + return country; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/Country.java b/steps-module/src/main/java/ru/qatools/school/apiData/Country.java new file mode 100644 index 0000000..61cff39 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/apiData/Country.java @@ -0,0 +1,17 @@ +package ru.qatools.school.apiData; + +public enum Country { + RUSSIA("ru"), + FRANCE("fr"); + + private final String country; + + Country(String country){ + this.country = country; + } + + @Override + public String toString(){ + return country; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java new file mode 100644 index 0000000..4d75376 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -0,0 +1,30 @@ +package ru.qatools.school.pages; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; +import ru.qatools.school.pages.blocks.WeatherWidget; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; +import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; + +import java.util.List; + +/** + * Created by kurau. + */ +public class MainPage { + + public MainPage(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + @Name("Список виджетов") + @FindBy(css = ".card.card_md") + private List weatherWidget; + + public List getWeatherWidget() { + return weatherWidget; + } + +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java new file mode 100644 index 0000000..3990d85 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -0,0 +1,43 @@ +package ru.qatools.school.pages.blocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by kurau. + */ +public class WeatherWidget extends HtmlElement { + + @Name("Заголовок виджета") + @FindBy(css = ".card-title") + private WidgetTitle widgetTitle; + + @Name("Текст виджета") + @FindBy(css = ".card-text") + private WidgetText widgetText; + + @Name("Панель управления виджетом") + @FindBy(css = ".card-actions") + private WebElement actions; + + public WidgetText getWidgetText() { + return widgetText; + } + + public WidgetTitle getWidgetTitle() { + return widgetTitle; + } + + public WebElement getActions() { + return actions; + } + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java new file mode 100644 index 0000000..510d070 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java @@ -0,0 +1,25 @@ +package ru.qatools.school.pages.blocks.widgetblocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by kurau. + */ +public class WidgetText extends HtmlElement { + + @Name("Картинка текущей погоды") + @FindBy(css = ".weather-image") + private WebElement weatherImage; + + public WebElement getWeatherImage() { + return weatherImage; + } + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java new file mode 100644 index 0000000..8a88782 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -0,0 +1,14 @@ +package ru.qatools.school.pages.blocks.widgetblocks; + +import org.openqa.selenium.Rectangle; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by kurau. + */ +public class WidgetTitle extends HtmlElement { + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java new file mode 100644 index 0000000..418c363 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -0,0 +1,27 @@ +package ru.qatools.school.rules; + +import org.junit.rules.ExternalResource; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +/** + * Created by kurau. + */ +public class WebDriverRule extends ExternalResource { + + private WebDriver driver; + + protected void before() throws Throwable { + this.driver = new FirefoxDriver(); + } + + protected void after() { + driver.close(); + driver.quit(); + } + + public WebDriver getDriver() { + return driver; + } + +} diff --git a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java index 043ad54..f22648c 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java @@ -2,11 +2,16 @@ import ru.qatools.school.data.Place; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + + /** * @author lanwen (Merkushev Kirill) + * @author gladnik (Gladkov Nikolai) */ public class UserSteps { - + private Place place; private UserSteps() { @@ -15,9 +20,14 @@ private UserSteps() { public static UserSteps user() { return new UserSteps(); } - + public UserSteps goTo(Place place) { this.place = place; return this; } + + public UserSteps shouldBeAtPlace(Place expectedPlace) { + assertThat("Places should match!", this.place, is(expectedPlace)); + return this; + } } diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java new file mode 100644 index 0000000..1425a42 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -0,0 +1,38 @@ +package ru.qatools.school.steps.websteps; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import ru.qatools.school.pages.MainPage; +import ru.yandex.qatools.allure.annotations.Step; + +import static java.lang.String.format; +import static org.junit.Assert.assertThat; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; + +/** + * Created by kurau. + */ +public class DefaultSteps { + + public static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + + private WebDriver driver; + + public DefaultSteps(WebDriver driver) { + this.driver = driver; + } + + @Step("Открываем главную страницу для города «{0}»") + public void openMainPageWithCity(String city) { + driver.get(format(MAIN_PAGE, city)); + } + + @Step("Должны видеть на странице «{0}»") + public void shouldSee(WebElement element) { + assertThat("Должны видеть элемент", element, isDisplayed()); + } + + private MainPage onMainPage() { + return new MainPage(driver); + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java new file mode 100644 index 0000000..62857d2 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java @@ -0,0 +1,64 @@ +package ru.qatools.school.tp; + +import org.junit.AssumptionViolatedException; +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; +import ru.qatools.school.tp.client.TPClient; +import ru.yandex.qatools.allure.annotations.TestCaseId; + +import static com.google.common.collect.Lists.newArrayList; +import static java.lang.System.currentTimeMillis; + +/** + * @author lanwen (Merkushev Kirill) + */ +public class TPInformerRule extends TestWatcher { + + private String project; + private long start; + + public TPInformerRule(String project) { + this.project = project; + } + + @Override + protected void starting(Description description) { + start = currentTimeMillis(); + updateWithStatus("STARTED", description); + } + + @Override + protected void skipped(AssumptionViolatedException e, Description description) { + updateWithStatus("SKIPPED", description); + } + + @Override + protected void failed(Throwable e, Description description) { + if (e instanceof AssertionError) { + updateWithStatus("FAILED", description); + } else { + updateWithStatus("BROKEN", description); + } + } + + @Override + protected void succeeded(Description description) { + updateWithStatus("PASSED", description); + } + + private void updateWithStatus(String status, Description description) { + if (description.getAnnotation(TestCaseId.class) != null) { + TPClient.callUpdate(project, + newArrayList( + new TPClient.TCaseStatus(new TPClient.TCase(idFrom(description)), + status, + currentTimeMillis() - start + ))); + } + } + + private String idFrom(Description description) { + return description.getAnnotation(TestCaseId.class).value(); + } + +} diff --git a/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java b/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java new file mode 100644 index 0000000..85016ff --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java @@ -0,0 +1,49 @@ +package ru.qatools.school.tp.client; + +import com.jayway.restassured.RestAssured; +import com.jayway.restassured.http.ContentType; + +import java.util.List; + +/** + * @author lanwen (Merkushev Kirill) + */ +public class TPClient { + + private static final String ENDPOINT = System.getProperty("tp.api.endpoint", "http://localhost/"); + private static final String TOKEN = System.getProperty("tp.api.token", "empty"); + private static final String RUN = System.getProperty("tp.api.run", "empty"); + + public static void callUpdate(String project, List statuses) { + RestAssured.given() + .relaxedHTTPSValidation() + .log().all() + .baseUri(ENDPOINT) + .basePath("/api/") + .header("TestPalm-Api-Token", TOKEN) + .contentType(ContentType.JSON) + .body(statuses) + .when().log().all().post("/testrun/{project}/{run}/bulk", project, RUN).peek(); + } + + public static class TCaseStatus { + private TCase testCase; + private String status; + private Long duration; + + public TCaseStatus(TCase testCase, String status, Long duration) { + this.testCase = testCase; + this.status = status; + this.duration = duration; + } + } + + public static class TCase { + private String id; + + public TCase(String id) { + this.id = id; + } + } + +}