Add support for reusing a snippet to document common elements
This commit updates all of the Snippet implementations that take one or more descriptors to provide an and method that can be used to create a new Snippet that has additional descriptors. Closes gh-168
This commit is contained in:
@@ -445,6 +445,45 @@ When documenting HTTP Headers, the test will fail if a documented header is not
|
||||
the request or response.
|
||||
|
||||
|
||||
|
||||
[[documenting-your-api-reusing-snippets]]
|
||||
=== Reusing snippets
|
||||
|
||||
It's common for an API that's being documented to have some features that are common
|
||||
across several of its resources. To avoid repetition when documenting such resources a
|
||||
`Snippet` configured with the common elements can be reused.
|
||||
|
||||
First, create the `Snippet` that describes the common elements. For example:
|
||||
|
||||
[source,java,indent=0]
|
||||
----
|
||||
include::{examples-dir}/com/example/SnippetReuse.java[tags=field]
|
||||
----
|
||||
|
||||
Second, use this snippet and add further descriptors that are resource-specific. For
|
||||
example:
|
||||
|
||||
[source,java,indent=0,role="primary"]
|
||||
.MockMvc
|
||||
----
|
||||
include::{examples-dir}/com/example/mockmvc/MockMvcSnippetReuse.java[tags=use]
|
||||
----
|
||||
<1> Reuse the `pagingLinks` `Snippet` calling `and` to add descriptors that are specific
|
||||
to the resource that is being documented.
|
||||
|
||||
[source,java,indent=0,role="secondary"]
|
||||
.REST Assured
|
||||
----
|
||||
include::{examples-dir}/com/example/restassured/RestAssuredSnippetReuse.java[tags=use]
|
||||
----
|
||||
<1> Reuse the `pagingLinks` `Snippet` calling `and` to add descriptors that are specific
|
||||
to the resource that is being documented.
|
||||
|
||||
The result of the example is that links with the rels `first`, `last`, `next`, `previous`,
|
||||
`alpha`, and `bravo` are all documented.
|
||||
|
||||
|
||||
|
||||
[[documenting-your-api-constraints]]
|
||||
=== Documenting constraints
|
||||
|
||||
|
||||
34
docs/src/test/java/com/example/SnippetReuse.java
Normal file
34
docs/src/test/java/com/example/SnippetReuse.java
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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 com.example;
|
||||
|
||||
import org.springframework.restdocs.hypermedia.LinksSnippet;
|
||||
|
||||
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel;
|
||||
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.links;
|
||||
|
||||
public class SnippetReuse {
|
||||
|
||||
// tag::field[]
|
||||
protected final LinksSnippet pagingLinks = links(
|
||||
linkWithRel("first").optional().description("The first page of results"),
|
||||
linkWithRel("last").optional().description("The last page of results"),
|
||||
linkWithRel("next").optional().description("The next page of results"),
|
||||
linkWithRel("prev").optional().description("The previous page of results"));
|
||||
// end::field[]
|
||||
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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 com.example.mockmvc;
|
||||
|
||||
import com.example.SnippetReuse;
|
||||
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
|
||||
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel;
|
||||
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
|
||||
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
public class MockMvcSnippetReuse extends SnippetReuse {
|
||||
|
||||
private MockMvc mockMvc;
|
||||
|
||||
public void documentation() throws Exception {
|
||||
// tag::use[]
|
||||
this.mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
|
||||
.andExpect(status().isOk())
|
||||
.andDo(document("example", this.pagingLinks.and( // <1>
|
||||
linkWithRel("alpha").description("Link to the alpha resource"),
|
||||
linkWithRel("bravo").description("Link to the bravo resource"))));
|
||||
// end::use[]
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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 com.example.restassured;
|
||||
|
||||
import com.example.SnippetReuse;
|
||||
import com.jayway.restassured.RestAssured;
|
||||
import com.jayway.restassured.specification.RequestSpecification;
|
||||
|
||||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel;
|
||||
import static org.springframework.restdocs.restassured.RestAssuredRestDocumentation.document;
|
||||
|
||||
public class RestAssuredSnippetReuse extends SnippetReuse {
|
||||
|
||||
private RequestSpecification spec;
|
||||
|
||||
public void documentation() throws Exception {
|
||||
// tag::use[]
|
||||
RestAssured.given(this.spec)
|
||||
.accept("application/json")
|
||||
.filter(document("example", this.pagingLinks.and( // <1>
|
||||
linkWithRel("alpha").description("Link to the alpha resource"),
|
||||
linkWithRel("bravo").description("Link to the bravo resource"))))
|
||||
.get("/").then().assertThat().statusCode(is(200));
|
||||
// end::use[]
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user