From 56092df2c563febe17c5a6a782b9a03e6a5e694f Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 30 Nov 2021 15:26:23 +0100 Subject: [PATCH] GH-768 Add tests to validate proper map values conversion Resolves #768 --- ...BeanFactoryAwareFunctionRegistryTests.java | 24 ++++++++++++++ .../catalog/SimpleFunctionRegistryTests.java | 31 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java index 91bd06857..d4234d89b 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -640,6 +641,16 @@ public class BeanFactoryAwareFunctionRegistryTests { assertThat(resultList).isEmpty(); } + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test + public void testGH_768() throws Exception { + FunctionCatalog catalog = this.configureCatalog(SCF_GH_768ConfigurationAsFunction.class); + Function function = catalog.lookup("echo"); + + String result = (String) function.apply("{\"ricky\":{\"name\":\"ricky\"}}"); + assertThat(result).isEqualTo("{ricky=Person: ricky/0}"); + } + @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testArrayPayloadOnFluxFunction() throws Exception { @@ -1117,6 +1128,19 @@ public class BeanFactoryAwareFunctionRegistryTests { } } + @EnableAutoConfiguration + public static class SCF_GH_768ConfigurationAsFunction { + @Bean + public Function, String> echoToString() { + return persons -> { + for (Entry entry : persons.entrySet()) { + assertThat(entry.getValue().getName()).isNotEmpty(); // would fail if value would not be converted to Person + } + return persons.toString(); + }; + } + } + public static class Person { private String name; private int id; diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java index 9f5840c50..062b2d7fa 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java @@ -16,9 +16,12 @@ package org.springframework.cloud.function.context.catalog; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.UUID; import java.util.function.Consumer; import java.util.function.Function; @@ -120,6 +123,29 @@ public class SimpleFunctionRegistryTests { assertThat(instanceA).isNotSameAs(instanceb).isNotSameAs(instanceC); } + @Test + public void testSCF768() { + ResolvableType map = ResolvableType.forClassWithGenerics(Map.class, String.class, Person.class); + Type functionType = ResolvableType.forClassWithGenerics(Function.class, map, ResolvableType.forClass(String.class)).getType(); + + Function, String> function = persons -> { + for (Entry entry : persons.entrySet()) { + assertThat(entry.getValue().getName()).isNotEmpty(); // would fail if value would not be converted to Person + } + return persons.toString(); + }; + + FunctionRegistration, String>> registration = new FunctionRegistration<>( + function, "echo").type(FunctionType.of(functionType)); + SimpleFunctionRegistry catalog = new SimpleFunctionRegistry(this.conversionService, this.messageConverter, + new JacksonMapper(new ObjectMapper())); + catalog.register(registration); + + FunctionInvocationWrapper lookedUpFunction = catalog.lookup("echo"); + String result = (String) lookedUpFunction.apply("{\"ricky\":{\"name\":\"ricky\"}}"); + assertThat(result).isEqualTo("{ricky=ricky}"); + } + @Test public void testSCF640() { Echo function = new Echo(); @@ -585,6 +611,11 @@ public class SimpleFunctionRegistryTests { public void setName(String name) { this.name = name; } + + @Override + public String toString() { + return this.name; + } } private static class Words implements Supplier {