/*
* Copyright 2012-2017 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.actuate.autoconfigure;
import java.net.URL;
import com.jayway.jsonpath.JsonPath;
import net.minidev.json.JSONArray;
import org.junit.After;
import org.junit.Test;
import org.springframework.boot.test.util.EnvironmentTestUtils;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer;
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.ResponseEntity;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Integration tests for the href of the actuator's curies link
*
* @author Andy Wilkinson
*/
public class BootCuriesHrefIntegrationTests {
private AnnotationConfigServletWebServerApplicationContext context;
@After
public void closeContext() {
this.context.close();
}
@Test
public void basicCuriesHref() {
int port = load("endpoints.docs.curies.enabled:true", "server.port:0");
assertThat(getCurieHref("http://localhost:" + port + "/application")).isEqualTo(
"http://localhost:" + port + "/application/docs/#spring_boot_actuator__{rel}");
}
@Test
public void curiesHrefWithCustomContextPath() {
int port = load("endpoints.docs.curies.enabled:true", "server.port:0",
"server.servlet.context-path:/context");
assertThat(getCurieHref("http://localhost:" + port + "/context/application"))
.isEqualTo("http://localhost:" + port
+ "/context/application/docs/#spring_boot_actuator__{rel}");
}
@Test
public void curiesHrefWithCustomServletPath() {
int port = load("endpoints.docs.curies.enabled:true", "server.port:0",
"server.servlet.path:/servlet");
assertThat(getCurieHref("http://localhost:" + port + "/servlet/application"))
.isEqualTo("http://localhost:" + port
+ "/servlet/application/docs/#spring_boot_actuator__{rel}");
}
@Test
public void curiesHrefWithCustomServletAndContextPaths() {
int port = load("endpoints.docs.curies.enabled:true", "server.port:0",
"server.servlet.context-path:/context", "server.servlet.path:/servlet");
assertThat(getCurieHref("http://localhost:" + port + "/context/servlet/application"))
.isEqualTo("http://localhost:" + port
+ "/context/servlet/application/docs/#spring_boot_actuator__{rel}");
}
@Test
public void curiesHrefWithCustomServletContextAndManagementContextPaths() {
int port = load("endpoints.docs.curies.enabled:true", "server.port:0",
"server.servlet.context-path:/context", "server.servlet.path:/servlet",
"management.context-path:/management");
assertThat(getCurieHref("http://localhost:" + port
+ "/context/servlet/management/")).isEqualTo("http://localhost:" + port
+ "/context/servlet/management/docs/#spring_boot_actuator__{rel}");
}
@Test
public void serverPathsAreIgnoredWithSeparateManagementPort() {
int port = load("endpoints.docs.curies.enabled:true", "server.port:0",
"server.servlet.context-path:/context", "server.servlet.path:/servlet",
"management.port:0");
assertThat(getCurieHref("http://localhost:" + port + "/application/")).isEqualTo(
"http://localhost:" + port + "/application/docs/#spring_boot_actuator__{rel}");
}
@Test
public void managementContextPathWithSeparateManagementPort() {
int port = load("endpoints.docs.curies.enabled:true",
"management.context-path:/management", "server.port:0",
"management.port:0");
assertThat(getCurieHref("http://localhost:" + port + "/management/"))
.isEqualTo("http://localhost:" + port
+ "/management/docs/#spring_boot_actuator__{rel}");
}
private int load(String... properties) {
this.context = new AnnotationConfigServletWebServerApplicationContext();
this.context.setClassLoader(new ClassLoader(getClass().getClassLoader()) {
@Override
public URL getResource(String name) {
if ("META-INF/resources/spring-boot-actuator/docs/index.html"
.equals(name)) {
return super.getResource("actuator-docs-index.html");
}
return super.getResource(name);
}
});
EnvironmentTestUtils.addEnvironment(this.context, properties);
this.context.register(TestConfiguration.class);
new ServerPortInfoApplicationContextInitializer().initialize(this.context);
this.context.refresh();
return Integer.parseInt(
this.context.getEnvironment().getProperty("local.management.port"));
}
private String getCurieHref(String uri) {
ResponseEntity<String> response = new TestRestTemplate().getForEntity(uri,
String.class);
JSONArray bootCuriesHrefs = JsonPath.parse(response.getBody())
.read("_links.curies[?(@.name == 'boot')].href");
assertThat(bootCuriesHrefs).hasSize(1);
return (String) bootCuriesHrefs.get(0);
}
@Configuration
@MinimalActuatorHypermediaApplication
static class TestConfiguration {
}
}