From 5b1bda5c7cc1b28a559ead633121f67eea149acd Mon Sep 17 00:00:00 2001 From: christophejan <69955393+christophejan@users.noreply.github.com> Date: Sun, 5 Jun 2022 17:46:27 +0200 Subject: [PATCH] Add test case on nested RouterFunction attributes --- .../server/AttributesTestVisitor.java | 30 ++++++++++++++----- .../server/RouterFunctionBuilderTests.java | 26 +++++++++++++--- .../function/server/RouterFunctionTests.java | 28 +++++++++++++++-- .../function/AttributesTestVisitor.java | 29 +++++++++++++----- .../function/RouterFunctionBuilderTests.java | 26 +++++++++++++--- .../servlet/function/RouterFunctionTests.java | 28 +++++++++++++++-- 6 files changed, 139 insertions(+), 28 deletions(-) diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/AttributesTestVisitor.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/AttributesTestVisitor.java index 7a97e8c363..8d8a495717 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/AttributesTestVisitor.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/AttributesTestVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,43 +16,60 @@ package org.springframework.web.reactive.function.server; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import reactor.core.publisher.Mono; import org.springframework.core.io.Resource; import org.springframework.lang.Nullable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.entry; - /** * @author Arjen Poutsma */ class AttributesTestVisitor implements RouterFunctions.Visitor { + private Deque> nestedAttributes = new LinkedList<>(); + @Nullable private Map attributes; + private List>> routerFunctionsAttributes = new LinkedList<>(); + private int visitCount; + public List>> routerFunctionsAttributes() { + return this.routerFunctionsAttributes; + } + public int visitCount() { return this.visitCount; } @Override public void startNested(RequestPredicate predicate) { + nestedAttributes.addFirst(attributes); + attributes = null; } @Override public void endNested(RequestPredicate predicate) { + attributes = nestedAttributes.removeFirst(); } @Override public void route(RequestPredicate predicate, HandlerFunction handlerFunction) { - assertThat(this.attributes).isNotNull(); - this.attributes = null; + Stream> current = Optional.ofNullable(attributes).stream(); + Stream> nested = nestedAttributes.stream().filter(Objects::nonNull); + routerFunctionsAttributes.add(Stream.concat(current, nested).collect(Collectors.toUnmodifiableList())); + attributes = null; } @Override @@ -61,7 +78,6 @@ class AttributesTestVisitor implements RouterFunctions.Visitor { @Override public void attributes(Map attributes) { - assertThat(attributes).containsExactly(entry("foo", "bar"), entry("baz", "qux")); this.attributes = attributes; this.visitCount++; } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionBuilderTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionBuilderTests.java index 85b22f5659..b91d2840ad 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionBuilderTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package org.springframework.web.reactive.function.server; import java.io.IOException; import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.Test; @@ -236,12 +238,28 @@ public class RouterFunctionBuilderTests { atts.put("foo", "bar"); atts.put("baz", "qux"); }) + .path("/atts", b1 -> b1 + .GET("/3", request -> ServerResponse.ok().build()) + .withAttribute("foo", "bar") + .GET("/4", request -> ServerResponse.ok().build()) + .withAttribute("baz", "qux") + .path("/5", b2 -> b2 + .GET(request -> ServerResponse.ok().build()) + .withAttribute("foo", "n3")) + .withAttribute("foo", "n2") + ) + .withAttribute("foo", "n1") .build(); AttributesTestVisitor visitor = new AttributesTestVisitor(); route.accept(visitor); - assertThat(visitor.visitCount()).isEqualTo(2); + assertThat(visitor.routerFunctionsAttributes()).containsExactly( + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar"), Map.of("foo", "n1")), + List.of(Map.of("baz", "qux"), Map.of("foo", "n1")), + List.of(Map.of("foo", "n3"), Map.of("foo", "n2"), Map.of("foo", "n1")) + ); + assertThat(visitor.visitCount()).isEqualTo(7); } - - } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionTests.java index 4fcd6dbf1c..49561cf865 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/server/RouterFunctionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ package org.springframework.web.reactive.function.server; import java.util.Collections; +import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; @@ -26,7 +28,10 @@ import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRe import org.springframework.web.testfixture.server.MockServerWebExchange; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.http.HttpMethod.GET; import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.method; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; /** * @author Arjen Poutsma @@ -137,11 +142,28 @@ public class RouterFunctionTests { .withAttributes(atts -> { atts.put("foo", "bar"); atts.put("baz", "qux"); - })); + })) + .and(RouterFunctions.nest(path("/atts"), + RouterFunctions.route(GET("/3"), request -> ServerResponse.ok().build()) + .withAttribute("foo", "bar") + .and(RouterFunctions.route(GET("/4"), request -> ServerResponse.ok().build()) + .withAttribute("baz", "qux")) + .and(RouterFunctions.nest(path("/5"), + RouterFunctions.route(method(GET), request -> ServerResponse.ok().build()) + .withAttribute("foo", "n3")) + .withAttribute("foo", "n2"))) + .withAttribute("foo", "n1")); AttributesTestVisitor visitor = new AttributesTestVisitor(); route.accept(visitor); - assertThat(visitor.visitCount()).isEqualTo(2); + assertThat(visitor.routerFunctionsAttributes()).containsExactly( + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar"), Map.of("foo", "n1")), + List.of(Map.of("baz", "qux"), Map.of("foo", "n1")), + List.of(Map.of("foo", "n3"), Map.of("foo", "n2"), Map.of("foo", "n1")) + ); + assertThat(visitor.visitCount()).isEqualTo(7); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/AttributesTestVisitor.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/AttributesTestVisitor.java index 84e031518b..0cf0e64db7 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/AttributesTestVisitor.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/AttributesTestVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,42 +16,58 @@ package org.springframework.web.servlet.function; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.springframework.core.io.Resource; import org.springframework.lang.Nullable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.entry; - /** * @author Arjen Poutsma */ class AttributesTestVisitor implements RouterFunctions.Visitor { + private Deque> nestedAttributes = new LinkedList<>(); + @Nullable private Map attributes; + private List>> routerFunctionsAttributes = new LinkedList<>(); + private int visitCount; + public List>> routerFunctionsAttributes() { + return this.routerFunctionsAttributes; + } + public int visitCount() { return this.visitCount; } @Override public void startNested(RequestPredicate predicate) { + nestedAttributes.addFirst(attributes); + attributes = null; } @Override public void endNested(RequestPredicate predicate) { + attributes = nestedAttributes.removeFirst(); } @Override public void route(RequestPredicate predicate, HandlerFunction handlerFunction) { - assertThat(this.attributes).isNotNull(); - this.attributes = null; + Stream> current = Optional.ofNullable(attributes).stream(); + Stream> nested = nestedAttributes.stream().filter(Objects::nonNull); + routerFunctionsAttributes.add(Stream.concat(current, nested).collect(Collectors.toUnmodifiableList())); + attributes = null; } @Override @@ -60,7 +76,6 @@ class AttributesTestVisitor implements RouterFunctions.Visitor { @Override public void attributes(Map attributes) { - assertThat(attributes).containsExactly(entry("foo", "bar"), entry("baz", "qux")); this.attributes = attributes; this.visitCount++; } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionBuilderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionBuilderTests.java index d535e00ee6..c9a497a2a4 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionBuilderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionBuilderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ package org.springframework.web.servlet.function; import java.io.IOException; +import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; @@ -226,12 +228,28 @@ class RouterFunctionBuilderTests { atts.put("foo", "bar"); atts.put("baz", "qux"); }) + .path("/atts", b1 -> b1 + .GET("/3", request -> ServerResponse.ok().build()) + .withAttribute("foo", "bar") + .GET("/4", request -> ServerResponse.ok().build()) + .withAttribute("baz", "qux") + .path("/5", b2 -> b2 + .GET(request -> ServerResponse.ok().build()) + .withAttribute("foo", "n3")) + .withAttribute("foo", "n2") + ) + .withAttribute("foo", "n1") .build(); AttributesTestVisitor visitor = new AttributesTestVisitor(); route.accept(visitor); - assertThat(visitor.visitCount()).isEqualTo(2); + assertThat(visitor.routerFunctionsAttributes()).containsExactly( + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar"), Map.of("foo", "n1")), + List.of(Map.of("baz", "qux"), Map.of("foo", "n1")), + List.of(Map.of("foo", "n3"), Map.of("foo", "n2"), Map.of("foo", "n1")) + ); + assertThat(visitor.visitCount()).isEqualTo(7); } - - } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionTests.java index e3cba1677f..e175051a5a 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/RouterFunctionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2020 the original author or authors. + * Copyright 2002-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,8 @@ package org.springframework.web.servlet.function; import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.Optional; import org.junit.jupiter.api.Test; @@ -24,7 +26,10 @@ import org.junit.jupiter.api.Test; import org.springframework.web.servlet.handler.PathPatternsTestUtils; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.http.HttpMethod.GET; import static org.springframework.web.servlet.function.RequestPredicates.GET; +import static org.springframework.web.servlet.function.RequestPredicates.method; +import static org.springframework.web.servlet.function.RequestPredicates.path; /** * @author Arjen Poutsma @@ -120,11 +125,28 @@ class RouterFunctionTests { .withAttributes(atts -> { atts.put("foo", "bar"); atts.put("baz", "qux"); - })); + })) + .and(RouterFunctions.nest(path("/atts"), + RouterFunctions.route(GET("/3"), request -> ServerResponse.ok().build()) + .withAttribute("foo", "bar") + .and(RouterFunctions.route(GET("/4"), request -> ServerResponse.ok().build()) + .withAttribute("baz", "qux")) + .and(RouterFunctions.nest(path("/5"), + RouterFunctions.route(method(GET), request -> ServerResponse.ok().build()) + .withAttribute("foo", "n3")) + .withAttribute("foo", "n2"))) + .withAttribute("foo", "n1")); AttributesTestVisitor visitor = new AttributesTestVisitor(); route.accept(visitor); - assertThat(visitor.visitCount()).isEqualTo(2); + assertThat(visitor.routerFunctionsAttributes()).containsExactly( + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar", "baz", "qux")), + List.of(Map.of("foo", "bar"), Map.of("foo", "n1")), + List.of(Map.of("baz", "qux"), Map.of("foo", "n1")), + List.of(Map.of("foo", "n3"), Map.of("foo", "n2"), Map.of("foo", "n1")) + ); + assertThat(visitor.visitCount()).isEqualTo(7); }