From b38a507ce9482dcc9af97f208d951aad3ab72c84 Mon Sep 17 00:00:00 2001 From: Piotr Dec Date: Thu, 23 May 2024 22:38:20 +0200 Subject: [PATCH] test: NbpServiceTest completed? --- pom.xml | 2 +- .../config/RestClientConfiguration.java | 18 +++++++ .../eu/ztsh/wymiana/service/NbpService.java | 6 ++- .../ztsh/wymiana/service/NbpServiceTest.java | 48 ++++++++++++++----- 4 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 src/main/java/eu/ztsh/wymiana/config/RestClientConfiguration.java diff --git a/pom.xml b/pom.xml index dddde47..3756469 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,7 @@ org.wiremock - wiremock + wiremock-standalone ${wiremock.version} test diff --git a/src/main/java/eu/ztsh/wymiana/config/RestClientConfiguration.java b/src/main/java/eu/ztsh/wymiana/config/RestClientConfiguration.java new file mode 100644 index 0000000..74ee47b --- /dev/null +++ b/src/main/java/eu/ztsh/wymiana/config/RestClientConfiguration.java @@ -0,0 +1,18 @@ +package eu.ztsh.wymiana.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestClient; + +@Configuration +public class RestClientConfiguration { + + @Bean + public RestClient restClient() { + return RestClient.builder() + .baseUrl("http://api.nbp.pl") + .defaultHeader("Accept", "application/json") + .build(); + } + +} diff --git a/src/main/java/eu/ztsh/wymiana/service/NbpService.java b/src/main/java/eu/ztsh/wymiana/service/NbpService.java index 1871f54..9379b7a 100644 --- a/src/main/java/eu/ztsh/wymiana/service/NbpService.java +++ b/src/main/java/eu/ztsh/wymiana/service/NbpService.java @@ -4,6 +4,7 @@ import eu.ztsh.wymiana.model.Rates; import lombok.RequiredArgsConstructor; import org.assertj.core.util.VisibleForTesting; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; import java.time.Clock; import java.time.DayOfWeek; @@ -18,6 +19,8 @@ import java.time.temporal.TemporalAdjusters; public class NbpService { private final Clock clock; + private final RestClient restClient; + private static final String URI_PATTERN = "/api/exchangerates/rates/c/{code}/{date}/"; public double getSellRate(String currency) { throw new UnsupportedOperationException("Not implemented yet"); @@ -41,7 +44,7 @@ public class NbpService { } @VisibleForTesting - Rates fetchData(String date) { + Rates fetchData(String code, String date) { throw new UnsupportedOperationException("Not implemented yet"); } @@ -49,6 +52,7 @@ public class NbpService { return today.getDayOfWeek() == DayOfWeek.SATURDAY || today.getDayOfWeek() == DayOfWeek.SUNDAY; } + private record RatesCache(LocalDate date, double buy, double sell) { } diff --git a/src/test/java/eu/ztsh/wymiana/service/NbpServiceTest.java b/src/test/java/eu/ztsh/wymiana/service/NbpServiceTest.java index 9f43ad6..74c02df 100644 --- a/src/test/java/eu/ztsh/wymiana/service/NbpServiceTest.java +++ b/src/test/java/eu/ztsh/wymiana/service/NbpServiceTest.java @@ -1,26 +1,36 @@ package eu.ztsh.wymiana.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.ztsh.wymiana.EntityCreator; +import eu.ztsh.wymiana.WireMockExtension; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.Mockito; +import org.springframework.web.client.RestClient; import java.time.Clock; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(WireMockExtension.class) class NbpServiceTest { private static final ZoneId zone = ZoneId.of("Europe/Warsaw"); private static final LocalDate today = LocalDate.of(2024, Month.MAY, 12); // Sunday private static Clock clock; + private final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + private final RestClient restClient = RestClient.builder().baseUrl(WireMockExtension.baseUrl).build(); private NbpService nbpService; @BeforeAll @@ -31,11 +41,11 @@ class NbpServiceTest { @BeforeEach void prepareTest() { - nbpService = new NbpService(clock); + nbpService = new NbpService(clock, restClient); } @ParameterizedTest - @EnumSource(value = DayOfWeek.class, names = {"SATURDAY","SUNDAY"}, mode = EnumSource.Mode.EXCLUDE) + @EnumSource(value = DayOfWeek.class, names = {"SATURDAY", "SUNDAY"}, mode = EnumSource.Mode.EXCLUDE) void getFetchDateOnWorkingDayTest(DayOfWeek dayOfWeek) { updateClock(dayOfWeek); assertThat(nbpService.getFetchDate()).isEqualTo( @@ -51,32 +61,44 @@ class NbpServiceTest { } @ParameterizedTest - @EnumSource(value = DayOfWeek.class, names = {"SATURDAY","SUNDAY"}) + @EnumSource(value = DayOfWeek.class, names = {"SATURDAY", "SUNDAY"}) void getFetchDateOnWeekendTest(DayOfWeek dayOfWeek) { updateClock(dayOfWeek); assertThat(nbpService.getFetchDate()).isEqualTo(LocalDate.of(2024, Month.MAY, 10)); } @Test - void getWithoutCacheTest() { - throw new UnsupportedOperationException("Not implemented yet"); + void getWithoutCacheTest() throws JsonProcessingException { + var date = dtf.format(updateClock(DayOfWeek.FRIDAY)); + var url = "/api/exchangerates/rates/c/usd/%s/".formatted(date); + WireMockExtension.response(url, 200, new ObjectMapper().writeValueAsString(EntityCreator.rates(date))); + nbpService.fetchData(EntityCreator.Constants.USD_SYMBOL, date); + WireMockExtension.verifyGet(1, url); } @Test - void getWithCacheTest() { - throw new UnsupportedOperationException("Not implemented yet"); + void getWithCacheTest() throws JsonProcessingException { + var date = dtf.format(updateClock(DayOfWeek.FRIDAY)); + var url = "/api/exchangerates/rates/c/usd/%s/".formatted(date); + WireMockExtension.response(url, 200, new ObjectMapper().writeValueAsString(EntityCreator.rates(date))); + nbpService.fetchData(EntityCreator.Constants.USD_SYMBOL, date); + nbpService.fetchData(EntityCreator.Constants.USD_SYMBOL, date); + WireMockExtension.verifyGet(1, url); } @Test void getInvalidCurrencyTest() { - throw new UnsupportedOperationException("Not implemented yet"); + var date = dtf.format(updateClock(DayOfWeek.FRIDAY)); + var url = "/api/exchangerates/rates/c/usb/%s/".formatted(date); + WireMockExtension.response(url, 404, "404 NotFound - Not Found - Brak danych"); + nbpService.fetchData("usb", date); + WireMockExtension.verifyGet(1, url); } - private void updateClock(DayOfWeek dayOfWeek) { - Mockito.when(clock.instant()).thenReturn( - today.with(TemporalAdjusters.previousOrSame(dayOfWeek)) - .atStartOfDay(zone) - .toInstant()); + private LocalDate updateClock(DayOfWeek dayOfWeek) { + var date = today.with(TemporalAdjusters.previousOrSame(dayOfWeek)); + Mockito.when(clock.instant()).thenReturn(date.atStartOfDay(zone).toInstant()); + return LocalDate.from(date); } }