diff --git a/README.md b/README.md index 14714e2..c9d474f 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,19 @@ Usual use cases include: * [Tests](#RabbitMqTests) * [Local development](#RabbitMqLocalDevelopment) * [Docker image](#RabbitMqDockerImage) + * [ClickHouse](#ClickHouse) + * [Tests](#ClickHouseTests) + * [Local development](#ClickHouseLocalDevelopment) + * [Docker image version](#ClickHouseDockerImageVersion) + ## News +### 3.2.0 +####ClickHouse: +* Added support for ClickHouse +* Custom path for ClickHouse jdbc properties can be provided under `testcontainers.clickhouse.custom-path` property. In case custom path is not provided, properties under `spring.datasource` will be used + ### 3.1.0 #### MSSQL: @@ -451,6 +461,76 @@ To change the docker image used simply add the following property (e.g. in yaml) ```yaml testcontainers.rabbit.docker.image: rabbitmq:3.6.14-alpine ``` + +### ClickHouse + + +####Tests + +Include the dependency: + +```xml + + com.infobip + infobip-clickhouse-testcontainers-spring-boot-starter + ${infobip-clickhouse-testcontainers-spring-boot-starter.version} + test + +``` + + +####Local development + +Add the following profile: + +```xml + + + development + + + com.infobip + infobip-clickhouse-testcontainers-spring-boot-starter + ${infobip-clickhouse-testcontainers-spring-boot-starter.version} + test + + + + +``` + +Before starting the application locally, activate development profile: + +![profile.png](profile.png) + + +and update your local configuration (e.g. application-development.yaml): + +```yaml +spring: + datasource: + jdbc-url: : +``` +In case your datasource configuration is different from default one you can provide custom configuration property path +```yaml + testcontainers.clickhouse.custom-path: "spring.datasource.clickhouse" +``` +in this case your configuration would look like this + +```yaml +spring: + datasource: + clickhouse: + jdbc-url: : +``` + +####Docker image version + +To change the docker image used simply add the following property (e.g. in yaml): + +```yaml +testcontainers.clickhouse.docker.image: rabbitmq:latest +``` ## Contributing @@ -461,3 +541,4 @@ Pull requests are welcome! ## License This library is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0). + diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml b/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml new file mode 100644 index 0000000..627960a --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/pom.xml @@ -0,0 +1,45 @@ + + 4.0.0 + + + com.infobip + infobip-testcontainers-spring-boot-starter + 3.1.9-SNAPSHOT + + + infobip-clickhouse-testcontainers-spring-boot-starter + + + 0.2.4 + + + + + ${project.groupId} + infobip-testcontainers-common + ${project.version} + + + + com.fasterxml.jackson.core + jackson-databind + + + + + org.testcontainers + clickhouse + ${testcontainers.version} + + + ru.yandex.clickhouse + clickhouse-jdbc + ${clickhouse-jdbc.version} + + + org.springframework.boot + spring-boot-starter-jdbc + + + + diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java new file mode 100644 index 0000000..512581b --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializer.java @@ -0,0 +1,33 @@ +package com.infobip.testcontainers.spring.clickhouse; + +import java.util.Objects; +import java.util.Optional; + +import com.infobip.testcontainers.InitializerBase; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; + +public class ClickhouseContainerInitializer extends InitializerBase { + + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + Environment environment = applicationContext.getEnvironment(); + Optional customPropertyPath = Optional.ofNullable(environment.getProperty("testcontainers.clickhouse.custom-path")); + String jdbcUrlPropertyPath = customPropertyPath.orElse( "spring.datasource") + ".jdbc-url"; + String jdbcUrlValue = Objects.requireNonNull(environment.getProperty(jdbcUrlPropertyPath)); + ClickhouseContainerWrapper container = Optional.ofNullable( + environment.getProperty("testcontainers.clickhouse.docker.image.version")) + .map(ClickhouseContainerWrapper::new) + .orElseGet(ClickhouseContainerWrapper::new); + + start(container); + String url = jdbcUrlValue.replace("", container.getContainerIpAddress()) + .replace("", container.getMappedPort(ClickhouseContainerWrapper.HTTP_PORT) + .toString()); + TestPropertyValues values = TestPropertyValues.of( + String.format("%s=%s", jdbcUrlPropertyPath, url)); + values.applyTo(applicationContext); + } + +} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerWrapper.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerWrapper.java new file mode 100644 index 0000000..5368a9d --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerWrapper.java @@ -0,0 +1,13 @@ +package com.infobip.testcontainers.spring.clickhouse; + +import org.testcontainers.containers.ClickHouseContainer; + +public class ClickhouseContainerWrapper extends ClickHouseContainer { + + public ClickhouseContainerWrapper() { + } + + public ClickhouseContainerWrapper(String confluentPlatformVersion) { + super(confluentPlatformVersion); + } +} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/resources/META-INF/spring.factories b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..a87a95a --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.context.ApplicationContextInitializer=com.infobip.testcontainers.spring.clickhouse.ClickhouseContainerInitializer +org.springframework.context.ApplicationListener=com.infobip.testcontainers.spring.clickhouse.ClickhouseContainerInitializer diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerTest.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerTest.java new file mode 100644 index 0000000..e28485c --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/ClickhouseContainerInitializerTest.java @@ -0,0 +1,33 @@ +package com.infobip.testcontainers.spring.clickhouse; + +import static org.assertj.core.api.BDDAssertions.then; + +import javax.sql.DataSource; + +import lombok.AllArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestConstructor; + +@AllArgsConstructor +@ActiveProfiles("test") +@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL) +@SpringBootTest(classes = Main.class) +class ClickhouseContainerInitializerTest { + + DataSource dataSource; + + @Test + void shouldCreateContainer() { + //given + JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); + + //when + String result = jdbcTemplate.queryForObject("SELECT 1", String.class); + + //then + then(result).isEqualTo("1"); + } +} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/DataSourceConfig.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/DataSourceConfig.java new file mode 100644 index 0000000..80057e7 --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/DataSourceConfig.java @@ -0,0 +1,25 @@ +package com.infobip.testcontainers.spring.clickhouse; + +import javax.sql.DataSource; + +import lombok.AllArgsConstructor; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +@Configuration +@AllArgsConstructor +public class DataSourceConfig { + + private final Environment environment; + + @Bean + public DataSource getDataSource() { + String url = environment.getProperty("spring.datasource.clickhouse.jdbc-url"); + DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); + dataSourceBuilder.driverClassName("ru.yandex.clickhouse.ClickHouseDriver"); + dataSourceBuilder.url(url); + return dataSourceBuilder.build(); + } +} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/Main.java b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/Main.java new file mode 100644 index 0000000..16fbf74 --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/clickhouse/Main.java @@ -0,0 +1,12 @@ +package com.infobip.testcontainers.spring.clickhouse; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; + +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + new SpringApplicationBuilder(Main.class).run(args); + } +} diff --git a/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-test.yaml b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-test.yaml new file mode 100644 index 0000000..91f5396 --- /dev/null +++ b/infobip-clickhouse-testcontainers-spring-boot-starter/src/test/resources/application-test.yaml @@ -0,0 +1,8 @@ +spring: + datasource: + clickhouse: + jdbc-url: jdbc:clickhouse://: + +testcontainers: + clickhouse: + custom-path: "spring.datasource.clickhouse" diff --git a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java index bcbc670..259769c 100644 --- a/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java +++ b/infobip-kafka-testcontainers-spring-boot-starter/src/test/java/com/infobip/testcontainers/spring/kafka/Main.java @@ -9,4 +9,4 @@ public class Main { public static void main(String[] args) { new SpringApplicationBuilder(Main.class).run(args); } -} \ No newline at end of file +} diff --git a/pom.xml b/pom.xml index 2238701..e1cedc3 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ infobip-redis-testcontainers-spring-boot-starter infobip-testcontainers-common infobip-rabbitmq-testcontainers-spring-boot + infobip-clickhouse-testcontainers-spring-boot-starter