package com.sap.pto.testutil;
import static org.eclipse.persistence.config.PersistenceUnitProperties.DDL_GENERATION;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_DRIVER;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_PASSWORD;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_URL;
import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_USER;
import static org.eclipse.persistence.config.PersistenceUnitProperties.LOGGING_LEVEL;
import static org.eclipse.persistence.config.PersistenceUnitProperties.TARGET_SERVER;
import static org.eclipse.persistence.config.PersistenceUnitProperties.TRANSACTION_TYPE;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;
import java.util.TimeZone;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.servlet.ServletContext;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.eclipse.persistence.config.TargetServer;
import org.eclipse.persistence.logging.SessionLog;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.BeforeClass;
import com.google.gson.Gson;
import com.sap.pto.adapters.PersistenceAdapter;
import com.sap.pto.dao.CompetitionDAO;
import com.sap.pto.dao.ConfigDAO;
import com.sap.pto.dao.EditorialDAO;
import com.sap.pto.dao.FixtureDAO;
import com.sap.pto.dao.GoalDAO;
import com.sap.pto.dao.LeagueDAO;
import com.sap.pto.dao.LeagueMemberDAO;
import com.sap.pto.dao.PlayerDAO;
import com.sap.pto.dao.PlayerStatDAO;
import com.sap.pto.dao.PredictionDAO;
import com.sap.pto.dao.SeasonDAO;
import com.sap.pto.dao.TeamDAO;
import com.sap.pto.dao.TeamOfficialDAO;
import com.sap.pto.dao.TeamStatDAO;
import com.sap.pto.dao.UserDAO;
import com.sap.pto.dao.entities.Fixture;
import com.sap.pto.dao.entities.Team;
import com.sap.pto.dao.entities.User;
import com.sap.pto.importers.OptaMatchImporter;
import com.sap.pto.importers.OptaTeamImporter;
import com.sap.pto.startup.AppInitializer;
import com.sap.pto.util.MiscUtils;
/**
* Utility class providing commonly used test helper functions and mocks.
*
*/
@SuppressWarnings({ "nls" })
public abstract class PTOTest {
protected User simpleUser = new User("testuser", "testuser@test.com");
protected HttpServletRequestMock requestMock = new HttpServletRequestMock(simpleUser);
protected ServletContext contextMock = new ServletContextMock();
protected Gson gson = new Gson();
private static final String DB_PASSWORD = "";
private static final String DB_USER = "";
private static final String DB_DRIVER = "org.apache.derby.jdbc.ClientDriver";
private static final String DB_CONN = "jdbc:derby:memory:PtoDB";
private static final String DB_DDL = "drop-and-create-tables";
protected Team team1;
protected Team team2;
protected Team team3;
protected Team team4;
protected DateTime testDay;
protected Fixture fixture1_2;
protected Fixture fixture3_4;
public void prepareTest() throws Exception {
deleteAllDBEntries();
AppInitializer.initDefaultUsers();
UserDAO.saveNew(simpleUser);
System.getProperties().setProperty("net.fortuna.ical4j.timezone.update.enabled", "false");
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
DateTimeZone.setDefault(DateTimeZone.UTC);
AppInitializer.initConfiguration();
testDay = new DateTime(2012, 8, 17, 10, 0, 0);
}
protected void setupSampleData() {
// setup basic sample data
team1 = new Team("1");
team2 = new Team("2");
team3 = new Team("3");
team4 = new Team("4");
TeamDAO.saveNew(team1);
TeamDAO.saveNew(team2);
TeamDAO.saveNew(team3);
TeamDAO.saveNew(team4);
fixture1_2 = new Fixture(testDay.withHourOfDay(20).toDate(), team1, team2);
fixture3_4 = new Fixture(testDay.withHourOfDay(21).toDate(), team3, team4);
FixtureDAO.saveNew(fixture1_2);
FixtureDAO.saveNew(fixture3_4);
}
@BeforeClass
public static void initDBConnection() {
if (PersistenceAdapter.getService() == null) {
createEMF(";create=true");
}
}
private void deleteAllDBEntries() {
// this order is intentionally since there are some dependencies which are not managed by JPA currently
new EditorialDAO().deleteAll();
new PredictionDAO().deleteAll();
new TeamOfficialDAO().deleteAll();
new GoalDAO().deleteAll();
new PlayerStatDAO().deleteAll();
new PlayerDAO().deleteAll();
new FixtureDAO().deleteAll();
new TeamStatDAO().deleteAll();
new LeagueMemberDAO().deleteAll();
new LeagueDAO().deleteAll();
new TeamDAO().deleteAll();
new CompetitionDAO().deleteAll();
new SeasonDAO().deleteAll();
new UserDAO().deleteAll();
new ConfigDAO().deleteAll();
}
private static void createEMF(String command) {
Properties props = getJPAProperties();
props.put(JDBC_URL, props.get(JDBC_URL) + command);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pto", props);
PersistenceAdapter.setService(emf);
PersistenceAdapter.getEntityManager();
}
private static Properties getJPAProperties() {
Properties properties = new Properties();
properties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
properties.put(JDBC_DRIVER, DB_DRIVER);
properties.put(JDBC_URL, DB_CONN);
properties.put(JDBC_USER, DB_USER);
properties.put(JDBC_PASSWORD, DB_PASSWORD);
properties.put(LOGGING_LEVEL, SessionLog.INFO_LABEL);
properties.put(TARGET_SERVER, TargetServer.None);
properties.put(DDL_GENERATION, DB_DDL);
return properties;
}
protected void assertResponseOK(Response response) {
assertEquals(Status.OK.getStatusCode(), response.getStatus());
}
protected void importTeams() throws URISyntaxException, IOException {
URI results = MiscUtils.getResource("opta/srml-5-2012-squads.xml").toURI();
new OptaTeamImporter().importData(results);
}
protected void importMatches() throws URISyntaxException, IOException {
URI results = MiscUtils.getResource("opta/srml-5-2012-results.xml").toURI();
new OptaMatchImporter().importData(results);
}
}