Add builder to MockServerWebExchange

Issue: SPR-16772
This commit is contained in:
Rossen Stoyanchev 2018-05-10 09:59:02 -04:00
parent d82b0e37df
commit eef592d901
9 changed files with 242 additions and 185 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -15,15 +15,20 @@
*/ */
package org.springframework.mock.web.server; package org.springframework.mock.web.server;
import reactor.core.publisher.Mono;
import org.springframework.http.codec.ServerCodecConfigurer; import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.lang.Nullable;
import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
import org.springframework.mock.http.server.reactive.MockServerHttpResponse; import org.springframework.mock.http.server.reactive.MockServerHttpResponse;
import org.springframework.web.server.WebSession;
import org.springframework.web.server.adapter.DefaultServerWebExchange; import org.springframework.web.server.adapter.DefaultServerWebExchange;
import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver; import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
import org.springframework.web.server.session.DefaultWebSessionManager; import org.springframework.web.server.session.DefaultWebSessionManager;
import org.springframework.web.server.session.WebSessionManager;
/** /**
* Variant of {@link DefaultServerWebExchange} for use in tests with * Extension of {@link DefaultServerWebExchange} for use in tests, along with
* {@link MockServerHttpRequest} and {@link MockServerHttpResponse}. * {@link MockServerHttpRequest} and {@link MockServerHttpResponse}.
* *
* <p>See static factory methods to create an instance. * <p>See static factory methods to create an instance.
@ -34,8 +39,8 @@ import org.springframework.web.server.session.DefaultWebSessionManager;
public final class MockServerWebExchange extends DefaultServerWebExchange { public final class MockServerWebExchange extends DefaultServerWebExchange {
private MockServerWebExchange(MockServerHttpRequest request) { private MockServerWebExchange(MockServerHttpRequest request, WebSessionManager sessionManager) {
super(request, new MockServerHttpResponse(), new DefaultWebSessionManager(), super(request, new MockServerHttpResponse(), sessionManager,
ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver()); ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
} }
@ -47,22 +52,88 @@ public final class MockServerWebExchange extends DefaultServerWebExchange {
/** /**
* Create a {@link MockServerWebExchange} from the given request. * Create a {@link MockServerWebExchange} from the given mock request.
* @param request the request to use. * @param request the request to use.
* @return the exchange * @return the exchange
*/ */
public static MockServerWebExchange from(MockServerHttpRequest request) { public static MockServerWebExchange from(MockServerHttpRequest request) {
return new MockServerWebExchange(request); return builder(request).build();
} }
/** /**
* A variant of {@link #from(MockServerHttpRequest)} that accepts a request * Variant of {@link #from(MockServerHttpRequest)} with a mock request builder.
* builder. Internally invokes the {@code build()} to build the request. * @param requestBuilder the builder for the mock request.
* @param requestBuilder the builder for the request.
* @return the exchange * @return the exchange
*/ */
public static MockServerWebExchange from(MockServerHttpRequest.BaseBuilder<?> requestBuilder) { public static MockServerWebExchange from(MockServerHttpRequest.BaseBuilder<?> requestBuilder) {
return new MockServerWebExchange(requestBuilder.build()); return builder(requestBuilder).build();
}
/**
* Create a {@link Builder} starting with the given mock request.
* @param request the request to use.
* @return the exchange builder
* @since 5.1
*/
public static MockServerWebExchange.Builder builder(MockServerHttpRequest request) {
return new MockServerWebExchange.Builder(request);
}
/**
* Variant of {@link #builder(MockServerHttpRequest)} with a mock request builder.
* @param requestBuilder the builder for the mock request.
* @return the exchange builder
* @since 5.1
*/
public static MockServerWebExchange.Builder builder(MockServerHttpRequest.BaseBuilder<?> requestBuilder) {
return new MockServerWebExchange.Builder(requestBuilder.build());
}
/**
* Builder for a {@link MockServerWebExchange}.
* @since 5.1
*/
public static class Builder {
private final MockServerHttpRequest request;
@Nullable
private WebSessionManager sessionManager;
public Builder(MockServerHttpRequest request) {
this.request = request;
}
/**
* Set the session to use for the exchange.
* <p>This is mutually exclusive with {@link #sessionManager(WebSessionManager)}.
* @param session the session to use
*/
public Builder session(WebSession session) {
this.sessionManager = exchange -> Mono.just(session);
return this;
}
/**
* Provide a {@code WebSessionManager} instance to use with the exchange.
* <p>This is mutually exclusive with {@link #session(WebSession)}.
* @param sessionManager the session manager to use
*/
public Builder sessionManager(WebSessionManager sessionManager) {
this.sessionManager = sessionManager;
return this;
}
/**
* Build the {@code MockServerWebExchange} instance.
*/
public MockServerWebExchange build() {
return new MockServerWebExchange(this.request,
this.sessionManager != null ? this.sessionManager : new DefaultWebSessionManager());
}
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -15,15 +15,20 @@
*/ */
package org.springframework.mock.web.test.server; package org.springframework.mock.web.test.server;
import reactor.core.publisher.Mono;
import org.springframework.http.codec.ServerCodecConfigurer; import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.lang.Nullable;
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse; import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
import org.springframework.web.server.WebSession;
import org.springframework.web.server.adapter.DefaultServerWebExchange; import org.springframework.web.server.adapter.DefaultServerWebExchange;
import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver; import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
import org.springframework.web.server.session.DefaultWebSessionManager; import org.springframework.web.server.session.DefaultWebSessionManager;
import org.springframework.web.server.session.WebSessionManager;
/** /**
* Variant of {@link DefaultServerWebExchange} for use in tests with * Extension of {@link DefaultServerWebExchange} for use in tests, along with
* {@link MockServerHttpRequest} and {@link MockServerHttpResponse}. * {@link MockServerHttpRequest} and {@link MockServerHttpResponse}.
* *
* <p>See static factory methods to create an instance. * <p>See static factory methods to create an instance.
@ -34,8 +39,8 @@ import org.springframework.web.server.session.DefaultWebSessionManager;
public final class MockServerWebExchange extends DefaultServerWebExchange { public final class MockServerWebExchange extends DefaultServerWebExchange {
private MockServerWebExchange(MockServerHttpRequest request) { private MockServerWebExchange(MockServerHttpRequest request, WebSessionManager sessionManager) {
super(request, new MockServerHttpResponse(), new DefaultWebSessionManager(), super(request, new MockServerHttpResponse(), sessionManager,
ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver()); ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
} }
@ -47,22 +52,88 @@ public final class MockServerWebExchange extends DefaultServerWebExchange {
/** /**
* Create a {@link MockServerWebExchange} from the given request. * Create a {@link MockServerWebExchange} from the given mock request.
* @param request the request to use. * @param request the request to use.
* @return the exchange * @return the exchange
*/ */
public static MockServerWebExchange from(MockServerHttpRequest request) { public static MockServerWebExchange from(MockServerHttpRequest request) {
return new MockServerWebExchange(request); return builder(request).build();
} }
/** /**
* A variant of {@link #from(MockServerHttpRequest)} that accepts a request * Variant of {@link #from(MockServerHttpRequest)} with a mock request builder.
* builder. Internally invokes the {@code build()} to build the request. * @param requestBuilder the builder for the mock request.
* @param requestBuilder the builder for the request.
* @return the exchange * @return the exchange
*/ */
public static MockServerWebExchange from(MockServerHttpRequest.BaseBuilder<?> requestBuilder) { public static MockServerWebExchange from(MockServerHttpRequest.BaseBuilder<?> requestBuilder) {
return new MockServerWebExchange(requestBuilder.build()); return builder(requestBuilder).build();
}
/**
* Create a {@link Builder} starting with the given mock request.
* @param request the request to use.
* @return the exchange builder
* @since 5.1
*/
public static MockServerWebExchange.Builder builder(MockServerHttpRequest request) {
return new MockServerWebExchange.Builder(request);
}
/**
* Variant of {@link #builder(MockServerHttpRequest)} with a mock request builder.
* @param requestBuilder the builder for the mock request.
* @return the exchange builder
* @since 5.1
*/
public static MockServerWebExchange.Builder builder(MockServerHttpRequest.BaseBuilder<?> requestBuilder) {
return new MockServerWebExchange.Builder(requestBuilder.build());
}
/**
* Builder for a {@link MockServerWebExchange}.
* @since 5.1
*/
public static class Builder {
private final MockServerHttpRequest request;
@Nullable
private WebSessionManager sessionManager;
public Builder(MockServerHttpRequest request) {
this.request = request;
}
/**
* Set the session to use for the exchange.
* <p>This is mutually exclusive with {@link #sessionManager(WebSessionManager)}.
* @param session the session to use
*/
public Builder session(WebSession session) {
this.sessionManager = exchange -> Mono.just(session);
return this;
}
/**
* Provide a {@code WebSessionManager} instance to use with the exchange.
* <p>This is mutually exclusive with {@link #session(WebSession)}.
* @param sessionManager the session manager to use
*/
public Builder sessionManager(WebSessionManager sessionManager) {
this.sessionManager = sessionManager;
return this;
}
/**
* Build the {@code MockServerWebExchange} instance.
*/
public MockServerWebExchange build() {
return new MockServerWebExchange(this.request,
this.sessionManager != null ? this.sessionManager : new DefaultWebSessionManager());
}
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,6 +17,7 @@ package org.springframework.web.server.session;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -33,14 +34,10 @@ import org.springframework.web.server.WebSession;
import org.springframework.web.server.adapter.DefaultServerWebExchange; import org.springframework.web.server.adapter.DefaultServerWebExchange;
import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver; import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.*;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/** /**
* Unit tests for {@link DefaultWebSessionManager}. * Unit tests for {@link DefaultWebSessionManager}.
@ -50,15 +47,15 @@ import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class DefaultWebSessionManagerTests { public class DefaultWebSessionManagerTests {
private DefaultWebSessionManager manager; private DefaultWebSessionManager sessionManager;
private ServerWebExchange exchange; private ServerWebExchange exchange;
@Mock @Mock
private WebSessionIdResolver idResolver; private WebSessionIdResolver sessionIdResolver;
@Mock @Mock
private WebSessionStore store; private WebSessionStore sessionStore;
@Mock @Mock
private WebSession createSession; private WebSession createSession;
@ -69,78 +66,75 @@ public class DefaultWebSessionManagerTests {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
when(this.store.createWebSession()).thenReturn(Mono.just(this.createSession));
when(this.createSession.save()).thenReturn(Mono.empty()); when(this.createSession.save()).thenReturn(Mono.empty());
when(this.createSession.getId()).thenReturn("create-session-id");
when(this.updateSession.getId()).thenReturn("update-session-id"); when(this.updateSession.getId()).thenReturn("update-session-id");
this.manager = new DefaultWebSessionManager(); when(this.sessionStore.createWebSession()).thenReturn(Mono.just(this.createSession));
this.manager.setSessionIdResolver(this.idResolver); when(this.sessionStore.retrieveSession(this.updateSession.getId())).thenReturn(Mono.just(this.updateSession));
this.manager.setSessionStore(this.store);
this.sessionManager = new DefaultWebSessionManager();
this.sessionManager.setSessionIdResolver(this.sessionIdResolver);
this.sessionManager.setSessionStore(this.sessionStore);
MockServerHttpRequest request = MockServerHttpRequest.get("/path").build(); MockServerHttpRequest request = MockServerHttpRequest.get("/path").build();
MockServerHttpResponse response = new MockServerHttpResponse(); MockServerHttpResponse response = new MockServerHttpResponse();
this.exchange = new DefaultServerWebExchange(request, response, this.manager, this.exchange = new DefaultServerWebExchange(request, response, this.sessionManager,
ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver()); ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
} }
@Test @Test
public void getSessionSaveWhenCreatedAndNotStartedThenNotSaved() throws Exception { public void getSessionSaveWhenCreatedAndNotStartedThenNotSaved() {
when(this.idResolver.resolveSessionIds(this.exchange)).thenReturn(Collections.emptyList());
WebSession session = this.manager.getSession(this.exchange).block(); when(this.sessionIdResolver.resolveSessionIds(this.exchange)).thenReturn(Collections.emptyList());
WebSession session = this.sessionManager.getSession(this.exchange).block();
this.exchange.getResponse().setComplete().block(); this.exchange.getResponse().setComplete().block();
assertSame(this.createSession, session);
assertFalse(session.isStarted()); assertFalse(session.isStarted());
assertFalse(session.isExpired()); assertFalse(session.isExpired());
verify(this.createSession, never()).save(); verify(this.createSession, never()).save();
verify(this.idResolver, never()).setSessionId(any(), any()); verify(this.sessionIdResolver, never()).setSessionId(any(), any());
} }
@Test @Test
public void getSessionSaveWhenCreatedAndStartedThenSavesAndSetsId() throws Exception { public void getSessionSaveWhenCreatedAndStartedThenSavesAndSetsId() {
when(this.idResolver.resolveSessionIds(this.exchange)).thenReturn(Collections.emptyList());
WebSession session = this.manager.getSession(this.exchange).block(); when(this.sessionIdResolver.resolveSessionIds(this.exchange)).thenReturn(Collections.emptyList());
WebSession session = this.sessionManager.getSession(this.exchange).block();
assertSame(this.createSession, session);
String sessionId = this.createSession.getId();
when(this.createSession.isStarted()).thenReturn(true); when(this.createSession.isStarted()).thenReturn(true);
this.exchange.getResponse().setComplete().block(); this.exchange.getResponse().setComplete().block();
String id = session.getId(); verify(this.sessionStore).createWebSession();
verify(this.store).createWebSession(); verify(this.sessionIdResolver).setSessionId(any(), eq(sessionId));
verify(this.createSession).save();
verify(this.idResolver).setSessionId(any(), eq(id));
}
@Test
public void exchangeWhenResponseSetCompleteThenSavesAndSetsId() throws Exception {
when(this.idResolver.resolveSessionIds(this.exchange)).thenReturn(Collections.emptyList());
String id = this.createSession.getId();
WebSession session = this.manager.getSession(this.exchange).block();
when(this.createSession.isStarted()).thenReturn(true);
this.exchange.getResponse().setComplete().block();
verify(this.idResolver).setSessionId(any(), eq(id));
verify(this.createSession).save(); verify(this.createSession).save();
} }
@Test @Test
public void existingSession() throws Exception { public void existingSession() {
String id = this.updateSession.getId();
when(this.store.retrieveSession(id)).thenReturn(Mono.just(this.updateSession));
when(this.idResolver.resolveSessionIds(this.exchange)).thenReturn(Collections.singletonList(id));
WebSession actual = this.manager.getSession(this.exchange).block(); String sessionId = this.updateSession.getId();
when(this.sessionIdResolver.resolveSessionIds(this.exchange)).thenReturn(Collections.singletonList(sessionId));
WebSession actual = this.sessionManager.getSession(this.exchange).block();
assertNotNull(actual); assertNotNull(actual);
assertEquals(id, actual.getId()); assertEquals(sessionId, actual.getId());
} }
@Test @Test
public void multipleSessionIds() throws Exception { public void multipleSessionIds() {
WebSession existing = this.updateSession;
String id = existing.getId(); List<String> ids = Arrays.asList("not-this", "not-that", this.updateSession.getId());
when(this.store.retrieveSession(any())).thenReturn(Mono.empty()); when(this.sessionStore.retrieveSession("not-this")).thenReturn(Mono.empty());
when(this.store.retrieveSession(id)).thenReturn(Mono.just(existing)); when(this.sessionStore.retrieveSession("not-that")).thenReturn(Mono.empty());
when(this.idResolver.resolveSessionIds(this.exchange)).thenReturn(Arrays.asList("neither-this", "nor-that", id)); when(this.sessionIdResolver.resolveSessionIds(this.exchange)).thenReturn(ids);
WebSession actual = this.sessionManager.getSession(this.exchange).block();
WebSession actual = this.manager.getSession(this.exchange).block();
assertNotNull(actual); assertNotNull(actual);
assertEquals(existing.getId(), actual.getId()); assertEquals(this.updateSession.getId(), actual.getId());
} }
} }

View File

@ -55,7 +55,7 @@ public class InMemoryWebSessionStoreTests {
} }
@Test @Test
public void retrieveExpiredSession() throws Exception { public void retrieveExpiredSession() {
WebSession session = this.store.createWebSession().block(); WebSession session = this.store.createWebSession().block();
assertNotNull(session); assertNotNull(session);
session.getAttributes().put("foo", "bar"); session.getAttributes().put("foo", "bar");
@ -73,7 +73,7 @@ public class InMemoryWebSessionStoreTests {
} }
@Test @Test
public void lastAccessTimeIsUpdatedOnRetrieve() throws Exception { public void lastAccessTimeIsUpdatedOnRetrieve() {
WebSession session1 = this.store.createWebSession().block(); WebSession session1 = this.store.createWebSession().block();
assertNotNull(session1); assertNotNull(session1);
String id = session1.getId(); String id = session1.getId();
@ -91,7 +91,7 @@ public class InMemoryWebSessionStoreTests {
} }
@Test @Test
public void expirationChecks() throws Exception { public void expirationChecks() {
// Create 3 sessions // Create 3 sessions
WebSession session1 = this.store.createWebSession().block(); WebSession session1 = this.store.createWebSession().block();
assertNotNull(session1); assertNotNull(session1);
@ -131,6 +131,4 @@ public class InMemoryWebSessionStoreTests {
assertNotNull(this.store.retrieveSession(session5.getId()).block()); assertNotNull(this.store.retrieveSession(session5.getId()).block());
} }
} }

View File

@ -1,47 +0,0 @@
/*
* Copyright 2002-2016 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.server.session;
import reactor.core.publisher.Mono;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebSession;
/**
* Mock implementation of {@link WebSessionManager}.
*
* @author Rossen Stoyanchev
*/
public class MockWebSessionManager implements WebSessionManager {
private final Mono<WebSession> session;
public MockWebSessionManager(WebSession session) {
this(Mono.just(session));
}
public MockWebSessionManager(Mono<WebSession> session) {
this.session = session;
}
@Override
public Mono<WebSession> getSession(ServerWebExchange exchange) {
return this.session;
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -58,7 +58,7 @@ public class ServerWebExchangeArgumentResolverTests {
@Test @Test
public void supportsParameter() throws Exception { public void supportsParameter() {
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(ServerWebExchange.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(ServerWebExchange.class)));
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(ServerHttpRequest.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(ServerHttpRequest.class)));
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(ServerHttpResponse.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(ServerHttpResponse.class)));
@ -69,6 +69,7 @@ public class ServerWebExchangeArgumentResolverTests {
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(UriComponentsBuilder.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(UriComponentsBuilder.class)));
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(UriBuilder.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(UriBuilder.class)));
assertFalse(this.resolver.supportsParameter(this.testMethod.arg(WebSession.class)));
assertFalse(this.resolver.supportsParameter(this.testMethod.arg(String.class))); assertFalse(this.resolver.supportsParameter(this.testMethod.arg(String.class)));
try { try {
this.resolver.supportsParameter(this.testMethod.arg(Mono.class, ServerWebExchange.class)); this.resolver.supportsParameter(this.testMethod.arg(Mono.class, ServerWebExchange.class));
@ -82,7 +83,7 @@ public class ServerWebExchangeArgumentResolverTests {
} }
@Test @Test
public void resolveArgument() throws Exception { public void resolveArgument() {
testResolveArgument(this.testMethod.arg(ServerWebExchange.class), this.exchange); testResolveArgument(this.testMethod.arg(ServerWebExchange.class), this.exchange);
testResolveArgument(this.testMethod.arg(ServerHttpRequest.class), this.exchange.getRequest()); testResolveArgument(this.testMethod.arg(ServerHttpRequest.class), this.exchange.getRequest());
testResolveArgument(this.testMethod.arg(ServerHttpResponse.class), this.exchange.getResponse()); testResolveArgument(this.testMethod.arg(ServerHttpResponse.class), this.exchange.getResponse());
@ -97,7 +98,7 @@ public class ServerWebExchangeArgumentResolverTests {
} }
@Test @Test
public void resolveUriComponentsBuilder() throws Exception { public void resolveUriComponentsBuilder() {
MethodParameter param = this.testMethod.arg(UriComponentsBuilder.class); MethodParameter param = this.testMethod.arg(UriComponentsBuilder.class);
Object value = this.resolver.resolveArgument(param, new BindingContext(), this.exchange).block(); Object value = this.resolver.resolveArgument(param, new BindingContext(), this.exchange).block();

View File

@ -31,10 +31,8 @@ import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.core.annotation.SynthesizingMethodParameter;
import org.springframework.format.support.DefaultFormattingConversionService; import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse; import org.springframework.mock.web.test.server.MockServerWebExchange;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import org.springframework.web.bind.annotation.SessionAttribute; import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer;
@ -42,22 +40,12 @@ import org.springframework.web.reactive.BindingContext;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.ServerWebInputException; import org.springframework.web.server.ServerWebInputException;
import org.springframework.web.server.WebSession; import org.springframework.web.server.WebSession;
import org.springframework.web.server.adapter.DefaultServerWebExchange;
import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
import org.springframework.web.server.session.MockWebSessionManager;
import org.springframework.web.server.session.WebSessionManager;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.*;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/** /**
* Unit tests for {@link SessionAttributeMethodArgumentResolver}. * Unit tests for {@link SessionAttributeMethodArgumentResolver}.
*
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
*/ */
public class SessionAttributeMethodArgumentResolverTests { public class SessionAttributeMethodArgumentResolverTests {
@ -73,31 +61,25 @@ public class SessionAttributeMethodArgumentResolverTests {
@Before @Before
@SuppressWarnings("resource") @SuppressWarnings("resource")
public void setup() throws Exception { public void setup() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh(); context.refresh();
ReactiveAdapterRegistry adapterRegistry = ReactiveAdapterRegistry.getSharedInstance(); ReactiveAdapterRegistry adapterRegistry = ReactiveAdapterRegistry.getSharedInstance();
this.resolver = new SessionAttributeMethodArgumentResolver(context.getBeanFactory(), adapterRegistry); this.resolver = new SessionAttributeMethodArgumentResolver(context.getBeanFactory(), adapterRegistry);
this.session = mock(WebSession.class); this.session = mock(WebSession.class);
WebSessionManager sessionManager = new MockWebSessionManager(this.session); this.exchange = MockServerWebExchange.builder(MockServerHttpRequest.get("/")).session(this.session).build();
ServerHttpRequest request = MockServerHttpRequest.get("/").build();
this.exchange = new DefaultServerWebExchange(request, new MockServerHttpResponse(),
sessionManager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
this.handleMethod = ReflectionUtils.findMethod(getClass(), "handleWithSessionAttribute", (Class<?>[]) null); this.handleMethod = ReflectionUtils.findMethod(getClass(), "handleWithSessionAttribute", (Class<?>[]) null);
} }
@Test @Test
public void supportsParameter() throws Exception { public void supportsParameter() {
assertTrue(this.resolver.supportsParameter(new MethodParameter(this.handleMethod, 0))); assertTrue(this.resolver.supportsParameter(new MethodParameter(this.handleMethod, 0)));
assertFalse(this.resolver.supportsParameter(new MethodParameter(this.handleMethod, 4))); assertFalse(this.resolver.supportsParameter(new MethodParameter(this.handleMethod, 4)));
} }
@Test @Test
public void resolve() throws Exception { public void resolve() {
MethodParameter param = initMethodParameter(0); MethodParameter param = initMethodParameter(0);
Mono<Object> mono = this.resolver.resolveArgument(param, new BindingContext(), this.exchange); Mono<Object> mono = this.resolver.resolveArgument(param, new BindingContext(), this.exchange);
StepVerifier.create(mono).expectError(ServerWebInputException.class).verify(); StepVerifier.create(mono).expectError(ServerWebInputException.class).verify();
@ -109,7 +91,7 @@ public class SessionAttributeMethodArgumentResolverTests {
} }
@Test @Test
public void resolveWithName() throws Exception { public void resolveWithName() {
MethodParameter param = initMethodParameter(1); MethodParameter param = initMethodParameter(1);
Foo foo = new Foo(); Foo foo = new Foo();
when(this.session.getAttribute("specialFoo")).thenReturn(foo); when(this.session.getAttribute("specialFoo")).thenReturn(foo);
@ -118,7 +100,7 @@ public class SessionAttributeMethodArgumentResolverTests {
} }
@Test @Test
public void resolveNotRequired() throws Exception { public void resolveNotRequired() {
MethodParameter param = initMethodParameter(2); MethodParameter param = initMethodParameter(2);
Mono<Object> mono = this.resolver.resolveArgument(param, new BindingContext(), this.exchange); Mono<Object> mono = this.resolver.resolveArgument(param, new BindingContext(), this.exchange);
assertNull(mono.block()); assertNull(mono.block());
@ -131,7 +113,7 @@ public class SessionAttributeMethodArgumentResolverTests {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Test @Test
public void resolveOptional() throws Exception { public void resolveOptional() {
MethodParameter param = initMethodParameter(3); MethodParameter param = initMethodParameter(3);
Optional<Object> actual = (Optional<Object>) this.resolver Optional<Object> actual = (Optional<Object>) this.resolver
.resolveArgument(param, new BindingContext(), this.exchange).block(); .resolveArgument(param, new BindingContext(), this.exchange).block();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,7 +17,6 @@
package org.springframework.web.reactive.result.method.annotation; package org.springframework.web.reactive.result.method.annotation;
import java.time.Duration;
import java.util.HashSet; import java.util.HashSet;
import org.junit.Test; import org.junit.Test;
@ -28,12 +27,8 @@ import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.server.WebSession; import org.springframework.web.server.WebSession;
import org.springframework.web.server.session.InMemoryWebSessionStore; import org.springframework.web.server.session.InMemoryWebSessionStore;
import static java.util.Arrays.asList; import static java.util.Arrays.*;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/** /**
* Test fixture with {@link SessionAttributesHandler}. * Test fixture with {@link SessionAttributesHandler}.
@ -46,7 +41,7 @@ public class SessionAttributesHandlerTests {
@Test @Test
public void isSessionAttribute() throws Exception { public void isSessionAttribute() {
assertTrue(this.sessionAttributesHandler.isHandlerSessionAttribute("attr1", String.class)); assertTrue(this.sessionAttributesHandler.isHandlerSessionAttribute("attr1", String.class));
assertTrue(this.sessionAttributesHandler.isHandlerSessionAttribute("attr2", String.class)); assertTrue(this.sessionAttributesHandler.isHandlerSessionAttribute("attr2", String.class));
assertTrue(this.sessionAttributesHandler.isHandlerSessionAttribute("simple", TestBean.class)); assertTrue(this.sessionAttributesHandler.isHandlerSessionAttribute("simple", TestBean.class));
@ -54,8 +49,8 @@ public class SessionAttributesHandlerTests {
} }
@Test @Test
public void retrieveAttributes() throws Exception { public void retrieveAttributes() {
WebSession session = new InMemoryWebSessionStore().createWebSession().block(Duration.ZERO); WebSession session = new InMemoryWebSessionStore().createWebSession().block();
assertNotNull(session); assertNotNull(session);
session.getAttributes().put("attr1", "value1"); session.getAttributes().put("attr1", "value1");
@ -76,8 +71,8 @@ public class SessionAttributesHandlerTests {
} }
@Test @Test
public void cleanupAttributes() throws Exception { public void cleanupAttributes() {
WebSession session = new InMemoryWebSessionStore().createWebSession().block(Duration.ZERO); WebSession session = new InMemoryWebSessionStore().createWebSession().block();
assertNotNull(session); assertNotNull(session);
session.getAttributes().put("attr1", "value1"); session.getAttributes().put("attr1", "value1");
@ -98,8 +93,8 @@ public class SessionAttributesHandlerTests {
} }
@Test @Test
public void storeAttributes() throws Exception { public void storeAttributes() {
WebSession session = new InMemoryWebSessionStore().createWebSession().block(Duration.ZERO); WebSession session = new InMemoryWebSessionStore().createWebSession().block();
assertNotNull(session); assertNotNull(session);
ModelMap model = new ModelMap(); ModelMap model = new ModelMap();

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -21,21 +21,15 @@ import reactor.core.publisher.Mono;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.ReactiveAdapterRegistry;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest; import org.springframework.mock.http.server.reactive.test.MockServerHttpRequest;
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse; import org.springframework.mock.web.test.server.MockServerWebExchange;
import org.springframework.web.method.ResolvableMethod; import org.springframework.web.method.ResolvableMethod;
import org.springframework.web.reactive.BindingContext; import org.springframework.web.reactive.BindingContext;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebSession; import org.springframework.web.server.WebSession;
import org.springframework.web.server.adapter.DefaultServerWebExchange;
import org.springframework.web.server.i18n.AcceptHeaderLocaleContextResolver;
import org.springframework.web.server.session.WebSessionManager;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.*;
import static org.junit.Assert.assertSame; import static org.mockito.Mockito.*;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
/** /**
* Unit tests for {@link WebSessionArgumentResolver}. * Unit tests for {@link WebSessionArgumentResolver}.
@ -50,7 +44,7 @@ public class WebSessionArgumentResolverTests {
@Test @Test
public void supportsParameter() throws Exception { public void supportsParameter() {
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(WebSession.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(WebSession.class)));
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(Mono.class, WebSession.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(Mono.class, WebSession.class)));
assertTrue(this.resolver.supportsParameter(this.testMethod.arg(Single.class, WebSession.class))); assertTrue(this.resolver.supportsParameter(this.testMethod.arg(Single.class, WebSession.class)));
@ -58,14 +52,12 @@ public class WebSessionArgumentResolverTests {
@Test @Test
public void resolverArgument() throws Exception { public void resolverArgument() {
BindingContext context = new BindingContext(); BindingContext context = new BindingContext();
WebSession session = mock(WebSession.class); WebSession session = mock(WebSession.class);
WebSessionManager manager = exchange -> Mono.just(session);
MockServerHttpRequest request = MockServerHttpRequest.get("/").build(); MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
ServerWebExchange exchange = new DefaultServerWebExchange(request, new MockServerHttpResponse(), ServerWebExchange exchange = MockServerWebExchange.builder(request).session(session).build();
manager, ServerCodecConfigurer.create(), new AcceptHeaderLocaleContextResolver());
MethodParameter param = this.testMethod.arg(WebSession.class); MethodParameter param = this.testMethod.arg(WebSession.class);
Object actual = this.resolver.resolveArgument(param, context, exchange).block(); Object actual = this.resolver.resolveArgument(param, context, exchange).block();