From 795446db7f0e989776490db001fbe7a3c2b31590 Mon Sep 17 00:00:00 2001 From: Florian Ferreira Date: Thu, 17 Oct 2019 16:03:21 +0200 Subject: [PATCH] Fixes gh-652, add possibility to documented endpoint with custom status --- .../restdocs/http/HttpResponseSnippet.java | 10 ++++++++-- .../restdocs/AbstractSnippetTests.java | 4 ++++ .../restdocs/http/HttpResponseSnippetTests.java | 5 +++++ .../restdocs/test/SnippetConditions.java | 13 +++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpResponseSnippet.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpResponseSnippet.java index 8ad1654e7..b24f92ad2 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpResponseSnippet.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/http/HttpResponseSnippet.java @@ -59,9 +59,15 @@ protected Map createModel(Operation operation) { HttpStatus status = response.getStatus(); Map model = new HashMap<>(); model.put("responseBody", responseBody(response)); - model.put("statusCode", status.value()); - model.put("statusReason", status.getReasonPhrase()); model.put("headers", headers(response)); + if (status != null) { + model.put("statusCode", status.value()); + model.put("statusReason", status.getReasonPhrase()); + } + else { + model.put("statusCode", response.getStatusCode()); + model.put("statusReason", "Http custom status."); + } return model; } diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/AbstractSnippetTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/AbstractSnippetTests.java index f04afe0be..b27b31421 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/AbstractSnippetTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/AbstractSnippetTests.java @@ -89,6 +89,10 @@ public HttpResponseCondition httpResponse(HttpStatus responseStatus) { return SnippetConditions.httpResponse(this.templateFormat, responseStatus); } + public HttpResponseCondition httpResponse(Integer responseStatusCode, String responseStatusReason) { + return SnippetConditions.httpResponse(this.templateFormat, responseStatusCode, responseStatusReason); + } + protected FileSystemResource snippetResource(String name) { return new FileSystemResource( "src/test/resources/custom-snippet-templates/" + this.templateFormat.getId() + "/" + name + ".snippet"); diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpResponseSnippetTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpResponseSnippetTests.java index bf701b432..41d4f1e04 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpResponseSnippetTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/http/HttpResponseSnippetTests.java @@ -97,4 +97,9 @@ public void responseWithCustomSnippetAttributes() throws IOException { assertThat(this.generatedSnippets.httpResponse()).contains("Title for the response"); } + @Test + public void responseWithCustomStatus() throws IOException { + new HttpResponseSnippet().document(this.operationBuilder.response().status(215).build()); + assertThat(this.generatedSnippets.httpResponse()).is(httpResponse(215,"Http custom status.")); + } } diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/test/SnippetConditions.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/test/SnippetConditions.java index 657b3e572..2c3905811 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/test/SnippetConditions.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/test/SnippetConditions.java @@ -71,6 +71,13 @@ public static HttpResponseCondition httpResponse(TemplateFormat format, HttpStat return new HttpResponseCondition(status, new MarkdownCodeBlockCondition<>("http"), 2); } + public static HttpResponseCondition httpResponse(TemplateFormat format, Integer responseStatusCode, String responseStatusReason) { + if ("adoc".equals(format.getFileExtension())) { + return new HttpResponseCondition(responseStatusCode, responseStatusReason, new AsciidoctorCodeBlockCondition<>("http", "nowrap"), 3); + } + return new HttpResponseCondition(responseStatusCode, responseStatusReason, new MarkdownCodeBlockCondition<>("http"), 2); + } + @SuppressWarnings({ "rawtypes" }) public static CodeBlockCondition codeBlock(TemplateFormat format, String language) { if ("adoc".equals(format.getFileExtension())) { @@ -235,6 +242,12 @@ private HttpResponseCondition(HttpStatus status, CodeBlockCondition delegate, this.content(""); } + private HttpResponseCondition(Integer responseStatusCode, String responseStatusReason, CodeBlockCondition delegate, int headerOffset) { + super(delegate, headerOffset); + this.content("HTTP/1.1 " + responseStatusCode + " " + responseStatusReason); + this.content(""); + } + } /**