Files
Athou_commafeed/commafeed-server/src/test/java/com/commafeed/CommaFeedDropwizardAppExtension.java

126 lines
5.2 KiB
Java
Raw Normal View History

2023-08-23 20:21:45 +02:00
package com.commafeed;
import java.io.IOException;
import java.io.InputStream;
2023-08-23 20:21:45 +02:00
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
2023-08-23 20:21:45 +02:00
import javax.sql.DataSource;
2024-04-14 16:49:26 +02:00
import org.mockserver.socket.PortFactory;
2024-07-03 10:41:01 +02:00
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.JdbcDatabaseContainer;
import org.testcontainers.containers.MariaDBContainer;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.containers.PostgreSQLContainer;
2024-07-03 10:41:01 +02:00
import org.testcontainers.utility.DockerImageName;
2024-04-14 16:49:26 +02:00
2023-08-23 20:21:45 +02:00
import com.codahale.metrics.MetricRegistry;
2024-07-03 10:41:01 +02:00
import com.commafeed.CommaFeedConfiguration.CacheType;
2023-08-23 20:21:45 +02:00
2024-04-14 16:49:26 +02:00
import io.dropwizard.testing.ConfigOverride;
2023-08-23 20:21:45 +02:00
import io.dropwizard.testing.ResourceHelpers;
import io.dropwizard.testing.junit5.DropwizardAppExtension;
2024-07-03 10:41:01 +02:00
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
2023-08-23 20:21:45 +02:00
public class CommaFeedDropwizardAppExtension extends DropwizardAppExtension<CommaFeedConfiguration> {
private static final String TEST_DATABASE = System.getenv().getOrDefault("TEST_DATABASE", "h2");
2024-07-03 10:41:01 +02:00
private static final boolean REDIS_ENABLED = Boolean.parseBoolean(System.getenv().getOrDefault("REDIS", "false"));
private static final ConfigOverride[] CONFIG_OVERRIDES;
private static final List<String> DROP_ALL_STATEMENTS;
static {
List<ConfigOverride> overrides = new ArrayList<>();
overrides.add(ConfigOverride.config("server.applicationConnectors[0].port", String.valueOf(PortFactory.findFreePort())));
2024-07-03 10:41:01 +02:00
Properties imageNames = readProperties("/docker-images.properties");
DatabaseConfiguration config = buildConfiguration(TEST_DATABASE, imageNames.getProperty(TEST_DATABASE));
JdbcDatabaseContainer<?> container = config.container();
if (container != null) {
container.withDatabaseName("commafeed");
container.withEnv("TZ", "UTC");
container.start();
overrides.add(ConfigOverride.config("database.url", container.getJdbcUrl()));
overrides.add(ConfigOverride.config("database.user", container.getUsername()));
overrides.add(ConfigOverride.config("database.password", container.getPassword()));
overrides.add(ConfigOverride.config("database.driverClass", container.getDriverClassName()));
}
2024-07-03 10:41:01 +02:00
if (REDIS_ENABLED) {
GenericContainer<?> redis = new GenericContainer<>(DockerImageName.parse(imageNames.getProperty("redis")))
.withExposedPorts(6379);
redis.start();
overrides.add(ConfigOverride.config("app.cache", "redis"));
overrides.add(ConfigOverride.config("redis.host", redis.getHost()));
overrides.add(ConfigOverride.config("redis.port", redis.getMappedPort(6379).toString()));
}
CONFIG_OVERRIDES = overrides.toArray(new ConfigOverride[0]);
DROP_ALL_STATEMENTS = config.dropAllStatements();
}
2023-08-23 20:21:45 +02:00
public CommaFeedDropwizardAppExtension() {
super(CommaFeedApplication.class, ResourceHelpers.resourceFilePath("config.test.yml"), CONFIG_OVERRIDES);
}
2024-07-03 10:41:01 +02:00
private static DatabaseConfiguration buildConfiguration(String databaseName, String imageName) {
if ("postgresql".equals(databaseName)) {
JdbcDatabaseContainer<?> container = new PostgreSQLContainer<>(imageName).withTmpFs(Map.of("/var/lib/postgresql/data", "rw"));
return new DatabaseConfiguration(container, List.of("DROP SCHEMA public CASCADE", "CREATE SCHEMA public"));
} else if ("mysql".equals(databaseName)) {
JdbcDatabaseContainer<?> container = new MySQLContainer<>(imageName).withTmpFs(Map.of("/var/lib/mysql", "rw"));
return new DatabaseConfiguration(container, List.of("DROP DATABASE IF EXISTS commafeed", " CREATE DATABASE commafeed"));
} else if ("mariadb".equals(databaseName)) {
JdbcDatabaseContainer<?> container = new MariaDBContainer<>(imageName).withTmpFs(Map.of("/var/lib/mysql", "rw"));
return new DatabaseConfiguration(container, List.of("DROP DATABASE IF EXISTS commafeed", " CREATE DATABASE commafeed"));
} else {
// h2
return new DatabaseConfiguration(null, List.of("DROP ALL OBJECTS"));
}
2023-08-23 20:21:45 +02:00
}
2024-07-03 10:41:01 +02:00
private static Properties readProperties(String path) {
Properties properties = new Properties();
try (InputStream is = CommaFeedDropwizardAppExtension.class.getResourceAsStream(path)) {
properties.load(is);
} catch (IOException e) {
throw new RuntimeException("could not read resource " + path, e);
}
return properties;
}
2023-08-23 20:21:45 +02:00
@Override
public void after() {
super.after();
// clean database after each test
DataSource dataSource = getConfiguration().getDataSourceFactory().build(new MetricRegistry(), "cleanup");
try (Connection connection = dataSource.getConnection()) {
for (String statement : DROP_ALL_STATEMENTS) {
connection.prepareStatement(statement).executeUpdate();
}
2023-08-23 20:21:45 +02:00
} catch (SQLException e) {
throw new RuntimeException("could not cleanup database", e);
}
2024-07-03 10:41:01 +02:00
// clean redis cache after each test
if (getConfiguration().getApplicationSettings().getCache() == CacheType.REDIS) {
try (JedisPool pool = getConfiguration().getRedisPoolFactory().build(); Jedis jedis = pool.getResource()) {
jedis.flushAll();
}
}
2023-08-23 20:21:45 +02:00
}
private record DatabaseConfiguration(JdbcDatabaseContainer<?> container, List<String> dropAllStatements) {
}
2023-08-23 20:21:45 +02:00
}