Browse Source
Provide variants of `WebClient` and `WebConnectionHtmlUnitDriver` that
automatically resolve relative URLs to "localhost:${local.server.port}".
Fixes gh-5472
pull/5488/head
8 changed files with 407 additions and 2 deletions
@ -0,0 +1,55 @@
@@ -0,0 +1,55 @@
|
||||
/* |
||||
* Copyright 2012-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.boot.test.web.htmlunit; |
||||
|
||||
import java.io.IOException; |
||||
import java.net.MalformedURLException; |
||||
|
||||
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; |
||||
import com.gargoylesoftware.htmlunit.Page; |
||||
import com.gargoylesoftware.htmlunit.WebClient; |
||||
|
||||
import org.springframework.core.env.Environment; |
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* {@link WebClient} will automatically prefix relative URLs with |
||||
* <code>localhost:${local.server.port}</code>. |
||||
* |
||||
* @author Phillip Webb |
||||
* @since 1.4.0 |
||||
*/ |
||||
public class LocalHostWebClient extends WebClient { |
||||
|
||||
private final Environment environment; |
||||
|
||||
public LocalHostWebClient(Environment environment) { |
||||
Assert.notNull(environment, "Environment must not be null"); |
||||
this.environment = environment; |
||||
} |
||||
|
||||
@Override |
||||
public <P extends Page> P getPage(String url) |
||||
throws IOException, FailingHttpStatusCodeException, MalformedURLException { |
||||
if (url.startsWith("/")) { |
||||
String port = this.environment.getProperty("local.server.port", "8080"); |
||||
url = "http://localhost:" + port + url; |
||||
} |
||||
return super.getPage(url); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
/* |
||||
* Copyright 2012-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. |
||||
*/ |
||||
|
||||
/** |
||||
* HtmlUnit support classes. |
||||
*/ |
||||
package org.springframework.boot.test.web.htmlunit; |
||||
@ -0,0 +1,72 @@
@@ -0,0 +1,72 @@
|
||||
/* |
||||
* Copyright 2012-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.boot.test.web.htmlunit.webdriver; |
||||
|
||||
import com.gargoylesoftware.htmlunit.BrowserVersion; |
||||
import org.openqa.selenium.Capabilities; |
||||
|
||||
import org.springframework.core.env.Environment; |
||||
import org.springframework.test.web.servlet.htmlunit.webdriver.WebConnectionHtmlUnitDriver; |
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* {@link LocalHostWebConnectionHtmlUnitDriver} will automatically prefix relative URLs |
||||
* with <code>localhost:${local.server.port}</code>. |
||||
* |
||||
* @author Phillip Webb |
||||
* @since 1.4.0 |
||||
*/ |
||||
public class LocalHostWebConnectionHtmlUnitDriver extends WebConnectionHtmlUnitDriver { |
||||
|
||||
private final Environment environment; |
||||
|
||||
public LocalHostWebConnectionHtmlUnitDriver(Environment environment) { |
||||
Assert.notNull(environment, "Environment must not be null"); |
||||
this.environment = environment; |
||||
} |
||||
|
||||
public LocalHostWebConnectionHtmlUnitDriver(Environment environment, |
||||
boolean enableJavascript) { |
||||
super(enableJavascript); |
||||
Assert.notNull(environment, "Environment must not be null"); |
||||
this.environment = environment; |
||||
} |
||||
|
||||
public LocalHostWebConnectionHtmlUnitDriver(Environment environment, |
||||
BrowserVersion browserVersion) { |
||||
super(browserVersion); |
||||
Assert.notNull(environment, "Environment must not be null"); |
||||
this.environment = environment; |
||||
} |
||||
|
||||
public LocalHostWebConnectionHtmlUnitDriver(Environment environment, |
||||
Capabilities capabilities) { |
||||
super(capabilities); |
||||
Assert.notNull(environment, "Environment must not be null"); |
||||
this.environment = environment; |
||||
} |
||||
|
||||
@Override |
||||
public void get(String url) { |
||||
if (url.startsWith("/")) { |
||||
String port = this.environment.getProperty("local.server.port", "8080"); |
||||
url = "http://localhost:" + port + url; |
||||
} |
||||
super.get(url); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
/* |
||||
* Copyright 2012-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. |
||||
*/ |
||||
|
||||
/** |
||||
* Selenium support classes. |
||||
*/ |
||||
package org.springframework.boot.test.web.htmlunit.webdriver; |
||||
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
/* |
||||
* Copyright 2012-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.boot.test.web.htmlunit; |
||||
|
||||
import java.io.IOException; |
||||
import java.net.MalformedURLException; |
||||
import java.net.URL; |
||||
|
||||
import com.gargoylesoftware.htmlunit.StringWebResponse; |
||||
import com.gargoylesoftware.htmlunit.WebClient; |
||||
import com.gargoylesoftware.htmlunit.WebConnection; |
||||
import com.gargoylesoftware.htmlunit.WebRequest; |
||||
import com.gargoylesoftware.htmlunit.WebResponse; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.ExpectedException; |
||||
import org.mockito.ArgumentCaptor; |
||||
import org.mockito.Captor; |
||||
import org.mockito.MockitoAnnotations; |
||||
|
||||
import org.springframework.mock.env.MockEnvironment; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.mockito.BDDMockito.given; |
||||
import static org.mockito.Matchers.any; |
||||
import static org.mockito.Mockito.mock; |
||||
import static org.mockito.Mockito.verify; |
||||
|
||||
/** |
||||
* Tests for {@link LocalHostWebClient}. |
||||
* |
||||
* @author Phillip Webb |
||||
*/ |
||||
@SuppressWarnings("resource") |
||||
public class LocalHostWebClientTests { |
||||
|
||||
@Rule |
||||
public ExpectedException thrown = ExpectedException.none(); |
||||
|
||||
@Captor |
||||
private ArgumentCaptor<WebRequest> requestCaptor; |
||||
|
||||
public LocalHostWebClientTests() { |
||||
MockitoAnnotations.initMocks(this); |
||||
} |
||||
|
||||
@Test |
||||
public void createWhenEnvironmentIsNullWillThrowException() throws Exception { |
||||
this.thrown.expect(IllegalArgumentException.class); |
||||
this.thrown.expectMessage("Environment must not be null"); |
||||
new LocalHostWebClient(null); |
||||
} |
||||
|
||||
@Test |
||||
public void getPageWhenUrlIsRelativeAndNoPortWillUseLocalhost8080() throws Exception { |
||||
MockEnvironment environment = new MockEnvironment(); |
||||
WebClient client = new LocalHostWebClient(environment); |
||||
WebConnection connection = mockConnection(); |
||||
client.setWebConnection(connection); |
||||
client.getPage("/test"); |
||||
verify(connection).getResponse(this.requestCaptor.capture()); |
||||
assertThat(this.requestCaptor.getValue().getUrl()) |
||||
.isEqualTo(new URL("http://localhost:8080/test")); |
||||
} |
||||
|
||||
@Test |
||||
public void getPageWhenUrlIsRelativeAndHasPortWillUseLocalhostPort() |
||||
throws Exception { |
||||
MockEnvironment environment = new MockEnvironment(); |
||||
environment.setProperty("local.server.port", "8181"); |
||||
WebClient client = new LocalHostWebClient(environment); |
||||
WebConnection connection = mockConnection(); |
||||
client.setWebConnection(connection); |
||||
client.getPage("/test"); |
||||
verify(connection).getResponse(this.requestCaptor.capture()); |
||||
assertThat(this.requestCaptor.getValue().getUrl()) |
||||
.isEqualTo(new URL("http://localhost:8181/test")); |
||||
} |
||||
|
||||
private WebConnection mockConnection() throws MalformedURLException, IOException { |
||||
WebConnection connection = mock(WebConnection.class); |
||||
WebResponse response = new StringWebResponse("test", new URL("http://localhost")); |
||||
given(connection.getResponse((WebRequest) any())).willReturn(response); |
||||
return connection; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,120 @@
@@ -0,0 +1,120 @@
|
||||
/* |
||||
* Copyright 2012-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.boot.test.web.htmlunit.webdriver; |
||||
|
||||
import java.net.URL; |
||||
|
||||
import com.gargoylesoftware.htmlunit.BrowserVersion; |
||||
import com.gargoylesoftware.htmlunit.WebClient; |
||||
import com.gargoylesoftware.htmlunit.WebClientOptions; |
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.junit.rules.ExpectedException; |
||||
import org.mockito.Mock; |
||||
import org.mockito.MockitoAnnotations; |
||||
import org.openqa.selenium.Capabilities; |
||||
|
||||
import org.springframework.core.env.Environment; |
||||
import org.springframework.mock.env.MockEnvironment; |
||||
|
||||
import static org.mockito.BDDMockito.given; |
||||
import static org.mockito.Mockito.mock; |
||||
import static org.mockito.Mockito.verify; |
||||
|
||||
/** |
||||
* Tests for {@link LocalHostWebConnectionHtmlUnitDriver}. |
||||
* |
||||
* @author Phillip Webb |
||||
*/ |
||||
public class LocalHostWebConnectionHtmlUnitDriverTests { |
||||
|
||||
@Rule |
||||
public ExpectedException thrown = ExpectedException.none(); |
||||
|
||||
@Mock |
||||
private WebClient webClient; |
||||
|
||||
public LocalHostWebConnectionHtmlUnitDriverTests() { |
||||
MockitoAnnotations.initMocks(this); |
||||
given(this.webClient.getOptions()).willReturn(new WebClientOptions()); |
||||
} |
||||
|
||||
@Test |
||||
public void createWhenEnvironmentIsNullWillThrowException() throws Exception { |
||||
this.thrown.expect(IllegalArgumentException.class); |
||||
this.thrown.expectMessage("Environment must not be null"); |
||||
new LocalHostWebConnectionHtmlUnitDriver(null); |
||||
} |
||||
|
||||
@Test |
||||
public void createWithJavascriptFlagWhenEnvironmentIsNullWillThrowException() |
||||
throws Exception { |
||||
this.thrown.expect(IllegalArgumentException.class); |
||||
this.thrown.expectMessage("Environment must not be null"); |
||||
new LocalHostWebConnectionHtmlUnitDriver(null, true); |
||||
} |
||||
|
||||
@Test |
||||
public void createWithBrowserVersionWhenEnvironmentIsNullWillThrowException() |
||||
throws Exception { |
||||
this.thrown.expect(IllegalArgumentException.class); |
||||
this.thrown.expectMessage("Environment must not be null"); |
||||
new LocalHostWebConnectionHtmlUnitDriver(null, BrowserVersion.CHROME); |
||||
} |
||||
|
||||
@Test |
||||
public void createWithCapabilitiesWhenEnvironmentIsNullWillThrowException() |
||||
throws Exception { |
||||
this.thrown.expect(IllegalArgumentException.class); |
||||
this.thrown.expectMessage("Environment must not be null"); |
||||
new LocalHostWebConnectionHtmlUnitDriver(null, mock(Capabilities.class)); |
||||
} |
||||
|
||||
@Test |
||||
public void getPageWhenUrlIsRelativeAndNoPortWillUseLocalhost8080() throws Exception { |
||||
MockEnvironment environment = new MockEnvironment(); |
||||
LocalHostWebConnectionHtmlUnitDriver driver = new TestLocalHostWebConnectionHtmlUnitDriver( |
||||
environment); |
||||
driver.get("/test"); |
||||
verify(this.webClient).getPage(new URL("http://localhost:8080/test")); |
||||
} |
||||
|
||||
@Test |
||||
public void getWhenUrlIsRelativeAndHasPortWillUseLocalhostPort() throws Exception { |
||||
MockEnvironment environment = new MockEnvironment(); |
||||
environment.setProperty("local.server.port", "8181"); |
||||
LocalHostWebConnectionHtmlUnitDriver driver = new TestLocalHostWebConnectionHtmlUnitDriver( |
||||
environment); |
||||
driver.get("/test"); |
||||
verify(this.webClient).getPage(new URL("http://localhost:8181/test")); |
||||
} |
||||
|
||||
public class TestLocalHostWebConnectionHtmlUnitDriver |
||||
extends LocalHostWebConnectionHtmlUnitDriver { |
||||
|
||||
public TestLocalHostWebConnectionHtmlUnitDriver(Environment environment) { |
||||
super(environment); |
||||
} |
||||
|
||||
@Override |
||||
public WebClient getWebClient() { |
||||
return LocalHostWebConnectionHtmlUnitDriverTests.this.webClient; |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue