package integration.api.json;
import integration.TestVerticle;
import integration.VertxNubesTestBase;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import mock.domains.Dog;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import static io.vertx.core.http.HttpHeaders.ACCEPT;
import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE;
public class JsonApiTest extends VertxNubesTestBase {
@Test
public void noContentType(TestContext context) {
Async async = context.async();
client().getNow("/json/dog", response -> {
context.assertEquals(406, response.statusCode());
async.complete();
});
}
@Test
public void wrongContentType(TestContext context) {
Async async = context.async();
client().get("/json/dog", response -> {
context.assertEquals(406, response.statusCode());
response.bodyHandler(buff -> {
context.assertEquals("Not acceptable", buff.toString("UTF-8"));
async.complete();
});
}).putHeader(ACCEPT, "yourmum").end();
}
@Test
public void getJsonObject(TestContext context) {
Async async = context.async();
getJSON("/json/jsonobject", response -> {
context.assertEquals(200, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buffer -> {
JsonObject json = new JsonObject(buffer.toString("UTF-8"));
context.assertNotNull(json);
context.assertEquals(json.getString("Bill"), "Cocker");
async.complete();
});
});
}
@Test
public void getJsonArray(TestContext context) {
Async async = context.async();
getJSON("/json/jsonarray", response -> {
context.assertEquals(200, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buffer -> {
JsonArray json = new JsonArray(buffer.toString("UTF-8"));
context.assertNotNull(json);
context.assertEquals(json.getJsonObject(0).getString("Bill"), "Cocker");
async.complete();
});
});
}
@Test
public void getMap(TestContext context) {
Async async = context.async();
getJSON("/json/map", response -> {
context.assertEquals(200, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buffer -> {
JsonObject json = new JsonObject(buffer.toString("UTF-8"));
context.assertNotNull(json);
context.assertEquals(json.getString("Snoopy"), "Beagle");
context.assertEquals(json.getString("Bill"), "Cocker");
async.complete();
});
});
}
@Test
@SuppressWarnings("rawtypes")
public void getArray(TestContext context) {
Async async = context.async();
getJSON("/json/array", response -> {
context.assertEquals(200, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buffer -> {
JsonArray json = new JsonArray(buffer.toString("UTF-8"));
context.assertNotNull(json);
List list = json.getList();
context.assertEquals(list.get(0), "Snoopy");
context.assertEquals(list.get(1), "Bill");
async.complete();
});
});
}
@Test
public void getDomainObject(TestContext context) {
Async async = context.async();
getJSON("/json/dog", response -> {
context.assertEquals(200, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buffer -> {
JsonObject json = new JsonObject(buffer.toString("UTF-8"));
context.assertNotNull(json);
context.assertEquals(json.getString("name"), "Snoopy");
context.assertEquals(json.getString("breed"), "Beagle");
async.complete();
});
});
}
@Test
@SuppressWarnings("rawtypes")
public void getDomainObjects(TestContext context) {
Async async = context.async();
getJSON("/json/dogs", response -> {
context.assertEquals(200, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buffer -> {
JsonArray json = new JsonArray(buffer.toString("UTF-8"));
context.assertNotNull(json);
List list = json.getList();
context.assertEquals(((Map) list.get(0)).get("name"), "Snoopy");
context.assertEquals(((Map) list.get(0)).get("breed"), "Beagle");
context.assertEquals(((Map) list.get(1)).get("name"), "Bill");
context.assertEquals(((Map) list.get(1)).get("breed"), "Cocker");
async.complete();
});
});
}
@Test
public void postSomeStuff(TestContext context) {
Dog dog = TestVerticle.dogService.someDog();
JsonObject dogJson = new JsonObject();
dogJson.put("name", dog.getName());
dogJson.put("breed", dog.getBreed());
Async async = context.async();
sendJSON("/json/postdog", dogJson, response -> {
context.assertEquals(200, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buffer -> {
String json = buffer.toString("UTF-8");
JsonObject receivedDog = new JsonObject(json);
context.assertEquals(dog.getName(), receivedDog.getString("name"));
context.assertEquals(dog.getBreed(), receivedDog.getString("breed"));
async.complete();
});
});
}
@Test
public void testMarshalledError(TestContext context) {
Async async = context.async();
getJSON("/json/exception", response -> {
context.assertEquals(500, response.statusCode());
context.assertEquals("application/json", response.getHeader(CONTENT_TYPE));
response.bodyHandler(buff -> {
JsonObject json = new JsonObject(buff.toString());
String msg = json.getJsonObject("error").getString("message");
context.assertNotNull(msg);
context.assertTrue(msg.startsWith("Exception : Manually thrown exception"));
async.complete();
});
});
}
@Test
public void test400(TestContext context) {
testError(context, 400, "Bad request");
}
@Test
public void test401(TestContext context) {
testError(context, 401, "Unauthorized");
}
@Test
public void test403(TestContext context) {
testError(context, 403, "Forbidden");
}
@Test
public void test404(TestContext context) {
testError(context, 404, "Not found");
}
@Test
public void test406(TestContext context) {
testError(context, 406, "Not acceptable");
}
@Test
public void test420(TestContext context) {
testError(context, 420, "Rate limitation exceeded");
}
@Test
public void test500(TestContext context) {
testError(context, 500, "Internal server error");
}
@Test
public void test503(TestContext context) {
testError(context, 503, "Service temporarily unavailable");
}
private void testError(TestContext context, Integer statusCode, String expectedMessage) {
Async async = context.async();
getJSON("/json/fail/" + statusCode, response -> {
context.assertEquals(statusCode, response.statusCode());
response.bodyHandler(buff -> {
JsonObject json = new JsonObject(buff.toString());
JsonObject error = json.getJsonObject("error");
context.assertEquals(statusCode, error.getInteger("code"));
context.assertEquals(expectedMessage, error.getString("message"));
async.complete();
});
});
}
}