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

core.apiCore.interfaces.RestApiInterface Maven / Gradle / Ivy

package core.apiCore.interfaces;

import static io.restassured.RestAssured.given;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang.StringUtils;

import core.apiCore.ServiceManager;
import core.apiCore.helpers.DataHelper;
import core.apiCore.helpers.DataHelper.JSON_COMMAND;
import core.apiCore.helpers.JsonHelper;
import core.helpers.Helper;
import core.helpers.StopWatchHelper;
import core.helpers.UtilityHelper;
import core.support.configReader.Config;
import core.support.logger.TestLog;
import core.support.objects.KeyValue;
import core.support.objects.ServiceObject;
import core.support.objects.TestObject;
import io.restassured.RestAssured;
import io.restassured.config.HttpClientConfig;
import io.restassured.config.RestAssuredConfig;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;

public class RestApiInterface {

	public static final String API_TIMEOUT_PAGINATION_VALIDATION_ENABLED = "api.timeout.pagination.validation.isEnabled";

	private static final String INVALID_TOKEN = "INVALID_TOKEN";
	private static final String NO_TOKEN = "NO_TOKEN";

	private static final String OPTION_PAGINATION_STOP_CRITERIA = "PAGINATION_STOP_CRITERIA";
	private static final String OPTION_PAGINATION_MAX_PAGES = "PAGINATION_MAX_PAGES";
	private static final String OPTION_PAGINATION_FROM = "PAGINATION_FROM";
	private static final String OPTION_PAGINATION_INCREMENET = "PAGINATION_INCREMENT";

	public static final String API_PAGINATION_STOP_CRITERIA = "api.pagination.stop.criteria";
	public static final String API_PAGINATION_MAX_PAGES = "api.pagination.max.pages";
	public static final String API_PAGINATION_PAGES_FROM = "api.pagination.pages.from";
	public static final String API_PAGINATION_INCREMENT = "api.pagination.incremenet";

	public static final String API_PAGINATION_COUNTER = "PAGINATION";

	public static final String API_PARAMETER_ENCODING = "api.encoding.parameter";
	public static final String API_USE_RELAXED_HTTPS_VALIDATION = "api.useRelaxedHTTPSValidation";

	

	public static final String API_BASE_URL = "api.uriPath";

	/**
	 * interface for restful API calls
	 * 
	 * @param serviceObject
	 * @return
	 */
	public static Response RestfullApiInterface(ServiceObject serviceObject) {

		if (serviceObject == null)
			Helper.assertFalse("service object is null");

		// set timeout from api config
		setTimeout();

		// set proxy from api config
		setProxy();

		// send request and evaluate response
		Response response = evaluate(serviceObject);

		return response;
	}

	public static Response evaluate(ServiceObject serviceObject) {
		Response response = null;

		// if pagination
		if (serviceObject.getUriPath().contains(API_PAGINATION_COUNTER))
			response = evaluatePagination(serviceObject);
		else
			response = evaluateRequestAndValidateResponse(serviceObject);
		return response;
	}

	/**
	 * evaluate request and validate response retry until validation timeout period
	 * in seconds RetryAfterSecond is based on waiting after the validation round is
	 * complete, including wait for response wait period
	 * 
	 * @param serviceObject
	 * @return
	 */
	public static Response evaluateRequestAndValidateResponse(ServiceObject serviceObject) {

		// set options
		evaluateOption(serviceObject);
		
		int getRetryCount = Config.getIntValue(ServiceManager.SERVICE_RETRY_COUNT);
		int getRetryAfterSecond = Config.getIntValue(ServiceManager.SERVICE_RETRY_AFTER_SERCONDS);
		
		// retry test if value set
		for (int i = 1; i <= getRetryCount + 1; i++) {
			// evaluate request and receive response
			evaluateRequestAndReceiveResponse(serviceObject);

			// do not evaluate errors if no expectations set
			if (serviceObject.getExpectedResponse().isEmpty() && serviceObject.getRespCodeExp().isEmpty())
				return serviceObject.getResponse();

			// if no errors, then break
			if (serviceObject.getErrorMessages().isEmpty())
				break;

			// wait after the test is complete before next retry. default is 0
			if (i <= getRetryCount) {
				TestLog.logPass("Run: " + i + " Failed, attempting another retry... " + (getRetryCount + 1 - i)
						+ " retry(s) remaining");
				if (getRetryAfterSecond > 0)
					Helper.waitForSeconds(getRetryAfterSecond);
			}
		}

		if (!serviceObject.getErrorMessages().isEmpty()) {
			String errorString = StringUtils.join(serviceObject.getErrorMessages(), "\n error: ");
			TestLog.ConsoleLog(ServiceObject.normalizeLog(errorString));
			Helper.assertFalse(StringUtils.join(serviceObject.getErrorMessages(), "\n error: "));
		}

		return serviceObject.getResponse();
	}

	/**
	 * evaluate pagination format: http://url?page=<@PAGINATION_FROM_1> counter will
	 * start from page 1 will iterate through the pages until either: - the expected
	 * response criteria is met - max pages are reached. specified by
	 * PAGINATION_MAX_PAGES:100 in options - response criteria for max pages is
	 * reached. OPTION_PAGINATION_STOP_CRITERIA:.results.id - if the list of
	 * responses on a selected page is 0, that means the page has no results, hence,
	 * it is the last page
	 * 
	 * @param serviceObject
	 * @return
	 */
	public static Response evaluatePagination(ServiceObject serviceObject) {

		// set options
		evaluateOption(serviceObject);
		boolean isValidationTimeout = Config.getBooleanValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_ENABLED);

		// set pagination response validation
		Config.putValue(API_TIMEOUT_PAGINATION_VALIDATION_ENABLED, isValidationTimeout, false);

		boolean isCriteriaSuccess = false;

		StopWatchHelper watch = StopWatchHelper.start();
		long passedTimeInSeconds = 0;
		int maxRetrySeconds = -1;

		int currentRunCount = 1;
		// if validation timeout set, will retry for duration of validation timeout
		// validation timeout per page is disabled
		do {
			currentRunCount++;

			if (currentRunCount > 1)
				TestLog.ConsoleLog("attempt #" + (currentRunCount));

			// evaluate request and validate pagination
			isCriteriaSuccess = evaluateRequestAndValidatePagination(serviceObject);

			passedTimeInSeconds = watch.time(TimeUnit.SECONDS);

			// if validation timeout is not enabled, break out of the loop
			maxRetrySeconds = Config.getIntValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_SECONDS);
			if (!isValidationTimeout)
				break;

		} while (!isCriteriaSuccess && passedTimeInSeconds < maxRetrySeconds);

		// reset pagination timeout
		Config.putValue(API_TIMEOUT_PAGINATION_VALIDATION_ENABLED, false);

		Helper.assertTrue("expected validation not found in pages.", isCriteriaSuccess);

		return serviceObject.getResponse();
	}

	public static boolean evaluateRequestAndValidatePagination(ServiceObject serviceObject) {

		String criteria = Config.getValue(API_PAGINATION_STOP_CRITERIA);
		int maxPages = Config.getIntValue(API_PAGINATION_MAX_PAGES);
		int startingPage = Helper.getIntFromString(Config.getValue(API_PAGINATION_PAGES_FROM));
		int incrementBy = Helper.getIntFromString(Config.getValue(API_PAGINATION_INCREMENT));

		String uri = serviceObject.getUriPath();
		boolean isCriteriaSuccess = false;

		for (int index = startingPage; index <= maxPages; index += incrementBy) {

			TestLog.logPass("Validating page: " + index);

			// update uri to include the incrementally increasing page numbers
			// resets page number to <@PAGINATION> keyword which will get overwritten
			serviceObject = serviceObject.withUriPath(uri);
			Config.putValue(API_PAGINATION_COUNTER, index, false);

			// evaluate the request and receive response. errors are stored at
			// serviceObject.errorMessages
			serviceObject = evaluateRequestAndReceiveResponse(serviceObject);

			// error indicates that there are no more results on the page
			List criteriaErrors = validatePaginationStopCriteria(serviceObject, criteria);
			if (!criteriaErrors.isEmpty()) {
				TestLog.logPass("no more results returned at page: " + index + " with criteria: " + criteria);
				break;
			}

			// if errors (requirements not met), reset errors for next page
			if (!serviceObject.getErrorMessages().isEmpty()) {
				TestLog.logPass(Arrays.toString(serviceObject.getErrorMessages().toArray()));
			} else if (serviceObject.getErrorMessages().isEmpty()) {
				isCriteriaSuccess = true;
				break;
			}
		}

		return isCriteriaSuccess;
	}

	/**
	 * stoppage criteria for api pagination will iterate through pages in api call,
	 * untill the criteria node size reaches 0 - this indicates that there are no
	 * more results on the page
	 * 
	 * @param serviceObject
	 * @param criteria
	 * @return
	 */
	private static List validatePaginationStopCriteria(ServiceObject serviceObject, String criteria) {
		// add pagination page item count criteria to expected response
		if (!criteria.isEmpty()) {
			criteria = DataHelper.VERIFY_JSON_PART_INDICATOR + criteria + ":" + JSON_COMMAND.nodeSizeGreaterThan.name()
					+ "(0)";
		}
		ServiceObject criteriaService = new ServiceObject().withResponse(serviceObject.getResponse())
				.withExpectedResponse(criteria);

		// validate the response
		List criteriaErrors = validateResponse(criteriaService);
		return criteriaErrors;
	}

	/**
	 * evaluates the request and stores the response in service object
	 * 
	 * @param serviceObject
	 * @return
	 */
	public static ServiceObject evaluateRequestAndReceiveResponse(ServiceObject serviceObject) {
		StopWatchHelper watch = StopWatchHelper.start();
		long passedTimeInSeconds = 0;

		int maxRetrySeconds = -1;
		int currentRunCount = 0;

		do {
			currentRunCount++;
			
			// reset error list
			List errors = new ArrayList();
			serviceObject.withErrorMessages(errors);

			if (currentRunCount > 1) {			
				// set options. options initially set before evaluateRequestAndReceiveResponse
				evaluateOption(serviceObject);
			}

			// set base uri
			RequestSpecification request = setURI(serviceObject);

			// replace parameters for request body, including template file (json, xml, or
			// other)
			serviceObject.withRequestBody(DataHelper.getRequestBodyIncludingTemplate(serviceObject));

			// send request And receive a response. adds errors if exception
			serviceObject = evaluateRequest(serviceObject, request);

			// validate the response
			serviceObject.withErrorMessages(validateResponse(serviceObject));

			passedTimeInSeconds = watch.time(TimeUnit.SECONDS);

			// if validation timeout is not enabled, break out of the loop
			boolean isValidationTimeout = Config.getBooleanValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_ENABLED);
			maxRetrySeconds = Config.getIntValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_SECONDS);
			if (!isValidationTimeout)
				break;

			// log errors if exist
			logTestRunError(currentRunCount, serviceObject.getErrorMessages());

		} while (!serviceObject.getErrorMessages().isEmpty() && passedTimeInSeconds < maxRetrySeconds);

		if (!serviceObject.getErrorMessages().isEmpty()) {
			TestLog.ConsoleLog("Validation failed after: " + passedTimeInSeconds + " seconds with " + currentRunCount + " retries");
		}

		return serviceObject;
	}

	private static void logTestRunError(int currentRunCount, List errorMessages) {
		int waitTime = Config.getIntValue(ServiceManager.SERVICE_RESPONSE_DELAY_BETWEEN_ATTEMPTS_SECONDS);
		double waitMultiplier = Config.getDoubleValue(ServiceManager.SERVICE_RESPONSE_DELAY_BETWEEN_ATTEMPTS_MULTIPLIER);
		if(waitMultiplier == -1) waitMultiplier = 1;

		String errors = StringUtils.join(errorMessages, "\n error: ");
		if(!errors.isEmpty())
			TestLog.ConsoleLog("attempt failed with message: " + ServiceObject.normalizeLog(errors));
		if (currentRunCount > 1) {
			double waitTimeSeconds = waitTime * Math.pow(waitMultiplier, currentRunCount - 1);
			Helper.waitForSeconds(waitTimeSeconds);
			TestLog.ConsoleLog("attempt #" + (currentRunCount) + " waiting seconds: " + waitTimeSeconds);
		}
	}

	/**
	 * sets base uri for api call
	 * 
	 * @return
	 */
	public static RequestSpecification setURI(ServiceObject serviceObject) {
		String url = StringUtils.EMPTY;

		// set request
		RequestSpecification request = given();

		// replace place holder values for URI
		serviceObject.withUriPath(DataHelper.replaceParameters(serviceObject.getUriPath()));
		serviceObject.withUriPath(Helper.stringRemoveLines(serviceObject.getUriPath()));

		// if URI is full path, Then set base URI as what's provided in CSV file
		// else use baseURI from properties as base URI And extend it with CSV file URI
		// path
		if (serviceObject.getUriPath().startsWith("http")) {
			url = serviceObject.getUriPath();
		} else {
			url = Helper.stringRemoveLines(Config.getValue(API_BASE_URL)) + serviceObject.getUriPath();
		}
		// keep track of full URL
		serviceObject.withUriPath(url);

		URL aURL = Helper.convertToUrl(url);
		TestLog.logPass("request URL: " + aURL.toString());

		request.baseUri(aURL.getProtocol() + "://" + aURL.getHost());
		request.port(aURL.getPort());
		request.basePath(aURL.getPath());

		return request;
	}

	/**
	 * set connection timeout in milliseconds
	 */
	public static void setTimeout() {
		int connectTimeout = Config.getIntValue(ServiceManager.SERVICE_RESPONSE_TIMEOUT_SECONDS);
		if (connectTimeout == -1)
			connectTimeout = 60; // connect timeout defaults to 60 seconds

		RestAssured.config = RestAssuredConfig.config().httpClient(
				HttpClientConfig.httpClientConfig().setParam("http.connection.timeout", connectTimeout * 1000)
						.setParam("http.socket.timeout", connectTimeout * 1000)
						.setParam("http.connection-manager.timeout", connectTimeout * 1000));

	}

	/**
	 * set proxy from config file value to use proxy is set at API_AUTO_PROXY_SET We
	 * evaluate if we need to use proxy once in test run
	 * 
	 * @throws Exception
	 */
	public static void setProxy() {

		String host = Config.getValue(TestObject.PROXY_HOST);
		int port = Config.getIntValue(TestObject.PROXY_PORT);
		String proxyProtocal = Config.getValue(TestObject.PROXY_PROTOCOL);
		boolean isProxyEnabled = false;
		
		if(Config.getBooleanValue(API_USE_RELAXED_HTTPS_VALIDATION))
			RestAssured.useRelaxedHTTPSValidation();

		// detect if proxy is required or not
		isProxyEnabled = UtilityHelper.isProxyRequired(getBaseUrl());
		
		if (!isProxyEnabled)
			return;

		if (host.isEmpty() || port == -1)
			return;

		if (proxyProtocal.equals("http") || proxyProtocal.equals("https"))
			RestAssured.proxy(host, port, proxyProtocal);
		else
			RestAssured.proxy(host, port);
	}
	
	public static boolean getProxyState() {
		String proxyState = Config.getValue(TestObject.PROXY_ENABLED);
		if(proxyState.equals("true"))
			return true;
		else return false;
	}

	public static List validateResponse(ServiceObject serviceObject) {

		List errorMessages = serviceObject.getErrorMessages();

		// fail test if no response is returned
		if (serviceObject.getResponse() == null) {
			errorMessages.add("no response returned");
			return errorMessages;
		}

		// saves response values to config object
		saveOutBoundValues(serviceObject);

		// validate status code
		errorMessages.addAll(validateStatusCode(serviceObject.getResponse(), serviceObject));

		// get response values and validate
		String responseString = JsonHelper.getResponseValue(serviceObject.getResponse());
		List responses = new ArrayList();
		responses.add(responseString);
		errorMessages.addAll(DataHelper.validateExpectedValues(responses, serviceObject.getExpectedResponse()));

		// remove all empty response strings
		errorMessages = DataHelper.removeEmptyElements(errorMessages);
		return errorMessages;
	}
	
	public static void saveOutBoundValues(ServiceObject serviceObject) {
		if (serviceObject.getResponse() == null || serviceObject.getOutputParams().isEmpty())
			return;
		// saves response values to config object
		JsonHelper.saveOutboundJsonParameters(serviceObject.getResponse(), serviceObject.getOutputParams());

	}

	/**
	 * validate status code
	 * 
	 * @param response
	 * @param serviceObject
	 * @return
	 */
	public static List validateStatusCode(Response response, ServiceObject serviceObject) {
		List errorMessages = new ArrayList();

		// validate status code
		if (!serviceObject.getRespCodeExp().isEmpty()) {
			String message = "expected status code: " + serviceObject.getRespCodeExp() + " response status code: "
					+ response.getStatusCode();
			TestLog.logPass(message);
			if (response.getStatusCode() != Integer.valueOf(serviceObject.getRespCodeExp())) {
				errorMessages.add(message);
			}
		}
		return errorMessages;
	}

	/**
	 * sets the header, content type And body based on specifications Headers are
	 * based on key value, separated by ";" Invalid token: if authorization token
	 * exists, replace last values with "invalid", else set to "invalid"
	 * 
	 * we replace parameters per authentication type
	 * 
	 * @param serviceObject
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static RequestSpecification evaluateRequestHeaders(ServiceObject serviceObject,
			RequestSpecification request) {

		// if no RequestHeaders specified
		if (serviceObject.getRequestHeaders().isEmpty()) {
			return request;
		}

		// get key value mapping of header parameters
		List keywords = DataHelper.getValidationMap(serviceObject.getRequestHeaders());

		// iterate through key value pairs for headers, separated by ";"
		for (KeyValue keyword : keywords) {

			// if additional request headers
			switch (keyword.key) {
			case Authentication.BASIC_AUTHORIZATION:
				List keys = Helper.getValuesFromPattern(keyword.value.toString(), "<@(.+?)>");
				if (keys.size() == 0)
					Helper.assertFalse("value not set with format identifier:<@variable>");
				String key = keys.get(0);

				ArrayList basicRequest = (ArrayList) Config.getObjectValue(key);
				if (basicRequest == null || basicRequest.size() != 2)
					Helper.assertFalse("basicRequest request info not correct. Should include username, password: "
							+ Arrays.toString(basicRequest.toArray()));
				request = request.auth().preemptive().basic(basicRequest.get(0), basicRequest.get(1));
				keyword.value = Arrays.toString(basicRequest.toArray());
				break;
				
			case Authentication.NTLM_AUTHORIZATION:
				keys = Helper.getValuesFromPattern(keyword.value.toString(), "<@(.+?)>");
				if (keys.size() == 0)
					Helper.assertFalse("value not set with format identifier:<@variable>");
				key = keys.get(0);

				ArrayList ntlmRequest = (ArrayList) Config.getObjectValue(key);
				if (ntlmRequest == null || ntlmRequest.size() != 4)
					Helper.assertFalse(
							"ntlmRequest request info not correct. Should include username, password, workstation, domain: "
									+ Arrays.toString(ntlmRequest.toArray()));
				request = request.auth().ntlm(ntlmRequest.get(0), ntlmRequest.get(1), ntlmRequest.get(2),
						ntlmRequest.get(3));
				keyword.value = Arrays.toString(ntlmRequest.toArray());
				break;
				
			case INVALID_TOKEN:
				String authValue = Config.getValue(Authentication.AUTHORIZATION_HEADER);

				// replace authorization token with random string of equal value to the token
				if (!authValue.isEmpty()) {
					authValue = Helper.generateRandomString(authValue.length());
					request = request.given().header(Authentication.AUTHORIZATION_HEADER, authValue);
				} else
					request = request.given().header(Authentication.AUTHORIZATION_HEADER, "invalid");
				break;

			case NO_TOKEN:
				request = request.given().header(Authentication.AUTHORIZATION_HEADER, "");
				break;

			case Authentication.AUTHORIZATION_HEADER:
				keyword.value = DataHelper.replaceParameters(keyword.value.toString());
				// keep track of the token
				Config.putValue(Authentication.AUTHORIZATION_HEADER, keyword.value, false);
				request = request.given().header(keyword.key, keyword.value);
				break;
				
			default:
				keyword.value = DataHelper.replaceParameters(keyword.value.toString());
				request = request.given().header(keyword.key, keyword.value);
				break;
			}
		}
		KeyValue.printKeyValue(keywords, "header");
		return request;
	}

	/**
	 * evaluate query parameters format: "name=key=value&key2=value2"
	 * 
	 * @param serviceObject
	 * @param request
	 * @return
	 */
	public static RequestSpecification evaluateQueryParameters(ServiceObject serviceObject,
			RequestSpecification request) {
		URL aURL = Helper.convertToUrl(serviceObject.getUriPath());

		if (StringUtils.isBlank(aURL.getQuery()))
			return request;

		String[] queryParameters = aURL.getQuery().split("(&&)|(&)");

		if (queryParameters.length == 0)
			Helper.assertFalse(
					"query parameters are wrong format: " + aURL.getQuery() + ". should be \"key=value&key2=value2\"");

		// if encoding enabled, query parameters will be encoded
		boolean paramterEncoding = Config.getBooleanValue(API_PARAMETER_ENCODING);
		
		// disable rest assured build in encoding. we will use java utils version
		request = request.urlEncodingEnabled(false);

		for (String queryParameter : queryParameters) {
			String[] query = queryParameter.split("=", 2);
			if (query.length == 0)
				Helper.assertFalse("query parameters are wrong format: " + aURL.getQuery()
						+ ". should be \"key=value&key2=value2\"");
			if (query.length == 1)
				request = request.given().queryParam(query[0], "");
			else {
				if (paramterEncoding) {
					try {
						request = request.given().queryParam(query[0],
								URLEncoder.encode(query[1], StandardCharsets.UTF_8.toString()));
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
				} else
					request = request.given().queryParam(query[0], query[1]);
			}
		}

		return request;
	}

	public static RequestSpecification evaluateRequestBody(ServiceObject serviceObject, RequestSpecification request) {
		if (serviceObject.getRequestBody().isEmpty())
			return request;

		// set content type
		request = request.contentType(serviceObject.getContentType());

		// set form data
		if (serviceObject.getContentType().contains("form")) {
			request = request.config(RestAssured.config().encoderConfig(io.restassured.config.EncoderConfig
					.encoderConfig().encodeContentTypeAs("multipart/form-data", ContentType.TEXT)));

			String[] formData = serviceObject.getRequestBody().split(",");
			for (String data : formData) {
				String[] keyValue = data.split(":", 2);
				if (keyValue.length == 3) {
					switch (keyValue[1]) { // data type
					case "FILE":
						File file = DataHelper.getFile(keyValue[2]);
						request.multiPart(file);
						break;
					default:
						break;
					}
				} else
					request = request.formParam(keyValue[0].trim(), keyValue[1].trim());
			}
			return request;
		}

		// if json data type
		return request.body(serviceObject.getRequestBody());
	}

	/**
	 * sets the header, content type And body based on specifications
	 * 
	 * @param serviceObject
	 * @return
	 */
	public static void evaluateOption(ServiceObject serviceObject) {

		// reset validation timeout. will be overwritten by option value if set
		resetValidationTimeout();

		// if no option specified
		if (serviceObject.getOption().isEmpty()) {
			return;
		}

		// replace parameters for request body
		serviceObject.withOption(DataHelper.replaceParameters(serviceObject.getOption()));

		// get key value mapping of header parameters
		List keywords = DataHelper.getValidationMap(serviceObject.getOption());

		// iterate through key value pairs for headers, separated by ";"
		for (KeyValue keyword : keywords) {

			// if additional options
			switch (keyword.key) {
			case ServiceManager.OPTION_NO_VALIDATION_TIMEOUT:
				Config.putValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_ENABLED, false, false);
				break;
			case ServiceManager.OPTION_WAIT_FOR_RESPONSE:
				// disable per page wait for response if pagination validation is enabled
				if (Config.getBooleanValue(API_TIMEOUT_PAGINATION_VALIDATION_ENABLED))
					Config.putValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_ENABLED, false, false);
				else
					Config.putValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_ENABLED, true, false);
				Config.putValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_SECONDS, keyword.value, false);
				break;
			case ServiceManager.OPTION_WAIT_FOR_RESPONSE_DELAY:
				Config.putValue(ServiceManager.SERVICE_RESPONSE_DELAY_BETWEEN_ATTEMPTS_SECONDS, keyword.value, false);
				break;
			case ServiceManager.OPTION_RETRY_COUNT:
				Config.putValue(ServiceManager.SERVICE_RETRY_COUNT, keyword.value, false);
				break;
			case ServiceManager.OPTION_RETRY_AFTER_SECONDS:
				Config.putValue(ServiceManager.SERVICE_RETRY_AFTER_SERCONDS, keyword.value, false);
				break;
			case OPTION_PAGINATION_STOP_CRITERIA:
				Config.putValue(API_PAGINATION_STOP_CRITERIA, keyword.value, false);
				break;
			case OPTION_PAGINATION_MAX_PAGES:
				Config.putValue(API_PAGINATION_MAX_PAGES, keyword.value, false);
				break;
			case OPTION_PAGINATION_FROM:
				Config.putValue(API_PAGINATION_PAGES_FROM, keyword.value, false);
				break;
			case OPTION_PAGINATION_INCREMENET:
				Config.putValue(API_PAGINATION_INCREMENT, keyword.value, false);
				break;
			default:
				break;
			}
		}
		KeyValue.printKeyValue(keywords, "option");
	}

	/**
	 * reset validation timeout
	 */
	private static void resetValidationTimeout() {
		// reset validation timeout option
		String defaultValidationTimeoutIsEnabled = Config
				.getGlobalValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_ENABLED);

		String defaultValidationTimeoutIsSeconds = Config
				.getGlobalValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_SECONDS);

		int defaultValidationTimeoutDelay = Config
				.getGlobalIntValue(ServiceManager.SERVICE_RESPONSE_DELAY_BETWEEN_ATTEMPTS_SECONDS);
		if (defaultValidationTimeoutDelay == -1)
			defaultValidationTimeoutDelay = 3;

		Config.putValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_ENABLED, defaultValidationTimeoutIsEnabled, false);
		Config.putValue(ServiceManager.SERVICE_TIMEOUT_VALIDATION_SECONDS, defaultValidationTimeoutIsSeconds, false);
		Config.putValue(ServiceManager.SERVICE_RESPONSE_DELAY_BETWEEN_ATTEMPTS_SECONDS, defaultValidationTimeoutDelay, false);

		// reset retry count
		int defaultRetryCount = Config.getGlobalIntValue(ServiceManager.SERVICE_RETRY_COUNT);
		if (defaultRetryCount == -1)
			defaultRetryCount = 0;

		int defaultRetryAfterSeconds = Config.getGlobalIntValue(ServiceManager.SERVICE_RETRY_AFTER_SERCONDS);
		if (defaultRetryAfterSeconds == -1)
			defaultRetryAfterSeconds = 1;

		Config.putValue(ServiceManager.SERVICE_RETRY_COUNT, defaultRetryCount, false);
		Config.putValue(ServiceManager.SERVICE_RETRY_AFTER_SERCONDS, defaultRetryAfterSeconds, false);

		Config.putValue(API_PAGINATION_STOP_CRITERIA, "", false);
		Config.putValue(API_PAGINATION_MAX_PAGES, 100, false);
		Config.putValue(API_PAGINATION_PAGES_FROM, 1, false);
		Config.putValue(API_PAGINATION_INCREMENT, 1, false);
	}

	public static ServiceObject evaluateRequest(ServiceObject serviceObject, RequestSpecification request) {
		Response response = null;

		List errors = new ArrayList();

		// set request header
		request = evaluateRequestHeaders(serviceObject, request);

		request = evaluateQueryParameters(serviceObject, request);

		// set request body
		request = evaluateRequestBody(serviceObject, request);

		serviceObject.withRequest(request);
		if(!serviceObject.getRequestBody().isEmpty())
			TestLog.logPass("request body: " + Helper.stringRemoveLines(serviceObject.getRequestBody()));
		TestLog.logPass("request type: " + serviceObject.getMethod());

		try {
			switch (serviceObject.getMethod()) {
			case "POST":
				response = request.when().post();
				break;
			case "PUT":
				response = request.when().put();
				break;
			case "PATCH":
				response = request.when().patch();
				break;
			case "DELETE":
				response = request.when().delete();
				break;
			case "GET":
				response = request.when().get();
				break;
			case "OPTIONS":
				response = request.when().options();
				break;
			case "HEAD":
				response = request.when().head();
				break;
			default:
				Helper.assertTrue("request type not found", false);
				break;
			}
		} catch (Exception e) {
			errors.add(e.getMessage());
			serviceObject.withErrorMessages(errors);
		}

		if (response != null) {
			TestLog.logPass("response code: " + response.getStatusCode() + ". status: " + response.getStatusLine() );
			TestLog.logPass("response message: " + ServiceObject.normalizeLog(response.getBody().asString()));
			serviceObject.withResponse(response.then().extract().response());
		} else {
			TestLog.logPass("response message: " + "null");
			serviceObject.withResponse(response);			
		}
		

		return serviceObject;
	}

	/**
	 * get base url from the config
	 * 
	 * @return
	 */
	public static URL getBaseUrl() {
		URL baseUrl = null;
		String baseUrlValue = Config.getValue(API_BASE_URL);
		try {
			baseUrl = new URL(baseUrlValue);
		} catch (MalformedURLException e) {
			Helper.logStackTrace(e);
		}
		return baseUrl;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy