package io.robe.test.request;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by adem on 06/10/2016.
*/
public class TestRequest {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private String baseUrl;
private String endpoint;
private String entity;
private String contentType;
private Map<String, String> queryParams = new HashMap<>();
private Map<String, String> cookies = new HashMap<>();
private Map<String, String> headers = new HashMap<>();
private TestRequest(Builder builder) {
this.baseUrl = builder.baseUrl;
this.endpoint = builder.endpoint;
this.entity = builder.entity;
this.contentType = builder.contentType;
this.queryParams = builder.queryParams;
this.cookies = builder.cookies;
this.headers = builder.headers;
}
public String getBaseUrl() {
return baseUrl;
}
public String getEndpoint() {
return endpoint;
}
public String getEntity() {
return entity;
}
public String getContentType() {
return contentType;
}
public Map<String, String> getQueryParams() {
return queryParams;
}
public Map<String, String> getCookies() {
return cookies;
}
public Map<String, String> getHeaders() {
return headers;
}
public boolean hasCookie() {
return !cookies.isEmpty();
}
public boolean hasHeader() {
return !headers.isEmpty();
}
public boolean hasBody() {
return entity != null;
}
public String getRequestUrl() {
if (this.endpoint == null) {
this.endpoint = "";
}
String requestUrl = this.baseUrl.endsWith("/") ? this.baseUrl + this.endpoint : this.baseUrl + "/" + this.endpoint;
if (!this.queryParams.isEmpty()) {
List<String> queryParts = new ArrayList<>();
requestUrl += "?";
for (Map.Entry<String, String> queryParam : this.getQueryParams().entrySet()) {
queryParts.add(queryParam.getKey() + "=" + queryParam.getValue());
}
requestUrl += String.join("&", queryParts);
}
return requestUrl;
}
public static class Builder {
private String baseUrl;
private String endpoint;
private String entity;
private String contentType;
private Map<String, String> queryParams = new HashMap<>();
private Map<String, String> cookies = new HashMap<>();
private Map<String, String> headers = new HashMap<>();
public Builder(String baseUrl) {
this(baseUrl, "application/json");
}
public Builder(String baseUrl, String contentType) {
this.baseUrl = baseUrl;
this.contentType = contentType;
}
public Builder endpoint(String endpoint) {
this.endpoint = endpoint;
return this;
}
public Builder query(String name, String value) {
this.queryParams.put(name, value);
return this;
}
public Builder search(Object searchModel) throws IllegalArgumentException {
if (searchModel == null) {
return this;
}
Map<String, Object> search = OBJECT_MAPPER.convertValue(searchModel, new TypeReference<Map>(){});
if (search.get("q") != null) {
this.query("_q", search.get("q").toString());
}
if (search.get("fields") != null) {
this.query("_fields", String.join(",", (List) search.get("fields")));
}
if (search.get("limit") != null) {
this.query("_limit", search.get("limit").toString());
}
if (search.get("offset") != null) {
this.query("_offset", search.get("offset").toString());
}
if (search.get("sort") != null) {
this.query("_sort", String.join(",", (List) search.get("sort")));
}
if (search.get("filter") != null) {
this.query("_filter", search.get("filter").toString());
}
return this;
}
public Builder contentType(String contentType) {
this.contentType = contentType;
return this;
}
public Builder entity(String entity) {
this.entity = entity;
return this;
}
public Builder entity(Object entity) throws JsonProcessingException {
this.entity = OBJECT_MAPPER.writeValueAsString(entity);
return this;
}
public Builder header(String name, String value) {
this.headers.put(name, value);
return this;
}
public Builder cookie(String name, String value) {
this.cookies.put(name, value);
return this;
}
public TestRequest build() {
return new TestRequest(this);
}
}
}