Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit c0fe1157 authored by rui rodrigues's avatar rui rodrigues
Browse files

add skeleton to api testing

parent 25918b59
No related branches found
No related tags found
No related merge requests found
Showing
with 263 additions and 39 deletions
......@@ -140,7 +140,11 @@ Scenario Outline: a user <userStatus> logs in
### How to run tests
Run the following command
```bash
mvn clean test
// to ui testing
mvn clean test -Dtest=ApiRunnerTest
// to api testing
mvn clean test -Dtest=UiRunnerTest
```
### How to generate html report
......
......@@ -106,5 +106,10 @@
<version>${cucumber.junit.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package configuration.api.data;
public class common {
public static final String MEDIA_TYPE_JSON = "application/json";
public static final String MEDIA_TYPE_TEXT = "text/plain";
}
package configuration.api.data;
public class users {
public static final String BASE_URL = "https://reqres.in";
public static final String ENDPOINT_USERS = "/api/users";
public static final String ENDPOINT_USER_JANET = "/api/users/2";
public static final String ENDPOINT_USER_MORPHEUS = "/api/users/2";
public static final String CREATE_USER_REQUEST_PATH = "src/main/java/configuration/api/requests/createUser.json";
public static final String UPDATE_MORPHEUS_INFO_REQUEST_PATH = "src/main/java/configuration/api/requests/updateMorpheusInfo.json";
}
{
"name": "john",
"job": "developer"
}
\ No newline at end of file
{
"name": "morpheus",
"job": "developer"
}
\ No newline at end of file
package configuration.data;
public class Product {
public static final String BACKPACK_NAME = "Sauce Backpack";
}
package configuration.locators;
public class Product {
public static final String PRODUCT_NAME ="id=item_4_title_link";
}
package configuration.data;
package configuration.ui.data;
public class Login {
public static final String URL = "https://www.saucedemo.com/";
......
package configuration.ui.data;
public class Product {
public static final String BACKPACK_NAME = "Sauce Labs Backpack";
}
package configuration.locators;
package configuration.ui.locators;
public class Login {
public static final String USERNAME = "id=user-name";
......
package configuration.ui.locators;
public class Product {
public static final String PRODUCT_NAME = "id=item_4_title_link";
}
package framework.api;
import com.microsoft.playwright.APIRequest;
import com.microsoft.playwright.APIRequestContext;
import com.microsoft.playwright.Playwright;
import io.cucumber.java.Scenario;
public class ApiSetup {
private final String baseUrl;
public Scenario scenario;
private Playwright playwright;
private APIRequestContext apiContext;
public ApiSetup(String baseUrl) {
this.baseUrl = baseUrl;
}
public void setUp() {
playwright = Playwright.create();
APIRequest.NewContextOptions options = new APIRequest.NewContextOptions().setBaseURL(baseUrl);
apiContext = playwright.request().newContext(options);
}
public APIRequestContext getApiContext() {
return apiContext;
}
public Scenario getScenario() {
return scenario;
}
public void tearDown() {
if (apiContext != null) {
apiContext.dispose();
}
if (playwright != null) {
playwright.close();
}
}
}
package framework.api;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.microsoft.playwright.APIRequestContext;
import com.microsoft.playwright.APIResponse;
import com.microsoft.playwright.options.RequestOptions;
import framework.common.Utils;
import io.cucumber.java.Scenario;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Map;
import static configuration.api.data.common.MEDIA_TYPE_JSON;
import static org.junit.Assert.assertTrue;
public class RequestHandler {
private final String baseUrl;
private final APIRequestContext apiContext;
private final Scenario scenario;
public RequestHandler(String baseUrl, APIRequestContext apiContext, Scenario scenario) {
this.baseUrl = baseUrl;
this.apiContext = apiContext;
this.scenario = scenario;
}
public JsonObject sendRequest(String method, String endpoint) throws FileNotFoundException {
return sendRequest(method, endpoint, null, true);
}
public JsonObject sendRequest(String method, String endpoint, String bodyRequestFilePath) throws FileNotFoundException {
return sendRequest(method, endpoint, bodyRequestFilePath, true);
}
public JsonObject sendRequest(String method, String endpoint, String bodyRequestFilePath, boolean isHappyPath) throws FileNotFoundException {
Utils utils = new Utils(scenario);
utils.printText(baseUrl + endpoint, "Url");
APIResponse response = getApiResponse(method, endpoint, bodyRequestFilePath, utils);
String responseBody = response.text();
JsonObject jsonResponse = JsonParser.parseString(responseBody).getAsJsonObject();
utils.printText(String.valueOf(response.status()), "Status Code");
utils.printJson(responseBody, "Body Response");
if (isHappyPath) {
assertTrue("the request was unsuccessful", response.ok());
}
return jsonResponse;
}
private APIResponse getApiResponse(String method, String endpoint, String bodyRequestFilePath, Utils utils) throws FileNotFoundException {
Gson gson = new Gson();
RequestOptions requestOptions;
Map<String, Object> bodyRequest = null;
if ("POST".equalsIgnoreCase(method) || "PUT".equalsIgnoreCase(method)) {
bodyRequest = gson.fromJson(new FileReader(bodyRequestFilePath), Map.class);
utils.printJson(bodyRequest.toString(), "Body Request");
requestOptions = RequestOptions.create()
.setData(bodyRequest)
.setHeader("Content-Type", MEDIA_TYPE_JSON);
} else {
requestOptions = RequestOptions.create()
.setHeader("Content-Type", MEDIA_TYPE_JSON);
}
switch (method.toUpperCase()) {
case "POST":
return apiContext.post(endpoint, requestOptions);
case "GET":
return apiContext.get(endpoint, requestOptions);
case "PUT":
return apiContext.put(endpoint, requestOptions);
case "DELETE":
return apiContext.delete(endpoint, requestOptions);
default:
throw new IllegalArgumentException("Unsupported HTTP method: " + method);
}
}
}
package framework.common;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import io.cucumber.java.Scenario;
import static configuration.api.data.common.MEDIA_TYPE_JSON;
import static configuration.api.data.common.MEDIA_TYPE_TEXT;
public class Utils {
private final Scenario scenario;
public Utils(Scenario scenario) {
this.scenario = scenario;
}
public void printJson(String json, String title) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonElement jsonElement = JsonParser.parseString(json);
String prettyJson = gson.toJson(jsonElement);
scenario.attach(prettyJson, MEDIA_TYPE_JSON, title);
}
public void printText(String text, String name) {
scenario.attach(text, MEDIA_TYPE_TEXT, name);
}
}
package framework;
package framework.ui;
import io.cucumber.java.After;
import io.cucumber.java.Before;
import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import io.cucumber.java.After;
import io.cucumber.java.Before;
import io.cucumber.java.Scenario;
import java.awt.*;
public class Framework {
public class UiSetup {
public static Scenario scenario;
private static Browser browser;
private static Page page;
private static Scenario scenario;
public static Page getPage() {
return page;
}
public static Scenario getScenario() {
return scenario;
}
@Before
public void setUp(Scenario scenario) {
Framework.scenario = scenario;
UiSetup.scenario = scenario;
Playwright playwright = Playwright.create();
BrowserType chrome = playwright.chromium();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
......@@ -35,12 +43,4 @@ public class Framework {
page.close();
browser.close();
}
public static Page getPage() {
return page;
}
public static Scenario getScenario() {
return scenario;
}
}
......@@ -2,7 +2,7 @@ package helpers;
import com.microsoft.playwright.Page;
import static configuration.locators.Login.*;
import static configuration.ui.locators.Login.*;
public class LoginPage {
......@@ -13,28 +13,38 @@ public class LoginPage {
}
public String verifyTitle() {
return page.title();}
return page.title();
}
public void loginIntoApplication(String email, String pass) {
enterUserName(email);
enterPassword(pass);
clickLoginButton();}
clickLoginButton();
}
public void logoutApplication() {
clickOnHamburger();
clickOnLogout(); }
clickOnLogout();
}
public void enterUserName(String email) {
page.fill(USERNAME, email);}
page.fill(USERNAME, email);
}
public void enterPassword(String pass) {
page.fill(PASSWORD, pass);}
page.fill(PASSWORD, pass);
}
public void clickLoginButton() {
page.click(CLICK_LOGIN);}
page.click(CLICK_LOGIN);
}
public void clickOnHamburger() {
page.click(CLICK_HAMBURGER);
}public void clickOnLogout() {
page.click(CLICK_LOGOUT);}}
\ No newline at end of file
}
public void clickOnLogout() {
page.click(CLICK_LOGOUT);
}
}
\ No newline at end of file
package helpers;
import static configuration.locators.Product.PRODUCT_NAME;
import com.microsoft.playwright.Page;
import static configuration.ui.locators.Product.PRODUCT_NAME;
public class ProductPage {
Page page;
......
@user
Feature: User
@U01
Scenario: creates a user with success
When the user creates a user
Then the new user should be created
@U02
Scenario: get user Janet information
When the user access to janet information
Then janet information should be displayed
@U03
Scenario: update morpheus information
When the user updates the morpheus information
Then The morpheus information should be updated
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment