Newer
Older
import static io.restassured.RestAssured.given;
import java.util.Collections;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.web.util.UriComponents;
import org.testcontainers.activemq.ActiveMQContainer;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import cz.muni.fi.obs.jms.JmsProducer;
import io.restassured.RestAssured;
import io.restassured.specification.RequestSpecification;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
@ActiveProfiles("postgres")
@DirtiesContext
@ContextConfiguration(initializers = {IntegrationTest.Initializer.class}, classes = {TransactionManagement.class})
public abstract class IntegrationTest {
@Autowired
protected JmsTemplate jmsTemplate;
private static final String ACTIVEMQ_IMAGE = "apache/activemq-classic:6.1.0";
private static final String POSTGRES_IMAGE = "postgres:16.2";
@Container
public static final ActiveMQContainer activeMqContainer = new ActiveMQContainer(ACTIVEMQ_IMAGE)
.withUser("username")
.withPassword("password")
.withExposedPorts(ACTIVEMQ_PORT);
public static PostgreSQLContainer<?> postgreSQLContainer = new PostgreSQLContainer<>(POSTGRES_IMAGE)
.withDatabaseName("currency_db")
.withUsername("currency_service")
.withPassword("changemelater");
@LocalServerPort
private int port;
@BeforeEach
void setup() {
RestAssured.port = port;
}
public static RequestSpecification requestSpecification(UriComponents uri) {
return given().basePath(uri.getPath())
.queryParams(uri.getQueryParams());
}
protected void waitForQueue() throws InterruptedException {
Integer queueSize = 1;
while (queueSize > 0) {
queueSize = jmsTemplate.browse(JmsProducer.TRANSACTION_QUEUE_NAME, (session, browser) -> Collections.list(browser.getEnumeration()).size());
Thread.sleep(1000);
}
}
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertyValues.of(
"spring.activemq.broker-url=" + activeMqContainer.getBrokerUrl(),
"spring.activemq.user=" + activeMqContainer.getUser(),
"spring.activemq.password=" + activeMqContainer.getPassword())
.applyTo(applicationContext.getEnvironment());
TestPropertyValues.of(
"spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),
"spring.datasource.username=" + postgreSQLContainer.getUsername(),
"spring.datasource.password=" + postgreSQLContainer.getPassword()
).applyTo(applicationContext.getEnvironment());
}
}