package org.webpieces.webserver.json; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.webpieces.httpcommon.Requests; import org.webpieces.httpcommon.api.RequestId; import org.webpieces.httpcommon.api.RequestListener; import org.webpieces.httpparser.api.common.Header; import org.webpieces.httpparser.api.common.KnownHeaderName; import org.webpieces.httpparser.api.dto.HttpRequest; import org.webpieces.httpparser.api.dto.KnownHttpMethod; import org.webpieces.httpparser.api.dto.KnownStatusCode; import org.webpieces.util.file.VirtualFileClasspath; import org.webpieces.webserver.ResponseExtract; import org.webpieces.webserver.WebserverForTest; import org.webpieces.webserver.test.FullResponse; import org.webpieces.webserver.test.MockResponseSender; import org.webpieces.webserver.test.PlatformOverridesForTest; public class TestJson { private RequestListener server; private MockResponseSender socket = new MockResponseSender(); @Before public void setUp() { VirtualFileClasspath metaFile = new VirtualFileClasspath("jsonMeta.txt", WebserverForTest.class.getClassLoader()); WebserverForTest webserver = new WebserverForTest(new PlatformOverridesForTest(), null, false, metaFile); server = webserver.start(); } @Test public void testAsyncJsonGet() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.GET, "/json/async/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("{`searchTime`:8,`matches`:[`match1`,`match2`]}".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testAsyncBadJsonGet() { HttpRequest req = Requests.createBadJsonRequest(KnownHttpMethod.GET, "/json/async/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_400_BADREQUEST); response.assertContains("{`error`:`invalid json in client request. Unexpected character ('c' (code 99)): was expecting a colon to separate field name and value".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testAsyncJsonPost() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.POST, "/json/async/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("{`searchTime`:98,`matches`:[`match1`,`match2`]}".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testAsyncWriteOnlyPost() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.POST, "/json/writeasync"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); Assert.assertEquals("", response.getBodyAsString()); } @Test public void testAsyncBadJsonPost() { HttpRequest req = Requests.createBadJsonRequest(KnownHttpMethod.POST, "/json/async/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_400_BADREQUEST); response.assertContains("{`error`:`invalid json in client request. Unexpected character ('c' (code 99)): was expecting a colon to separate field name and value".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testSyncJsonGet() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.GET, "/json/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("{`searchTime`:5,`matches`:[`match1`,`match2`]}".replace("`", "\"")); response.assertContentType("application/json"); } //had a bug on this one so add a test @Test public void testSimulateCurl() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.GET, "/json/45"); req.addHeader(new Header(KnownHeaderName.CONTENT_TYPE, "application/x-www-form-urlencoded")); req.addHeader(new Header(KnownHeaderName.CONTENT_LENGTH, ""+req.getBody().getReadableSize())); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("{`searchTime`:5,`matches`:[`match1`,`match2`]}".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testSyncBadJsonGet() { HttpRequest req = Requests.createBadJsonRequest(KnownHttpMethod.GET, "/json/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_400_BADREQUEST); response.assertContains("{`error`:`invalid json in client request. Unexpected character ('c' (code 99)): was expecting a colon to separate field name and value".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testSyncJsonPost() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.POST, "/json/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("{`searchTime`:99,`matches`:[`match1`,`match2`]}".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testSyncWriteOnlyPost() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.POST, "/json/write"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); Assert.assertEquals("", response.getBodyAsString()); } @Test public void testSyncBadJsonPost() { HttpRequest req = Requests.createBadJsonRequest(KnownHttpMethod.POST, "/json/45"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_400_BADREQUEST); response.assertContains("{`error`:`invalid json in client request. Unexpected character ('c' (code 99)): was expecting a colon to separate field name and value".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testNotFoundInJsonUrls() { HttpRequest req = Requests.createBadJsonRequest(KnownHttpMethod.POST, "/json/some/notexist/route"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_404_NOTFOUND); response.assertContains("{`error`:`This url has no api. try another url`,`code`:0}".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testNotFoundInHtmlUrls() { HttpRequest req = Requests.createBadJsonRequest(KnownHttpMethod.POST, "/html"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_404_NOTFOUND); response.assertContains("Your page was not found"); response.assertContentType("text/html; charset=utf-8"); } @Test public void testRouteParamConversionFail() { HttpRequest req = Requests.createBadJsonRequest(KnownHttpMethod.POST, "/json/somenotexistroute"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_404_NOTFOUND); //clearly this url has nothing there response.assertContains("{`error`:`This url has no api. try another url`,`code`:0}".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testControllerThrowsNotFound() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.GET, "/json/throw/333"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_404_NOTFOUND); //clearly this url has nothing there response.assertContains("{`error`:`This url has no api. try another url`,`code`:0}".replace("`", "\"")); response.assertContentType("application/json"); } @Test public void testReadOnly() { HttpRequest req = Requests.createJsonRequest(KnownHttpMethod.GET, "/json/read"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("{`searchTime`:1,`matches`:[]}".replace("`", "\"")); response.assertContentType("application/json"); } }