From 418b2e0bbc5f48f8e4cb46c3be57872d8a2d2a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Wed, 1 Apr 2026 10:56:06 +0200 Subject: [PATCH 1/2] feat(tests): add UserGetByIdContainerTest with PostgreSQL integration --- pom.xml | 28 ++++++ .../UserGetByIdContainerTest.java | 87 +++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserGetByIdContainerTest.java 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..7d15c7e --- /dev/null +++ b/src/test/java/com/xpeho/spring_boot_java_random_user/presentation/UserGetByIdContainerTest.java @@ -0,0 +1,87 @@ +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.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 +@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); + } +} From 5b77d7576dbfc875985eb692c7b16c0c3c5873fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Leb=C3=A8gue?= Date: Fri, 3 Apr 2026 14:58:45 +0200 Subject: [PATCH 2/2] feat(tests): enable ActiveProfiles for UserGetByIdContainerTest --- .../presentation/UserGetByIdContainerTest.java | 2 ++ 1 file changed, 2 insertions(+) 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 index 7d15c7e..6cc7881 100644 --- 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 @@ -13,6 +13,7 @@ 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; @@ -21,6 +22,7 @@ @Testcontainers @AutoConfigureTestRestTemplate +@ActiveProfiles("test") @SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {