From 97df0fa899886cb02b4c00c6f67b8f1f7ab6ecc7 Mon Sep 17 00:00:00 2001 From: Wim Deblauwe Date: Thu, 16 Jul 2020 15:18:40 +0200 Subject: [PATCH] DATACMNS-1762 - Add tests for projections returning Optional. Original Pull Request: #459 --- .../util/ReactiveWrapperConverters.java | 1 + .../ProxyProjectionFactoryUnitTests.java | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java b/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java index fc758430d..8670635ae 100644 --- a/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java +++ b/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java @@ -155,6 +155,7 @@ public abstract class ReactiveWrapperConverters { * * @param type must not be {@literal null}. * @return will never be {@literal null}. + * @since 2.4 */ public static TypeInformation unwrapWrapperTypes(TypeInformation type) { diff --git a/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java b/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java index 5a6a8b487..23a05effb 100755 --- a/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/projection/ProxyProjectionFactoryUnitTests.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import org.junit.jupiter.api.Test; import org.springframework.aop.Advisor; @@ -34,6 +35,8 @@ import org.springframework.test.util.ReflectionTestUtils; * Unit tests for {@link ProxyProjectionFactory}. * * @author Oliver Gierke + * @author Wim Deblauwe + * @author Mark Paluch */ class ProxyProjectionFactoryUnitTests { @@ -218,6 +221,61 @@ class ProxyProjectionFactoryUnitTests { assertThat(factory.createProjection(Contact.class, customer)).isSameAs(customer); } + @Test // DATACMNS-1762 + void supportsOptionalAsReturnTypeIfEmpty() { + + Customer customer = new Customer(); + customer.picture = null; + + CustomerWithOptional excerpt = factory.createProjection(CustomerWithOptional.class, customer); + + assertThat(excerpt.getPicture()).isEmpty(); + } + + @Test // DATACMNS-1762 + void supportsOptionalAsReturnTypeIfPresent() { + + Customer customer = new Customer(); + customer.picture = new byte[] { 1, 2, 3 }; + + CustomerWithOptional excerpt = factory.createProjection(CustomerWithOptional.class, customer); + + assertThat(excerpt.getPicture()).hasValueSatisfying(bytes -> { + assertThat(bytes).isEqualTo(new byte[] { 1, 2, 3 }); + }); + } + + @Test // DATACMNS-1762 + void supportsOptionalBackedByOptional() { + + Customer customer = new Customer(); + customer.optional = Optional.of("foo"); + + CustomerWithOptional excerpt = factory.createProjection(CustomerWithOptional.class, customer); + + assertThat(excerpt.getOptional()).hasValue("foo"); + } + + @Test // DATACMNS-1762 + void supportsOptionalWithProjectionAsReturnTypeIfPresent() { + + Customer customer = new Customer(); + customer.firstname = "Dave"; + customer.lastname = "Matthews"; + + customer.address = new Address(); + customer.address.city = "New York"; + customer.address.zipCode = "ZIP"; + + CustomerWithOptionalHavingProjection excerpt = factory.createProjection(CustomerWithOptionalHavingProjection.class, + customer); + + assertThat(excerpt.getFirstname()).isEqualTo("Dave"); + assertThat(excerpt.getAddress()).hasValueSatisfying(addressExcerpt -> { + assertThat(addressExcerpt.getZipCode()).isEqualTo("ZIP"); + }); + } + interface Contact {} static class Customer implements Contact { @@ -228,6 +286,7 @@ class ProxyProjectionFactoryUnitTests { byte[] picture; Address[] shippingAddresses; Map data; + Optional optional; } static class Address { @@ -261,4 +320,20 @@ class ProxyProjectionFactoryUnitTests { void setFirstname(String firstname); } + + interface CustomerWithOptional { + + String getFirstname(); + + Optional getPicture(); + + Optional getOptional(); + } + + interface CustomerWithOptionalHavingProjection { + + String getFirstname(); + + Optional getAddress(); + } }