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); + } +}