package org.webpieces.plugins.hibernate; import java.util.List; import java.util.concurrent.Executor; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.webpieces.ddl.api.JdbcApi; import org.webpieces.ddl.api.JdbcConstants; import org.webpieces.ddl.api.JdbcFactory; 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.mock.lib.MockExecutor; import org.webpieces.plugins.hibernate.app.ServiceToFail; import org.webpieces.plugins.hibernate.app.ServiceToFailMock; import org.webpieces.util.file.VirtualFileClasspath; import org.webpieces.webserver.ResponseExtract; import org.webpieces.webserver.TestConfig; import org.webpieces.webserver.WebserverForTest; import org.webpieces.webserver.test.FullResponse; import org.webpieces.webserver.test.MockResponseSender; import org.webpieces.webserver.test.PlatformOverridesForTest; import com.google.inject.Binder; import com.google.inject.Module; public class TestAsyncHibernate { private MockResponseSender socket = new MockResponseSender(); private RequestListener server; private MockExecutor mockExecutor = new MockExecutor(); @Before public void setUp() { //clear in-memory database JdbcApi jdbc = JdbcFactory.create(JdbcConstants.jdbcUrl, JdbcConstants.jdbcUser, JdbcConstants.jdbcPassword); jdbc.dropAllTablesFromDatabase(); mockExecutor.clear(); VirtualFileClasspath metaFile = new VirtualFileClasspath("plugins/hibernateMeta.txt", WebserverForTest.class.getClassLoader()); TestConfig config = new TestConfig(); config.setPlatformOverrides(new PlatformOverridesForTest()); config.setAppOverrides(new TestOverrides()); config.setMetaFile(metaFile); WebserverForTest webserver = new WebserverForTest(config); server = webserver.start(); } private String saveBean(String path) { HttpRequest req = Requests.createRequest(KnownHttpMethod.POST, path); server.incomingRequest(req, new RequestId(0), true, socket); List<FullResponse> responses1 = socket.getResponses(); Assert.assertEquals(0, responses1.size()); List<Runnable> runnables = mockExecutor.getRunnablesScheduled(); runnables.get(0).run(); mockExecutor.clear(); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER); Header header = response.getResponse().getHeaderLookupStruct().getHeader(KnownHeaderName.LOCATION); String url = header.getValue(); return url; } private void readBean(String redirectUrl, String email) { HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, redirectUrl); server.incomingRequest(req, new RequestId(0), true, socket); List<FullResponse> responses1 = socket.getResponses(); Assert.assertEquals(0, responses1.size()); List<Runnable> runnables = mockExecutor.getRunnablesScheduled(); runnables.get(0).run(); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_200_OK); response.assertContains("name=SomeName email="+email); } @Test public void testAsyncWithFilter() { String redirectUrl = saveBean("/async/save"); readBean(redirectUrl, "dean@async.xsoftware.biz"); } /** * Tests when we load user but not company, user.company.name in the page will blow up. * Database loads must be done in the controllers * */ @Test public void testDbUseWhileRenderingPage() { Integer id = TestSyncHibernate.loadDataInDb().getId(); TestSyncHibernate.verifyLazyLoad(id); HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/async/dynamic/"+id); server.incomingRequest(req, new RequestId(0), true, socket); List<FullResponse> responses1 = socket.getResponses(); Assert.assertEquals(0, responses1.size()); List<Runnable> runnables = mockExecutor.getRunnablesScheduled(); runnables.get(0).run(); FullResponse response = ResponseExtract.assertSingleResponse(socket); response.assertStatusCode(KnownStatusCode.HTTP_500_INTERNAL_SVR_ERROR); } @Test public void testOptimisticLock() { } private class TestOverrides implements Module { @Override public void configure(Binder binder) { binder.bind(Executor.class).toInstance(mockExecutor); binder.bind(ServiceToFail.class).toInstance(new ServiceToFailMock()); } } }