Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
73a2a4b3
Commit
73a2a4b3
authored
Jan 06, 2021
by
Madhura Bhave
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Consider context-path for WebTestClient baseUrl
Fixes gh-24168
parent
52e47c42
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
212 additions
and
2 deletions
+212
-2
WebTestClientContextCustomizer.java
...t/web/reactive/server/WebTestClientContextCustomizer.java
+46
-2
WebTestClientContextCustomizerWithCustomBasePathTests.java
...ebTestClientContextCustomizerWithCustomBasePathTests.java
+87
-0
WebTestClientContextCustomizerWithCustomContextPathTests.java
...estClientContextCustomizerWithCustomContextPathTests.java
+79
-0
No files found.
spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/web/reactive/server/WebTestClientContextCustomizer.java
View file @
73a2a4b3
/*
* Copyright 2012-20
19
the original author or authors.
* Copyright 2012-20
21
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.
...
...
@@ -30,6 +30,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import
org.springframework.beans.factory.support.BeanDefinitionRegistry
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
;
import
org.springframework.beans.factory.support.RootBeanDefinition
;
import
org.springframework.boot.WebApplicationType
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.boot.test.context.SpringBootTest.WebEnvironment
;
import
org.springframework.boot.web.codec.CodecCustomizer
;
...
...
@@ -45,7 +46,10 @@ import org.springframework.core.annotation.MergedAnnotations.SearchStrategy;
import
org.springframework.test.context.ContextCustomizer
;
import
org.springframework.test.context.MergedContextConfiguration
;
import
org.springframework.test.web.reactive.server.WebTestClient
;
import
org.springframework.util.ClassUtils
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.context.WebApplicationContext
;
import
org.springframework.web.reactive.function.client.ExchangeStrategies
;
/**
...
...
@@ -132,6 +136,10 @@ class WebTestClientContextCustomizer implements ContextCustomizer {
private
WebTestClient
object
;
private
static
final
String
SERVLET_APPLICATION_CONTEXT_CLASS
=
"org.springframework.web.context.WebApplicationContext"
;
private
static
final
String
REACTIVE_APPLICATION_CONTEXT_CLASS
=
"org.springframework.boot.web.reactive.context.ReactiveWebApplicationContext"
;
@Override
public
void
setApplicationContext
(
ApplicationContext
applicationContext
)
throws
BeansException
{
this
.
applicationContext
=
applicationContext
;
...
...
@@ -158,13 +166,49 @@ class WebTestClientContextCustomizer implements ContextCustomizer {
private
WebTestClient
createWebTestClient
()
{
boolean
sslEnabled
=
isSslEnabled
(
this
.
applicationContext
);
String
port
=
this
.
applicationContext
.
getEnvironment
().
getProperty
(
"local.server.port"
,
"8080"
);
String
baseUrl
=
(
sslEnabled
?
"https"
:
"http"
)
+
"://localhost:"
+
port
;
String
baseUrl
=
getBaseUrl
(
sslEnabled
,
port
)
;
WebTestClient
.
Builder
builder
=
WebTestClient
.
bindToServer
();
customizeWebTestClientBuilder
(
builder
,
this
.
applicationContext
);
customizeWebTestClientCodecs
(
builder
,
this
.
applicationContext
);
return
builder
.
baseUrl
(
baseUrl
).
build
();
}
private
String
getBaseUrl
(
boolean
sslEnabled
,
String
port
)
{
String
basePath
=
deduceBasePath
();
String
pathSegment
=
(
StringUtils
.
hasText
(
basePath
))
?
basePath
:
""
;
return
(
sslEnabled
?
"https"
:
"http"
)
+
"://localhost:"
+
port
+
pathSegment
;
}
private
String
deduceBasePath
()
{
WebApplicationType
webApplicationType
=
deduceFromApplicationContext
(
this
.
applicationContext
.
getClass
());
if
(
webApplicationType
==
WebApplicationType
.
REACTIVE
)
{
return
this
.
applicationContext
.
getEnvironment
().
getProperty
(
"spring.webflux.base-path"
);
}
else
if
(
webApplicationType
==
WebApplicationType
.
SERVLET
)
{
return
((
WebApplicationContext
)
this
.
applicationContext
).
getServletContext
().
getContextPath
();
}
return
null
;
}
static
WebApplicationType
deduceFromApplicationContext
(
Class
<?>
applicationContextClass
)
{
if
(
isAssignable
(
SERVLET_APPLICATION_CONTEXT_CLASS
,
applicationContextClass
))
{
return
WebApplicationType
.
SERVLET
;
}
if
(
isAssignable
(
REACTIVE_APPLICATION_CONTEXT_CLASS
,
applicationContextClass
))
{
return
WebApplicationType
.
REACTIVE
;
}
return
WebApplicationType
.
NONE
;
}
private
static
boolean
isAssignable
(
String
target
,
Class
<?>
type
)
{
try
{
return
ClassUtils
.
resolveClassName
(
target
,
null
).
isAssignableFrom
(
type
);
}
catch
(
Throwable
ex
)
{
return
false
;
}
}
private
boolean
isSslEnabled
(
ApplicationContext
context
)
{
try
{
AbstractReactiveWebServerFactory
webServerFactory
=
context
...
...
spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/reactive/server/WebTestClientContextCustomizerWithCustomBasePathTests.java
0 → 100644
View file @
73a2a4b3
/*
* Copyright 2012-2021 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
*
* https://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
.
boot
.
test
.
web
.
reactive
.
server
;
import
java.util.Collections
;
import
java.util.Map
;
import
org.junit.jupiter.api.Test
;
import
reactor.core.publisher.Mono
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.boot.web.embedded.tomcat.TomcatReactiveWebServerFactory
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.core.io.buffer.DefaultDataBufferFactory
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.server.reactive.ContextPathCompositeHandler
;
import
org.springframework.http.server.reactive.HttpHandler
;
import
org.springframework.http.server.reactive.ServerHttpRequest
;
import
org.springframework.http.server.reactive.ServerHttpResponse
;
import
org.springframework.test.context.TestPropertySource
;
import
org.springframework.test.web.reactive.server.WebTestClient
;
/**
* Tests for {@link WebTestClientContextCustomizer} with a custom base path for a reactive
* web application.
*
* @author Madhura Bhave
*/
@SpringBootTest
(
webEnvironment
=
SpringBootTest
.
WebEnvironment
.
RANDOM_PORT
,
properties
=
"spring.main.web-application-type=reactive"
)
@TestPropertySource
(
properties
=
"spring.webflux.base-path=/test"
)
class
WebTestClientContextCustomizerWithCustomBasePathTests
{
@Autowired
private
WebTestClient
webTestClient
;
@Test
void
test
()
{
this
.
webTestClient
.
get
().
uri
(
"/hello"
).
exchange
().
expectBody
(
String
.
class
).
isEqualTo
(
"hello world"
);
}
@Configuration
(
proxyBeanMethods
=
false
)
static
class
TestConfig
{
@Bean
TomcatReactiveWebServerFactory
webServerFactory
()
{
return
new
TomcatReactiveWebServerFactory
(
0
);
}
@Bean
HttpHandler
httpHandler
()
{
TestHandler
httpHandler
=
new
TestHandler
();
Map
<
String
,
HttpHandler
>
handlersMap
=
Collections
.
singletonMap
(
"/test"
,
httpHandler
);
return
new
ContextPathCompositeHandler
(
handlersMap
);
}
}
static
class
TestHandler
implements
HttpHandler
{
private
static
final
DefaultDataBufferFactory
factory
=
new
DefaultDataBufferFactory
();
@Override
public
Mono
<
Void
>
handle
(
ServerHttpRequest
request
,
ServerHttpResponse
response
)
{
response
.
setStatusCode
(
HttpStatus
.
OK
);
return
response
.
writeWith
(
Mono
.
just
(
factory
.
wrap
(
"hello world"
.
getBytes
())));
}
}
}
spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/web/reactive/server/WebTestClientContextCustomizerWithCustomContextPathTests.java
0 → 100644
View file @
73a2a4b3
/*
* Copyright 2012-2021 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
*
* https://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
.
boot
.
test
.
web
.
reactive
.
server
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.test.context.TestPropertySource
;
import
org.springframework.test.web.reactive.server.WebTestClient
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.servlet.DispatcherServlet
;
/**
* Tests for {@link WebTestClientContextCustomizer} with a custom context path for a
* servlet web application.
*
* @author Madhura Bhave
*/
@SpringBootTest
(
webEnvironment
=
SpringBootTest
.
WebEnvironment
.
RANDOM_PORT
)
@TestPropertySource
(
properties
=
"server.servlet.context-path=/test"
)
class
WebTestClientContextCustomizerWithCustomContextPathTests
{
@Autowired
private
WebTestClient
webTestClient
;
@Test
void
test
()
{
this
.
webTestClient
.
get
().
uri
(
"/hello"
).
exchange
().
expectBody
(
String
.
class
).
isEqualTo
(
"hello world"
);
}
@Configuration
(
proxyBeanMethods
=
false
)
@Import
(
TestController
.
class
)
static
class
TestConfig
{
@Bean
TomcatServletWebServerFactory
webServerFactory
()
{
TomcatServletWebServerFactory
factory
=
new
TomcatServletWebServerFactory
(
0
);
factory
.
setContextPath
(
"/test"
);
return
factory
;
}
@Bean
DispatcherServlet
dispatcherServlet
()
{
return
new
DispatcherServlet
();
}
}
@RestController
static
class
TestController
{
@GetMapping
(
"/hello"
)
String
hello
()
{
return
"hello world"
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment