Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 114 additions & 0 deletions testcontainers-example/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.backbase.buildingblocks</groupId>
<artifactId>service-sdk-starter-core</artifactId>
<version>17.0.0</version>
<relativePath/>
</parent>

<groupId>com.backbase</groupId>
<artifactId>testcontainers-samples</artifactId>
<version>1.0.0</version>
<name>Backbase ::testcontainerssamples</name>

<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.backbase.buildingblocks</groupId>
<artifactId>building-blocks-common</artifactId>
</dependency>
<dependency>
<groupId>com.backbase.buildingblocks</groupId>
<artifactId>events</artifactId>
</dependency>

<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>

<dependency>
<groupId>com.backbase.buildingblocks</groupId>
<artifactId>service-sdk-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-testcontainers</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>kafka</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mysql</artifactId>
<scope>test</scope>
</dependency>

</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.backbase.codegen</groupId>
<artifactId>jsonschema-events-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>events-generation</goal>
</goals>
</execution>
</executions>
<configuration>
<inputFile>${project.basedir}/src/main/resources/events</inputFile>
<outputFile>${project.build.directory}/generated-sources/events</outputFile>
<basePackageName>${project.groupId}</basePackageName>
<packageName>testcontainerssamples</packageName>
<packageVersion>1</packageVersion>
<useJavaTime>true</useJavaTime>
<generatedResourcesDirectory>${project.build.directory}/generated-resources
</generatedResourcesDirectory>
<generatedSpringFactoriesDir>${project.build.directory}/generated-spring-factories
</generatedSpringFactoriesDir>
</configuration>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.backbase.testcontainers;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
@Slf4j
public class Application extends SpringBootServletInitializer {

public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.backbase.testcontainers;

import com.backbase.buildingblocks.backend.communication.event.EnvelopedEvent;
import com.backbase.buildingblocks.backend.communication.event.proxy.EventBus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EventEmitter<T> {

private final EventBus eventBus;

@Autowired
public EventEmitter(EventBus eventBus) {
this.eventBus = eventBus;
}

public void sendMessage(T event) {
EnvelopedEvent<T> envelopedEvent = new EnvelopedEvent<>();
envelopedEvent.setEvent(event);
eventBus.emitEvent(envelopedEvent);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.backbase.testcontainers.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@Data
@NoArgsConstructor
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, unique = true)
private String code;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private BigDecimal price;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.backbase.testcontainers.listener;

import com.backbase.buildingblocks.backend.communication.event.EnvelopedEvent;
import com.backbase.buildingblocks.backend.communication.event.handler.EventHandler;
import com.backbase.testcontainers.repository.ProductRepository;
import com.backbase.testcontainerssamples.event.spec.v1.ProductPriceChangedEvent;
import java.math.BigDecimal;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
@Slf4j
public class ProductPriceChangedEventHandler implements EventHandler<ProductPriceChangedEvent> {

private final ProductRepository productRepository;

@Autowired
public ProductPriceChangedEventHandler(ProductRepository productRepository) {
this.productRepository = productRepository;
}

@Override
@Transactional
public void handle(
EnvelopedEvent<ProductPriceChangedEvent> envelopedEvent) {
ProductPriceChangedEvent event = envelopedEvent.getEvent();
productRepository.updateProductPrice(event.getCode(), new BigDecimal(event.getPrice()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.backbase.testcontainers.repository;

import com.backbase.testcontainers.domain.Product;
import java.math.BigDecimal;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface ProductRepository extends JpaRepository<Product, Long> {
@Modifying
@Query("update Product p set p.price = :price where p.code = :productCode")
void updateProductPrice(
@Param("productCode") String productCode,
@Param("price") BigDecimal price
);

Optional<Product> findByCode(String code);
}
18 changes: 18 additions & 0 deletions testcontainers-example/src/main/resources/application.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
spring:
sql:
init:
mode: always

cloud:
stream:
default-binder: kafka
kafka:
binder:
brokers: localhost:9092

application:
name: testcontainerssamples

backbase:
activemq:
enabled: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"groupId": "demo",
"destination": "product-price-changes",
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"price": {
"type": "string"
}
},
"required": [
"id"
]
}
8 changes: 8 additions & 0 deletions testcontainers-example/src/main/resources/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
create table if not exists products (
id int NOT NULL AUTO_INCREMENT,
code varchar(255) not null,
name varchar(255) not null,
price numeric(5,2) not null,
PRIMARY KEY (id),
UNIQUE (code)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.backbase.testcontainers;

import static java.util.concurrent.TimeUnit.SECONDS;
import static org.assertj.core.api.Assertions.assertThat;
import static org.testcontainers.shaded.org.awaitility.Awaitility.await;

import com.backbase.testcontainers.domain.Product;
import com.backbase.testcontainers.repository.ProductRepository;
import com.backbase.testcontainerssamples.event.spec.v1.ProductPriceChangedEvent;
import java.math.BigDecimal;
import java.time.Duration;
import java.util.Optional;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.TestPropertySource;
import org.testcontainers.containers.KafkaContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;

@SpringBootTest
@TestPropertySource(
properties = {
"spring.kafka.consumer.auto-offset-reset=earliest",
"spring.datasource.url=jdbc:tc:mysql:8.0.32:///db",
}
)
@Testcontainers
@ActiveProfiles("it")
@Slf4j
public class ProductPriceChangedEventHandlerTest {
@Container
static final KafkaContainer kafka = new KafkaContainer(
DockerImageName.parse("confluentinc/cp-kafka:7.5.1")
);

@DynamicPropertySource
static void overrideProperties(DynamicPropertyRegistry registry) {
registry.add("spring.kafka.bootstrap-servers", kafka::getBootstrapServers);
}

@Autowired
private EventEmitter<ProductPriceChangedEvent> productPriceChangedEventEventEmitter;

@Autowired
private ProductRepository productRepository;

@BeforeEach
void setUp() {
Product product = new Product(null, "P100", "Product One", BigDecimal.TEN);
productRepository.save(product);
}

@Test
void shouldHandleProductPriceChangedEvent() {
ProductPriceChangedEvent event = new ProductPriceChangedEvent();
event.withPrice("14.50")
.withCode("P100");

productPriceChangedEventEventEmitter.sendMessage(event);

await()
.pollInterval(Duration.ofSeconds(3))
.atMost(10, SECONDS)
.untilAsserted(() -> {
Optional<Product> optionalProduct = productRepository.findByCode("P100");

assertThat(optionalProduct).isPresent();
log.info("Product {}", optionalProduct.get());
assertThat(optionalProduct.get().getCode()).isEqualTo("P100");
assertThat(optionalProduct.get().getPrice())
.isEqualTo(new BigDecimal("14.50"));
});
}
}