package org.webpieces.webserver.scopes; 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 TestScopes { private RequestListener server; private MockResponseSender socket = new MockResponseSender(); @Before public void setUp() { VirtualFileClasspath metaFile = new VirtualFileClasspath("scopesMeta.txt", WebserverForTest.class.getClassLoader()); WebserverForTest webserver = new WebserverForTest(new PlatformOverridesForTest(), null, false, metaFile); server = webserver.start(); } @Test public void testSessionScope() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/home"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("age=30"); response.assertContains("result=true"); response.assertContains("name=Dean"); } @Test public void testSessionScopeModificationByClient() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/home"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("age=30"); Header cookie = response.getResponse().getHeaderLookupStruct().getHeader(KnownHeaderName.SET_COOKIE); String value = cookie.getValue(); value = value.replace("age=30", "age=60"); value = value.replace("; path=/; HttpOnly", ""); //modify cookie and rerequest... HttpRequest req2 = Requests.createRequest(KnownHttpMethod.GET, "/displaySession"); req2.addHeader(new Header(KnownHeaderName.COOKIE, value)); server.incomingRequest(req2, new RequestId(0), true, socket); response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER); Header cookie2 = response.getResponse().getHeaderLookupStruct().getHeader(KnownHeaderName.SET_COOKIE); String deleteCookie = cookie2.getValue(); Assert.assertEquals("webSession=; Max-Age=0; path=/; HttpOnly", deleteCookie); Header header = response.getResponse().getHeaderLookupStruct().getHeader(KnownHeaderName.LOCATION); String url = header.getValue(); Assert.assertEquals("http://myhost.com/displaySession", url); } @Test public void testFlashMessage() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/flashmessage"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("Msg: it worked"); } @Test public void testGetStaticFileDoesNotClearFlashMessage() { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/flashmessage"); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); Header header = response.createCookieRequestHeader(); HttpRequest req2 = Requests.createRequest(KnownHttpMethod.GET, "/public/fonts.css"); req2.addHeader(header); server.incomingRequest(req2, new RequestId(0), true, socket); FullResponse response2 = ResponseExtract.assertSingleResponse(socket); response2.assertStatusCode(KnownStatusCode.HTTP_200_OK); Header cookie = response2.getResponse().getHeaderLookupStruct().getHeader(KnownHeaderName.SET_COOKIE); Assert.assertNull("static routes should not be clearing cookies or things go south", cookie); } //A basic POST form with invalid field, redirect to error page and load AND THEN //POST form with valid data and expect success redirect //This tests out the Validation scoped cookie @Test public void testValidationErrorDoesNotPersist() { //POST first resulting in redirect with errors //RENDER page WITH errors, verify errors are there //POST again with valid data and verify POST succeeds FullResponse response1 = runInvalidPost(); FullResponse response2 = runGetUserFormWithErrors(response1); Header header = response2.createCookieRequestHeader(); HttpRequest req = Requests.createPostRequest("/user/post", "user.id", "", "user.firstName", "Dean", //valid firstname "user.lastName", "Hiller", "user.fullName", "Dean Hiller", "user.address.zipCode", "555", "user.address.street", "Coolness Dr."); req.addHeader(header); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER); Assert.assertEquals("http://myhost.com/user/list", response.getRedirectUrl()); } private FullResponse runInvalidPost() { HttpRequest req = Requests.createPostRequest("/user/post", "user.firstName", "D", //invalid first name "user.lastName", "Hiller", "user.fullName", "Dean Hiller", "user.address.zipCode", "555", "user.address.street", "Coolness Dr."); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER); return response; } private FullResponse runGetUserFormWithErrors(FullResponse response1) { Assert.assertEquals("http://myhost.com/user/new", response1.getRedirectUrl()); HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/user/new"); Header cookieHeader = response1.createCookieRequestHeader(); req.addHeader(cookieHeader); server.incomingRequest(req, new RequestId(0), true, socket); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("First name must be more than 2 characters"); return response; } }