From a0b72570f7d41d658cbaa3b763b9847a43906d66 Mon Sep 17 00:00:00 2001 From: Kuba Date: Fri, 25 Apr 2025 22:48:38 +0200 Subject: [PATCH] Testy --- pom.xml | 10 + ...ArtisanConnectBackendApplicationTests.java | 215 ++++++++++++++++-- 2 files changed, 212 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 23b7b0b..8b0ed92 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,16 @@ org.springframework.boot spring-boot-starter-web + + com.h2database + h2 + test + + + org.assertj + assertj-core + test + org.springframework.boot diff --git a/src/test/java/_11/asktpk/artisanconnectbackend/ArtisanConnectBackendApplicationTests.java b/src/test/java/_11/asktpk/artisanconnectbackend/ArtisanConnectBackendApplicationTests.java index 227b6a0..96f1ae0 100644 --- a/src/test/java/_11/asktpk/artisanconnectbackend/ArtisanConnectBackendApplicationTests.java +++ b/src/test/java/_11/asktpk/artisanconnectbackend/ArtisanConnectBackendApplicationTests.java @@ -1,25 +1,36 @@ package _11.asktpk.artisanconnectbackend; +import _11.asktpk.artisanconnectbackend.dto.ClientDTO; +import _11.asktpk.artisanconnectbackend.entities.Client; +import _11.asktpk.artisanconnectbackend.repository.ClientRepository; +import _11.asktpk.artisanconnectbackend.service.ClientService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; + +import java.util.List; + +import static _11.asktpk.artisanconnectbackend.utils.Enums.Role.USER; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + + @SpringBootTest class ArtisanConnectBackendApplicationTests { private static final Logger logger = LogManager.getLogger(ArtisanConnectBackendApplicationTests.class); -// @Test -// void testPostgresDatabase() { -// postgresDatabase.add(new Notice("Test Notice", "Username", "Test Description")); -// Boolean isRecordAvailable = postgresDatabase.get().size() > 0; -// if(isRecordAvailable) { -// logger.info("The record is available in the database"); -// } else { -// logger.error("The record is not available in the database"); -// } -// assert isRecordAvailable; -// } -// + // @Test // void getAllNotices() throws IOException { // OkHttpClient client = new OkHttpClient().newBuilder() @@ -30,4 +41,182 @@ class ArtisanConnectBackendApplicationTests { // .build(); // Response response = client.newCall(request).execute(); // } -} + + @Nested + @DisplayName("Testy jednostkowe serwisu klienta") + class ClientServiceUnitTest { + + private ClientRepository clientRepository; + private ClientService clientService; + + @BeforeEach + void setUp() { + logger.info("Inicjalizacja testu jednostkowego ClientService"); + clientRepository = mock(ClientRepository.class); + clientService = new ClientService(clientRepository); + logger.info("Utworzono mock ClientRepository i zainicjalizowano ClientService"); + + } + + @Test + @DisplayName("Powinien zwrócić listę zmapowanych klientów na DTO") + void getAllClientsShouldReturnMappedDTOs() { + logger.info("Tworzenie testowych danych"); + List mockClients = List.of( + createTestClient("Jan", "Kowalski"), + createTestClient("Anna", "Nowak") + ); + logger.info("Utworzono mockową listę z {} klientami", mockClients.size()); + when(clientRepository.findAll()).thenReturn(mockClients); + + + logger.info("Wywołanie metody getAllClients"); + List result = clientService.getAllClients(); + + assertThat(result) + .hasSize(2) + .extracting(ClientDTO::getFirstName) + .containsExactly("Jan", "Anna"); + + verify(clientRepository).findAll(); + logger.info("Test wykonany poprawnie"); + + } + + private Client createTestClient(String firstName, String lastName) { + logger.debug("Tworzenie klienta testowego: {} {}", firstName, lastName); + Client client = new Client(); + client.setFirstName(firstName); + client.setLastName(lastName); + client.setEmail(firstName.toLowerCase() + "." + lastName.toLowerCase() + "@example.com"); + client.setRole(USER); + return client; + } + } + + @Nested + @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) + @AutoConfigureTestDatabase + @DisplayName("Testy kontrolera klienta") + class ClientControllerTest { + + @LocalServerPort + private int port; + + @Autowired //Pawelkiewicz final + private ClientRepository clientRepository; + + private TestRestTemplate restTemplate; + + @BeforeEach + void setUp() { + restTemplate = new TestRestTemplate(); + logger.info("Inicjalizacja testu - port: {}", port); + + } + + @Test + @DisplayName("Powinien zaktualizować dane klienta") + void shouldUpdateClientData() { + logger.info("Start testu aktualizacji klienta"); + + logger.info("Przygotowanie danych testowych..."); + Client existingClient = new Client(); + existingClient.setFirstName("John"); + existingClient.setLastName("Doe"); + existingClient.setEmail("john.doe@example.com"); + existingClient.setRole(USER); + existingClient.setImage("null"); + + Client savedClient = clientRepository.save(existingClient); + logger.info("Utworzono testowego klienta z ID: {}", savedClient.getId()); + + ClientDTO updateData = new ClientDTO(); + updateData.setEmail("dignissim.tempor.arcu@aol.ca"); + updateData.setFirstName("Peter"); + updateData.setLastName("Harrison"); + updateData.setImage("null"); + updateData.setRole(USER); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity requestEntity = new HttpEntity<>(updateData, headers); + logger.info("Przygotowano dane do aktualizacji: {}", updateData); + + logger.info("Wysyłanie żądania PUT..."); + ResponseEntity response = restTemplate.exchange( + createURLWithPort("/api/v1/clients/edit/" + savedClient.getId()), + HttpMethod.PUT, + requestEntity, + ClientDTO.class + ); + + logger.info("Weryfikacja odpowiedzi..."); + logger.info("Status odpowiedzi: {}", response.getStatusCode()); + assertThat(response.getStatusCode()).isEqualTo(org.springframework.http.HttpStatus.OK); + assertThat(response.getBody()).isNotNull(); + assertThat(response.getBody().getFirstName()).isEqualTo("Peter"); + assertThat(response.getBody().getLastName()).isEqualTo("Harrison"); + assertThat(response.getBody().getEmail()).isEqualTo("dignissim.tempor.arcu@aol.ca"); + + // sprawdzenie w bazie + logger.info("Weryfikacja danych w bazie..."); + + Client updatedClient = clientRepository.findById(savedClient.getId()).orElseThrow(); + assertThat(updatedClient.getFirstName()).isEqualTo("Peter"); + assertThat(updatedClient.getLastName()).isEqualTo("Harrison"); + assertThat(updatedClient.getEmail()).isEqualTo("dignissim.tempor.arcu@aol.ca"); + + logger.info("Test zakończony pomyślnie"); + + } + + @Test + @DisplayName("Powinien zwrócić 404 przy próbie aktualizacji nieistniejącego klienta") + void shouldReturn404WhenUpdatingNonExistingClient() { + logger.info("Start testu dla nieistniejącego klienta"); + + // given + ClientDTO updateData = new ClientDTO(); + updateData.setEmail("test@example.com"); + updateData.setFirstName("Test"); + updateData.setLastName("Test"); + updateData.setRole(USER); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity requestEntity = new HttpEntity<>(updateData, headers); + logger.info("Przygotowano dane do aktualizacji dla nieistniejącego ID: 99999"); + + + // when + logger.info("Wysyłanie żądania PUT..."); + + ResponseEntity response = restTemplate.exchange( + createURLWithPort("/api/v1/clients/edit/99999"), + HttpMethod.PUT, + requestEntity, + ClientDTO.class + ); + + // then + logger.info("Otrzymany status odpowiedzi: {}", response.getStatusCode()); + assertThat(response.getStatusCode()).isEqualTo(org.springframework.http.HttpStatus.NOT_FOUND); + logger.info("Test zakończony pomyślnie"); + + } + + private String createURLWithPort(String uri) { + return "http://localhost:" + port + uri; + } + + @AfterEach + void cleanup() { + clientRepository.deleteAll(); + } + + } + +} \ No newline at end of file