package io.robe.admin.resources;
import io.robe.admin.RobeAdminTest;
import io.robe.hibernate.entity.BaseEntity;
import io.robe.test.Order;
import io.robe.test.Roadrunner;
import io.robe.test.request.HttpClient;
import io.robe.test.request.TestRequest;
import io.robe.test.request.TestResponse;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
import java.util.UUID;
import static org.junit.Assert.assertTrue;
/**
* Created by hasanmumin on 03/10/16.
*/
@RunWith(Roadrunner.class)
public abstract class BaseResourceTest<T extends BaseEntity> extends RobeAdminTest {
public static final String BASE_URL = "http://127.0.0.1:8686/robe/";
protected final HttpClient client = HttpClient.getClient();
public abstract String getPath();
public abstract Class<T> getClazz();
public abstract void assertEquals(T model, T response);
public abstract void assertEquals(T mergeInstance, T original, T response);
public abstract T instance();
public abstract T update(T response);
public abstract T mergeInstance();
protected TestRequest.Builder getRequestBuilder() {
return new TestRequest.Builder(BASE_URL + getPath());
}
@Test
@Order
public void getAll() throws Exception {
List<T> response = this.getAllFrom();
Assert.assertTrue(response != null);// TODO change
}
@Test
@Order(order = 2)
public void get() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
T get = this.getFrom(data.getOid());
this.assertEquals(data, get);
this.deleteFrom(data);
}
@Test
@Order(order = 3)
public void create() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
this.deleteFrom(data);
}
@Test
@Order(order = 4)
public void update() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
data = this.update(data);
T response = this.updateFrom(data);
this.assertEquals(data, response);
this.deleteFrom(data);
}
@Test
@Order(order = 5)
public void merge() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
T merge = this.mergeInstance();
merge.setOid(data.getOid());
T response = this.mergeFrom(merge);
this.assertEquals(merge, data, response);
this.deleteFrom(data);
}
@Test
@Order(order = 6)
public void delete() throws Exception {
T data = this.createFrom();
this.deleteFrom(data);
try {
this.getFrom(data.getOid());
assertTrue("Entity deleted from database. Thats why it can't be exist on database !", false);
} catch (Exception e) {
assertTrue("Entity deleted from database.", true);
}
}
@Test
@Order(order = 7)
public void updateShouldThrowWebApplicationException1() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
data = this.update(data);
try {
this.updateFrom(this.randomUUID(), data);
assertTrue("Sending wrong 'oid', but is not throw exception", false);
} catch (Exception e) {
assertTrue("wrong 'oid' throw exception", true);
}
this.deleteFrom(data);
}
@Test
@Order(order = 8)
public void updateShouldThrowWebApplicationException2() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
data = this.update(data);
String correctOid = data.getOid();
try {
data.setOid(this.randomUUID());
this.updateFrom(data);
assertTrue("Sending wrong 'oid', but is not throw exception", false);
} catch (Exception e) {
assertTrue("wrong 'oid' throw exception", true);
}
data.setOid(correctOid);
this.deleteFrom(data);
}
@Test
@Order(order = 10)
public void deleteShouldThrowWebApplicationException1() throws Exception {
T data = this.createFrom();
try {
this.deleteFrom(this.randomUUID(), data);
assertTrue("Entity deleted from database. Thats why it can't be exist on database !", false);
} catch (Exception e) {
assertTrue("Entity deleted from database.", true);
this.deleteFrom(data);
}
}
@Test
@Order(order = 11)
public void deleteShouldThrowWebApplicationException2() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
String correctOid = data.getOid();
try {
data.setOid(this.randomUUID());
this.deleteFrom(data);
assertTrue("Entity deleted from database. Thats why it can't be exist on database !", false);
} catch (Exception e) {
assertTrue("Entity deleted from database.", true);
}
data.setOid(correctOid);
this.deleteFrom(data);
}
@Test
@Order(order = 12)
public void mergeShouldThrowWebApplicationException1() throws Exception {
T data = this.createFrom();
this.assertEquals(instance(), data);
T merge = mergeInstance();
try {
merge.setOid(data.getOid());
this.mergeFrom(this.randomUUID(), merge);
assertTrue("Sending wrong 'oid', but is not throw exception", false);
} catch (Exception e) {
assertTrue("wrong 'oid' throw exception", true);
}
this.deleteFrom(data);
}
@Test
@Order(order = 13)
public void mergeShouldThrowWebApplicationException2() throws Exception {
T data = createFrom();
assertEquals(instance(), data);
T merge = mergeInstance();
try {
merge.setOid(this.randomUUID());
this.mergeFrom(merge);
assertTrue("Sending wrong 'oid', but is not throw exception", false);
} catch (Exception e) {
assertTrue("wrong 'oid' throw exception", true);
}
this.deleteFrom(data);
}
protected String randomUUID() {
return UUID.randomUUID().toString();
}
protected T createFrom(T model) throws Exception {
TestResponse response = client.post(getRequestBuilder().entity(model).build());
return response.get(getClazz());
}
protected T createFrom() throws Exception {
return createFrom(instance());
}
protected T deleteFrom(T model) throws Exception {
return deleteFrom(model.getOid(), model);
}
protected T deleteFrom(String oid, T model) throws Exception {
TestResponse response = client.delete(getRequestBuilder().endpoint(oid).entity(model).build());
return response.get(getClazz());
}
protected T updateFrom(T model) throws Exception {
return updateFrom(model.getOid(), model);
}
protected T updateFrom(String oid, T model) throws Exception {
TestResponse response = client.put(getRequestBuilder().endpoint(oid).entity(model).build());
return response.get(getClazz());
}
protected T mergeFrom(T model) throws Exception {
return mergeFrom(model.getOid(), model);
}
protected T mergeFrom(String oid, T model) throws Exception {
TestResponse response = client.patch(getRequestBuilder().endpoint(oid).entity(model).build());
return response.get(getClazz());
}
protected T getFrom(String oid) throws Exception {
TestResponse response = client.get(getRequestBuilder().endpoint(oid).build());
return response.get(getClazz());
}
protected List<T> getAllFrom() throws Exception {
TestResponse response = client.get(getRequestBuilder().build());
return response.list(getClazz());
}
}