package net.rrm.ehour.it;
import net.rrm.ehour.persistence.database.SpringContext;
import net.rrm.ehour.persistence.hibernate.HibernateCache;
import org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.orm.hibernate4.SessionFactoryUtils;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import javax.sql.DataSource;
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.TimeUnit;
public abstract class AbstractScenario {
public static final String BASE_URL = "http://localhost:18000";
public static RemoteWebDriver Driver;
public static DataSource dataSource;
private static boolean initialized = false;
@Rule
public ScreenshotTestRule screenshotTestRule;
private static SessionFactory sessionFactory;
@Before
public void setUp() throws Exception {
if (!initialized) {
createInMemoryDb();
EhourTestApplication.start();
sessionFactory = SpringContext.getApplicationContext().getBean(SessionFactory.class);
dataSource = SessionFactoryUtils.getDataSource(sessionFactory);
}
Driver = new FirefoxDriver();
Driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
screenshotTestRule = new ScreenshotTestRule(Driver);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
quitBrowser();
}
});
clearDatabase();
initialized = true;
}
private void createInMemoryDb() throws SQLException {
EmbeddedConnectionPoolDataSource csDataSource = new EmbeddedConnectionPoolDataSource();
csDataSource.setDatabaseName("memory:ehourDb;create=true");
csDataSource.getPooledConnection().close();
}
protected void clearDatabase() throws SQLException {
DatabaseTruncater.truncate(dataSource);
HibernateCache.clearHibernateCache(sessionFactory);
}
protected final void preloadDatabase(String dataSetFileName) throws Exception {
Connection con = DataSourceUtils.getConnection(dataSource);
IDatabaseConnection connection = new DatabaseConnection(con);
FlatXmlDataSet additionalDataSet = new FlatXmlDataSetBuilder().build(new File("src/test/resources/datasets/" + dataSetFileName));
DatabaseOperation.INSERT.execute(connection, additionalDataSet);
}
protected final void updatePassword(String username, String password) throws SQLException {
ShaPasswordEncoder passwordEncoder = new ShaPasswordEncoder(1);
int salt = (int) (Math.random() * 10000);
String encodedPassword = passwordEncoder.encodePassword(password, salt);
Connection connection = dataSource.getConnection();
String sql = String.format("UPDATE USERS SET PASSWORD = '%s', SALT = %d WHERE USERNAME = '%s'", encodedPassword, salt, username);
try (Statement statement = connection.createStatement()) {
statement.execute(sql);
}
}
@After
public void quitBrowser() {
if (Driver != null) {
try {
if (isTruncateBetweenTests())
clearDatabase();
Driver.quit();
} catch (Exception e) {
//
}
}
}
protected boolean isTruncateBetweenTests() {
return true;
}
}