From c2deb65208fec4643570017f848c9ae23be269d5 Mon Sep 17 00:00:00 2001 From: Andreas Hufler Date: Wed, 13 Nov 2024 12:10:05 +0100 Subject: [PATCH 1/3] bump spring version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a74133c..d4daa2c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.3.4 + 3.3.8 From 867adb0b20e5c14968267f181009424a290c1d4d Mon Sep 17 00:00:00 2001 From: Andreas Hufler Date: Fri, 7 Feb 2025 08:43:09 +0100 Subject: [PATCH 2/3] add utility functions to PagedResponse for easier instance creation --- .../toolbox/web/response/PagedResponse.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java b/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java index 599e46b..4b926d2 100644 --- a/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java +++ b/src/main/java/it/aboutbits/springboot/toolbox/web/response/PagedResponse.java @@ -4,6 +4,7 @@ import org.springframework.data.domain.Page; import java.util.List; +import java.util.function.Function; public record PagedResponse( @NonNull @@ -12,6 +13,34 @@ public record PagedResponse( MetaWithPagination meta ) { + public static PagedResponse of(@NonNull Page page) { + return new PagedResponse<>( + page.getContent(), + new MetaWithPagination( + new MetaWithPagination.Pagination( + page.getNumber(), + page.getSize(), + page.getTotalElements() + ) + ) + ); + } + + public static PagedResponse of(@NonNull Page page, @NonNull Function converter) { + var mapped = page.map(converter); + + return new PagedResponse<>( + mapped.getContent(), + new MetaWithPagination( + new MetaWithPagination.Pagination( + mapped.getNumber(), + mapped.getSize(), + mapped.getTotalElements() + ) + ) + ); + } + public record MetaWithPagination( @NonNull Pagination pagination From ee176da33df6a666bf5ac9e8b453d0694560ed09 Mon Sep 17 00:00:00 2001 From: Andreas Hufler Date: Fri, 7 Feb 2025 08:52:37 +0100 Subject: [PATCH 3/3] add tests --- .../web/response/PagedResponseTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/test/java/it/aboutbits/springboot/toolbox/web/response/PagedResponseTest.java diff --git a/src/test/java/it/aboutbits/springboot/toolbox/web/response/PagedResponseTest.java b/src/test/java/it/aboutbits/springboot/toolbox/web/response/PagedResponseTest.java new file mode 100644 index 0000000..ae166f5 --- /dev/null +++ b/src/test/java/it/aboutbits/springboot/toolbox/web/response/PagedResponseTest.java @@ -0,0 +1,98 @@ +package it.aboutbits.springboot.toolbox.web.response; + +import org.junit.jupiter.api.Test; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; + +import java.util.List; +import java.util.function.Function; + +import static org.assertj.core.api.Assertions.assertThat; + +class PagedResponseTest { + @Test + void shouldReturnPagedResponseWithDataAndMeta_forSingleParameterOfMethod() { + // given + var content = List.of("item1", "item2", "item3"); + var page = new PageImpl<>(content, PageRequest.of(1, 3), 10); + + // when + var pagedResponse = PagedResponse.of(page); + + // then + assertThat(pagedResponse).isNotNull(); + assertThat(pagedResponse.data()).isEqualTo(content); + assertThat(pagedResponse.meta().pagination().page()).isEqualTo(1); + assertThat(pagedResponse.meta().pagination().size()).isEqualTo(3); + assertThat(pagedResponse.meta().pagination().totalElements()).isEqualTo(10); + } + + @Test + void shouldReturnPagedResponseWithMappedDataAndMeta_forTwoParameterOfMethod() { + // given + var content = List.of(1, 2, 3); + var page = new PageImpl<>(content, PageRequest.of(2, 5), 15); + Function converter = Object::toString; + + // when + var pagedResponse = PagedResponse.of(page, converter); + + // then + assertThat(pagedResponse).isNotNull(); + assertThat(pagedResponse.data()).isEqualTo(List.of("1", "2", "3")); + assertThat(pagedResponse.meta().pagination().page()).isEqualTo(2); + assertThat(pagedResponse.meta().pagination().size()).isEqualTo(5); + assertThat(pagedResponse.meta().pagination().totalElements()).isEqualTo(15); + } + + @Test + void shouldHandleEmptyPageCorrectly() { + // given + var page = new PageImpl<>(List.of(), PageRequest.of(0, 10), 0); + + // when + var pagedResponse = PagedResponse.of(page); + + // then + assertThat(pagedResponse).isNotNull(); + assertThat(pagedResponse.data()).isEmpty(); + assertThat(pagedResponse.meta().pagination().page()).isZero(); + assertThat(pagedResponse.meta().pagination().size()).isEqualTo(10); + assertThat(pagedResponse.meta().pagination().totalElements()).isZero(); + } + + @Test + void shouldHandlePageWithCustomConverterCorrectly() { + // given + var content = List.of(10, 20, 30); + var page = new PageImpl<>(content, PageRequest.of(3, 3), 24); + Function converter = val -> "Value-" + val; + + // when + var pagedResponse = PagedResponse.of(page, converter); + + // then + assertThat(pagedResponse).isNotNull(); + assertThat(pagedResponse.data()).isEqualTo(List.of("Value-10", "Value-20", "Value-30")); + assertThat(pagedResponse.meta().pagination().page()).isEqualTo(3); + assertThat(pagedResponse.meta().pagination().size()).isEqualTo(3); + assertThat(pagedResponse.meta().pagination().totalElements()).isEqualTo(24); + } + + @Test + void shouldHandleEmptyPageWithCustomConverterCorrectly() { + // given + var page = new PageImpl(List.of(), PageRequest.of(2, 4), 0); + Function converter = val -> "Value-" + val; + + // when + var pagedResponse = PagedResponse.of(page, converter); + + // then + assertThat(pagedResponse).isNotNull(); + assertThat(pagedResponse.data()).isEmpty(); + assertThat(pagedResponse.meta().pagination().page()).isEqualTo(2); + assertThat(pagedResponse.meta().pagination().size()).isEqualTo(4); + assertThat(pagedResponse.meta().pagination().totalElements()).isZero(); + } +}