diff --git a/pom.xml b/pom.xml
index 802600f..db09a22 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,11 +28,24 @@
25
+ 1.19.8
false
**/*Application.java
**/feature/SpringIntegrationTest.java
${project.build.directory}/site/jacoco/jacoco.xml
+
+
+
+
+ org.testcontainers
+ testcontainers-bom
+ ${testcontainers.version}
+ pom
+ import
+
+
+
com.h2database
@@ -117,6 +130,21 @@
spring-boot-starter-test
test
+
+ org.springframework.boot
+ spring-boot-testcontainers
+ test
+
+
+ org.testcontainers
+ junit-jupiter
+ test
+
+
+ org.testcontainers
+ postgresql
+ test
+
org.liquibase
liquibase-core
diff --git a/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserGetByIdContainerTest.java b/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserGetByIdContainerTest.java
new file mode 100644
index 0000000..6cc7881
--- /dev/null
+++ b/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserGetByIdContainerTest.java
@@ -0,0 +1,89 @@
+package com.xpeho.spring_boot_java_random_user.presentation;
+
+import com.xpeho.spring_boot_java_random_user.data.models.database.User;
+import com.xpeho.spring_boot_java_random_user.data.sources.database.UserRepository;
+import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
+import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.resttestclient.TestRestTemplate;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.ActiveProfiles;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@Testcontainers
+@AutoConfigureTestRestTemplate
+@ActiveProfiles("test")
+@SpringBootTest(
+ webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
+ properties = {
+ "spring.sql.init.mode=never",
+ "spring.jpa.hibernate.ddl-auto=create-drop"
+ }
+)
+class UserGetByIdContainerTest {
+
+ @Container
+ @ServiceConnection
+ static PostgreSQLContainer> postgres = new PostgreSQLContainer<>("postgres:16-alpine");
+
+ @Autowired
+ private TestRestTemplate restTemplate;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @BeforeEach
+ void setUp() {
+ userRepository.deleteAll();
+ }
+
+ @Test
+ @DisplayName("GET /random-users/{id} should return 200 with persisted user")
+ void shouldReturnUserByIdWhenUserExists() {
+ User user = new User();
+ user.setGender("female");
+ user.setFirstname("Jane");
+ user.setLastname("Doe");
+ user.setCivility("Ms");
+ user.setEmail("jane.doe@example.com");
+ user.setPhone("0600000000");
+ user.setPicture("https://example.com/jane.jpg");
+ user.setNationality("FR");
+
+ User saved = userRepository.saveAndFlush(user);
+
+ ResponseEntity response = restTemplate.getForEntity(
+ "/random-users/{id}",
+ UserEntity.class,
+ saved.getId()
+ );
+
+ assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
+ assertThat(response.getBody()).isNotNull();
+ assertThat(response.getBody().id()).isEqualTo(saved.getId());
+ assertThat(response.getBody().firstname()).isEqualTo("Jane");
+ assertThat(response.getBody().nat()).isEqualTo("FR");
+ }
+
+ @Test
+ @DisplayName("GET /random-users/{id} should return 404 when user does not exist")
+ void shouldReturnNotFoundWhenUserDoesNotExist() {
+ ResponseEntity response = restTemplate.getForEntity(
+ "/random-users/{id}",
+ UserEntity.class,
+ -1
+ );
+
+ assertThat(response.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND);
+ }
+}