Skip to content

Commit

Permalink
Merge pull request #822 from alphagov/pp_6708_postgres_extension
Browse files Browse the repository at this point in the history
PP-6708 Add PostgresAndSqsExtension
  • Loading branch information
kbottla authored Jul 2, 2020
2 parents eb80388 + afa51e6 commit 8f9268f
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 3 deletions.
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<testcontainers.version>1.14.3</testcontainers.version>
<postgresql.version>42.2.14</postgresql.version>
<pay-java-commons.version>1.0.20200629180713</pay-java-commons.version>
<junit5.version>5.6.2</junit5.version>
<surefire.version>3.0.0-M5</surefire.version>
<guice.version>4.2.3</guice.version>
<rest-assured.version>4.3.0</rest-assured.version>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package uk.gov.pay.ledger.extension;

import com.amazonaws.services.sqs.AmazonSQS;
import io.dropwizard.testing.ConfigOverride;
import io.dropwizard.testing.junit5.DropwizardAppExtension;
import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.sqlobject.SqlObjectPlugin;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.gov.pay.ledger.app.LedgerApp;
import uk.gov.pay.ledger.app.LedgerConfig;
import uk.gov.pay.ledger.rule.SqsTestDocker;

import java.util.List;

import static com.google.common.collect.Lists.newArrayList;
import static io.dropwizard.testing.ConfigOverride.config;
import static io.dropwizard.testing.ResourceHelpers.resourceFilePath;
import static uk.gov.pay.ledger.rule.PostgresTestDocker.getConnectionUrl;
import static uk.gov.pay.ledger.rule.PostgresTestDocker.getDbPassword;
import static uk.gov.pay.ledger.rule.PostgresTestDocker.getDbUsername;
import static uk.gov.pay.ledger.rule.PostgresTestDocker.getOrCreate;

public class AppWithPostgresAndSqsExtension implements BeforeAllCallback, AfterAllCallback {

private static final Logger logger = LoggerFactory.getLogger(AppWithPostgresAndSqsExtension.class);

private static String CONFIG_PATH = resourceFilePath("config/test-config.yaml");
private final Jdbi jdbi;
private AmazonSQS sqsClient;
private DropwizardAppExtension<LedgerConfig> dropwizardAppExtension;

public AppWithPostgresAndSqsExtension() {
this(new ConfigOverride[0]);
}

public AppWithPostgresAndSqsExtension(ConfigOverride... configOverrides) {
getOrCreate();

sqsClient = SqsTestDocker.initialise("event-queue");

ConfigOverride[] newConfigOverrides = overrideDatabaseConfig(configOverrides);
newConfigOverrides = overrideSqsConfig(newConfigOverrides);

dropwizardAppExtension = new DropwizardAppExtension<>(LedgerApp.class,
CONFIG_PATH, newConfigOverrides);

try {
// starts dropwizard application. This is required as we don't use DropwizardExtensionsSupport (which starts application)
// due to config overrides we need at runtime for database, sqs and any custom configuration needed for tests
dropwizardAppExtension.before();
} catch (Exception e) {
logger.error("Exception starting application - {}", e.getMessage());
throw new RuntimeException(e);
}

jdbi = Jdbi.create(getConnectionUrl(), getDbUsername(), getDbPassword());
jdbi.installPlugin(new SqlObjectPlugin());
}

@Override
public void beforeAll(ExtensionContext context) throws Exception {
dropwizardAppExtension.getApplication().run("db", "migrate", CONFIG_PATH);
}

@Override
public void afterAll(ExtensionContext context) {
dropwizardAppExtension.after();
}

private ConfigOverride[] overrideDatabaseConfig(ConfigOverride[] configOverrides) {
List<ConfigOverride> newConfigOverride = newArrayList(configOverrides);
newConfigOverride.add(config("database.url", getConnectionUrl()));
newConfigOverride.add(config("database.user", getDbUsername()));
newConfigOverride.add(config("database.password", getDbPassword()));
return newConfigOverride.toArray(new ConfigOverride[0]);
}

private ConfigOverride[] overrideSqsConfig(ConfigOverride[] configOverrides) {
List<ConfigOverride> newConfigOverride = newArrayList(configOverrides);
newConfigOverride.add(config("sqsConfig.eventQueueUrl", SqsTestDocker.getQueueUrl("event-queue")));
newConfigOverride.add(config("sqsConfig.endpoint", SqsTestDocker.getEndpoint()));
return newConfigOverride.toArray(new ConfigOverride[0]);
}

public DropwizardAppExtension<LedgerConfig> getAppRule() {
return dropwizardAppExtension;
}

public Jdbi getJdbi() {
return jdbi;
}

public AmazonSQS getSqsClient() {
return sqsClient;
}
}
13 changes: 10 additions & 3 deletions src/test/java/uk/gov/pay/ledger/rule/PostgresTestDocker.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package uk.gov.pay.ledger.rule;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;

import java.sql.Connection;
Expand All @@ -8,14 +10,19 @@
import static java.sql.DriverManager.getConnection;

public class PostgresTestDocker {

private static final Logger logger = LoggerFactory.getLogger(PostgresTestDocker.class);

private static final String DB_NAME = "ledger_test";
private static final String DB_USERNAME = "test";
private static final String DB_PASSWORD = "test";
private static GenericContainer container;

static void getOrCreate() {
public static void getOrCreate() {
try {
if (container == null) {
logger.info("Creating Postgres Container");

container = new GenericContainer("postgres:11.1");
container.addExposedPort(5432);

Expand Down Expand Up @@ -58,11 +65,11 @@ static String getDbUri() {
return getConnectionUrl() + DB_NAME;
}

static String getDbPassword() {
public static String getDbPassword() {
return DB_PASSWORD;
}

static String getDbUsername() {
public static String getDbUsername() {
return DB_USERNAME;
}
}
2 changes: 2 additions & 0 deletions src/test/java/uk/gov/pay/ledger/rule/SqsTestDocker.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public static AmazonSQS initialise(String... queues) {

private static void createContainer() {
if (sqsContainer == null) {
logger.info("Creating SQS Container");

sqsContainer = new GenericContainer("roribio16/alpine-sqs")
.withExposedPorts(9324)
.waitingFor(Wait.forHttp("/?Action=GetQueueUrl&QueueName=default"));
Expand Down

0 comments on commit 8f9268f

Please sign in to comment.