package org.webpieces.plugins.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
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.dto.HttpRequest;
import org.webpieces.httpparser.api.dto.KnownHttpMethod;
import org.webpieces.httpparser.api.dto.KnownStatusCode;
import org.webpieces.plugins.hibernate.app.HibernateAppMeta;
import org.webpieces.plugins.hibernate.app.ServiceToFailMock;
import org.webpieces.plugins.hibernate.app.dbo.LevelEducation;
import org.webpieces.plugins.hibernate.app.dbo.UserTestDbo;
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;
public class TestSyncHibernate {
private MockResponseSender socket = new MockResponseSender();
private RequestListener server;
private ServiceToFailMock mock = new ServiceToFailMock();
@Before
public void setUp() {
//clear in-memory database
JdbcApi jdbc = JdbcFactory.create(JdbcConstants.jdbcUrl, JdbcConstants.jdbcUser, JdbcConstants.jdbcPassword);
jdbc.dropAllTablesFromDatabase();
VirtualFileClasspath metaFile = new VirtualFileClasspath("plugins/hibernateMeta.txt", WebserverForTest.class.getClassLoader());
TestConfig config = new TestConfig();
config.setPlatformOverrides(new PlatformOverridesForTest());
config.setMetaFile(metaFile);
config.setAppOverrides(new TestModule(mock));
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);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER);
return response.getRedirectUrl();
}
private void readBean(String redirectUrl, String email) {
HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, redirectUrl);
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_200_OK);
response.assertContains("name=SomeName email="+email);
}
@Test
public void testSyncWithFilter() {
String redirectUrl = saveBean("/save");
readBean(redirectUrl, "dean@sync.xsoftware.biz");
}
/**
* Tests when we load user but not company, user.company.name will blow up since company was not
* loaded in the controller from the database.
*
* (ie. we only let you traverse the loaded graph so that we don't accidentally have 1+N queries running)
*/
@Test
public void testDbUseWhileRenderingPage() {
Integer id = loadDataInDb().getId();
verifyLazyLoad(id);
HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/dynamic/"+id);
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_500_INTERNAL_SVR_ERROR);
}
public static UserTestDbo loadDataInDb() {
String email = "dean2@sync.xsoftware.biz";
//populate database....
EntityManagerFactory factory = Persistence.createEntityManagerFactory(HibernateAppMeta.PERSISTENCE_TEST_UNIT);
EntityManager mgr = factory.createEntityManager();
EntityTransaction tx = mgr.getTransaction();
tx.begin();
UserTestDbo manager = new UserTestDbo();
manager.setEmail("asdf@asf.com");
manager.setName("somadsf");
UserTestDbo user = new UserTestDbo();
user.setEmail(email);
user.setName("SomeName");
user.setFirstName("Dean");
user.setLastName("Hill");
user.setManager(manager);
mgr.persist(manager);
mgr.persist(user);
mgr.flush();
tx.commit();
return user;
}
public static void verifyLazyLoad(int id) {
//verify lazy load is working so we know test is testing what it should be
EntityManagerFactory factory = Persistence.createEntityManagerFactory(HibernateAppMeta.PERSISTENCE_TEST_UNIT);
EntityManager mgr = factory.createEntityManager();
EntityTransaction tx = mgr.getTransaction();
tx.begin();
UserTestDbo user = mgr.find(UserTestDbo.class, id);
UserTestDbo manager = user.getManager();
Assert.assertEquals("somadsf", manager.getName());
mgr.flush();
tx.commit();
}
@Test
public void testReverseAddAndEditFromRouteId() {
loadDataInDb();
HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/user/list");
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_200_OK);
response.assertContains("<a href=`/user/new`>Add User</a>".replace("`", "\""));
response.assertContains("<a href=`/user/edit/1`>Edit</a>".replace("`", "\""));
}
@Test
public void testRenderAddPage() {
HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/user/new");
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_200_OK);
response.assertContains("name='' email=''");
}
@Test
public void testRenderEditPage() {
int id = loadDataInDb().getId();
HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/user/edit/"+id);
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_200_OK);
response.assertContains("name='SomeName' email='dean2@sync.xsoftware.biz'");
}
@Test
public void testHibernatePostPartialDataDoesntBlowDataAway() {
UserTestDbo user = loadDataInDb();
HttpRequest req = Requests.createPostRequest("/testmerge",
"user.id", user.getId()+"",
"user.name", "blah1",
"user.firstName", "blah2");
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER);
UserTestDbo user2 = load(user.getId());
Assert.assertEquals("blah1", user2.getName()); //name changed
Assert.assertEquals("blah2", user2.getFirstName()); //firstname changed
Assert.assertEquals(user.getLastName(), user2.getLastName()); //lastname remained the same
}
@Test
public void testHibernateNoUserIdWillSaveNewUser() {
String email = "test2";
HttpRequest req = Requests.createPostRequest("/testmerge",
"user.id", "",
"user.email", email,
"user.name", "blah1",
"user.firstName", "blah2",
"user.levelOfEducation", LevelEducation.COLLEGE.getDbCode()+"");
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER);
UserTestDbo user2 = loadByEmail(email);
Assert.assertEquals("blah1", user2.getName()); //name changed
Assert.assertEquals("blah2", user2.getFirstName()); //firstname changed
Assert.assertEquals(LevelEducation.COLLEGE, user2.getLevelOfEducation());
}
@Test
public void testHibernateNoUserIdParamWillSaveNewUser() {
String email = "test1";
HttpRequest req = Requests.createPostRequest("/testmerge",
"user.email", email,
"user.name", "blah1",
"user.firstName", "blah2");
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_303_SEEOTHER);
UserTestDbo user2 = loadByEmail(email);
Assert.assertEquals("blah1", user2.getName()); //name changed
Assert.assertEquals("blah2", user2.getFirstName()); //firstname changed
}
@Test
public void testRollback() {
HttpRequest req = Requests.createRequest(KnownHttpMethod.GET, "/fail");
mock.addException(() -> {throw new RuntimeException("for test");});
server.incomingRequest(req, new RequestId(0), true, socket);
FullResponse response = ResponseExtract.assertSingleResponse(socket);
response.assertStatusCode(KnownStatusCode.HTTP_500_INTERNAL_SVR_ERROR);
Assert.assertEquals(2, TransactionFilter.getState());
}
private UserTestDbo loadByEmail(String email) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory(HibernateAppMeta.PERSISTENCE_TEST_UNIT);
EntityManager mgr = factory.createEntityManager();
EntityTransaction tx = mgr.getTransaction();
tx.begin();
UserTestDbo user = UserTestDbo.findByEmailId(mgr, email);
tx.commit();
return user;
}
private UserTestDbo load(Integer id) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory(HibernateAppMeta.PERSISTENCE_TEST_UNIT);
EntityManager mgr = factory.createEntityManager();
EntityTransaction tx = mgr.getTransaction();
tx.begin();
UserTestDbo user = mgr.find(UserTestDbo.class, id);
tx.commit();
return user;
}
@Test
public void testOptimisticLock() {
}
}