package io.budgetapp.resource;
import com.google.common.io.Resources;
import io.budgetapp.client.HTTPTokenClientFilter;
import io.budgetapp.modal.IdentityResponse;
import io.budgetapp.model.Budget;
import io.budgetapp.model.Category;
import io.budgetapp.model.CategoryType;
import io.budgetapp.model.User;
import io.budgetapp.model.form.SignUpForm;
import io.budgetapp.model.form.budget.AddBudgetForm;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.filter.LoggingFilter;
import org.junit.BeforeClass;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;
import java.util.List;
import java.util.UUID;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
/**
*
*/
public abstract class ResourceIT {
protected static Client client;
protected static User defaultUser;
protected static Category defaultCategory;
protected static Budget defaultBudget;
@BeforeClass
public static void before() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.register(LoggingFilter.class);
client = ClientBuilder.newClient(clientConfig);
SignUpForm signUp = new SignUpForm();
signUp.setUsername(randomEmail());
signUp.setPassword(randomAlphabets());
post(ResourceURL.USER, signUp);
Response authResponse = post("/api/users/auth", signUp);
defaultUser = authResponse.readEntity(User.class);
defaultUser.setUsername(signUp.getUsername());
defaultUser.setPassword(signUp.getPassword());
client.register(new HTTPTokenClientFilter(defaultUser.getToken()));
defaultCategory = new Category();
defaultCategory.setName(randomAlphabets());
defaultCategory.setType(CategoryType.EXPENDITURE);
Response response = post(ResourceURL.CATEGORY, defaultCategory);
String location = response.getLocation().toString();
String[] raw = location.split("/");
defaultCategory.setId(Long.valueOf(raw[raw.length - 1]));
defaultBudget = new Budget();
defaultBudget.setName(randomAlphabets());
defaultBudget.setCategory(defaultCategory);
AddBudgetForm addBudgetForm = new AddBudgetForm();
addBudgetForm.setName(defaultBudget.getName());
addBudgetForm.setCategoryId(defaultCategory.getId());
response = post(ResourceURL.BUDGET, addBudgetForm);
location = response.getLocation().toString();
raw = location.split("/");
defaultBudget.setId(Long.valueOf(raw[raw.length - 1]));
}
protected static Response post(String path, Object entity) {
return client
.target(getUrl(path))
.request(MediaType.APPLICATION_JSON_TYPE)
.buildPost(Entity.json(entity)).invoke();
}
protected static Response put(String path, Object entity) {
return client
.target(getUrl(path))
.request(MediaType.APPLICATION_JSON_TYPE)
.buildPut(Entity.json(entity)).invoke();
}
protected static Response delete(String path) {
return client
.target(getUrl(path))
.request(MediaType.APPLICATION_JSON_TYPE)
.buildDelete().invoke();
}
protected Response get(String path) {
return client
.target(getUrl(path))
.request(MediaType.APPLICATION_JSON_TYPE)
.buildGet().invoke();
}
protected IdentityResponse identityResponse(Response response) {
return response.readEntity(IdentityResponse.class);
}
protected List<IdentityResponse> identityResponses(Response response) {
return response.readEntity(new GenericType<List<IdentityResponse>>() {});
}
protected void assertCreated(Response response) {
assertThat(response.getStatus(), is(201));
}
protected void assertOk(Response response) {
assertThat(response.getStatus(), is(200));
}
protected void assertDeleted(Response response) {
assertThat(response.getStatus(), is(Response.Status.NO_CONTENT.getStatusCode()));
}
protected void assertNotFound(Response response) {
assertThat(response.getStatus(), is(Response.Status.NOT_FOUND.getStatusCode()));
}
protected void assertBadRequest(Response response) {
assertThat(response.getStatus(), is(400));
}
protected static String randomAlphabets() {
return UUID.randomUUID().toString().substring(0, 8);
}
protected static String randomEmail() {
return randomAlphabets() + "@" + randomAlphabets() + ".com";
}
protected static String getUrl() {
return String.format("http://localhost:8080");
}
protected abstract int getPort();
protected static String getUrl(String path) {
return getUrl() + path;
}
protected static String resourceFilePath(String resourceClassPathLocation) {
try {
return new File(Resources.getResource(resourceClassPathLocation).toURI()).getAbsolutePath();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}