Skip to content

Commit

Permalink
Merge pull request #797 from achimgrimm
Browse files Browse the repository at this point in the history
* gh-797:
  Polish "Specify language derived from Content-Type in body snippets"
  Specify language derived from Content-Type in body snippets

Closes gh-797
  • Loading branch information
wilkinsona committed Jul 15, 2022
2 parents bdba92e + aa9cef9 commit 15980d7
Show file tree
Hide file tree
Showing 10 changed files with 114 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2019 the original author or authors.
* Copyright 2014-2022 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.
Expand Down Expand Up @@ -31,6 +31,7 @@
* document a RESTful resource's request or response body.
*
* @author Andy Wilkinson
* @author Achim Grimm
*/
public abstract class AbstractBodySnippet extends TemplatedSnippet {

Expand Down Expand Up @@ -73,13 +74,15 @@ protected AbstractBodySnippet(String name, String type, PayloadSubsectionExtract
protected Map<String, Object> createModel(Operation operation) {
try {
MediaType contentType = getContentType(operation);
String language = determineLanguage(contentType);
byte[] content = getContent(operation);
if (this.subsectionExtractor != null) {
content = this.subsectionExtractor.extractSubsection(content, contentType);
}
Charset charset = extractCharset(contentType);
String body = (charset != null) ? new String(content, charset) : new String(content);
Map<String, Object> model = new HashMap<>();
model.put("language", language);
model.put("body", body);
return model;
}
Expand All @@ -88,6 +91,13 @@ protected Map<String, Object> createModel(Operation operation) {
}
}

private String determineLanguage(MediaType contentType) {
if (contentType == null) {
return null;
}
return (contentType.getSubtypeSuffix() != null) ? contentType.getSubtypeSuffix() : contentType.getSubtype();
}

private Charset extractCharset(MediaType contentType) {
if (contentType == null) {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[source,options="nowrap"]
[source{{#language}},{{language}}{{/language}},options="nowrap"]
----
{{body}}
----
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[source,options="nowrap"]
[source{{#language}},{{language}}{{/language}},options="nowrap"]
----
{{body}}
----
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[source,options="nowrap"]
[source{{#language}},{{language}}{{/language}},options="nowrap"]
----
{{body}}
----
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
```
```{{#language}}{{language}}{{/language}}
{{body}}
```
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
```
```{{#language}}{{language}}{{/language}}
{{body}}
```
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
```
```{{#language}}{{language}}{{/language}}
{{body}}
```
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2019 the original author or authors.
* Copyright 2014-2022 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.
Expand All @@ -20,6 +20,8 @@

import org.junit.Test;

import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.restdocs.AbstractSnippetTests;
import org.springframework.restdocs.templates.TemplateEngine;
import org.springframework.restdocs.templates.TemplateFormat;
Expand Down Expand Up @@ -61,6 +63,38 @@ public void requestPartWithNoBody() throws IOException {
.is(codeBlock(null, "nowrap").withContent(""));
}

@Test
public void requestPartWithJsonMediaType() throws IOException {
requestPartBody("one").document(this.operationBuilder.request("http://localhost").part("one", "".getBytes())
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body"))
.is(codeBlock("json", "nowrap").withContent(""));
}

@Test
public void requestPartWithJsonSubtypeMediaType() throws IOException {
requestPartBody("one").document(this.operationBuilder.request("http://localhost").part("one", "".getBytes())
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PROBLEM_JSON_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body"))
.is(codeBlock("json", "nowrap").withContent(""));
}

@Test
public void requestPartWithXmlMediaType() throws IOException {
requestPartBody("one").document(this.operationBuilder.request("http://localhost").part("one", "".getBytes())
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body"))
.is(codeBlock("xml", "nowrap").withContent(""));
}

@Test
public void requestPartWithXmlSubtypeMediaType() throws IOException {
requestPartBody("one").document(this.operationBuilder.request("http://localhost").part("one", "".getBytes())
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_ATOM_XML_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body"))
.is(codeBlock("xml", "nowrap").withContent(""));
}

@Test
public void subsectionOfRequestPartBody() throws IOException {
requestPartBody("one", beneathPath("a.b")).document(this.operationBuilder.request("http://localhost")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2019 the original author or authors.
* Copyright 2014-2022 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.
Expand All @@ -20,6 +20,8 @@

import org.junit.Test;

import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.restdocs.AbstractSnippetTests;
import org.springframework.restdocs.templates.TemplateEngine;
import org.springframework.restdocs.templates.TemplateFormat;
Expand Down Expand Up @@ -58,6 +60,34 @@ public void requestWithNoBody() throws IOException {
assertThat(this.generatedSnippets.snippet("request-body")).is(codeBlock(null, "nowrap").withContent(""));
}

@Test
public void requestWithJsonMediaType() throws IOException {
requestBody().document(this.operationBuilder.request("http://localhost")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-body")).is(codeBlock("json", "nowrap").withContent(""));
}

@Test
public void requestWithJsonSubtypeMediaType() throws IOException {
requestBody().document(this.operationBuilder.request("http://localhost")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PROBLEM_JSON_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-body")).is(codeBlock("json", "nowrap").withContent(""));
}

@Test
public void requestWithXmlMediaType() throws IOException {
requestBody().document(this.operationBuilder.request("http://localhost")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-body")).is(codeBlock("xml", "nowrap").withContent(""));
}

@Test
public void requestWithXmlSubtypeMediaType() throws IOException {
requestBody().document(this.operationBuilder.request("http://localhost")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_ATOM_XML_VALUE).build());
assertThat(this.generatedSnippets.snippet("request-body")).is(codeBlock("xml", "nowrap").withContent(""));
}

@Test
public void subsectionOfRequestBody() throws IOException {
requestBody(beneathPath("a.b")).document(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2014-2019 the original author or authors.
* Copyright 2014-2022 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.
Expand All @@ -20,6 +20,8 @@

import org.junit.Test;

import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.restdocs.AbstractSnippetTests;
import org.springframework.restdocs.templates.TemplateEngine;
import org.springframework.restdocs.templates.TemplateFormat;
Expand Down Expand Up @@ -58,6 +60,34 @@ public void responseWithNoBody() throws IOException {
assertThat(this.generatedSnippets.snippet("response-body")).is(codeBlock(null, "nowrap").withContent(""));
}

@Test
public void responseWithJsonMediaType() throws IOException {
new ResponseBodySnippet().document(this.operationBuilder.response()
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build());
assertThat(this.generatedSnippets.snippet("response-body")).is(codeBlock("json", "nowrap").withContent(""));
}

@Test
public void responseWithJsonSubtypeMediaType() throws IOException {
new ResponseBodySnippet().document(this.operationBuilder.response()
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PROBLEM_JSON_VALUE).build());
assertThat(this.generatedSnippets.snippet("response-body")).is(codeBlock("json", "nowrap").withContent(""));
}

@Test
public void responseWithXmlMediaType() throws IOException {
new ResponseBodySnippet().document(this.operationBuilder.response()
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_XML_VALUE).build());
assertThat(this.generatedSnippets.snippet("response-body")).is(codeBlock("xml", "nowrap").withContent(""));
}

@Test
public void responseWithXmlSubtypeMediaType() throws IOException {
new ResponseBodySnippet().document(this.operationBuilder.response()
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_ATOM_XML_VALUE).build());
assertThat(this.generatedSnippets.snippet("response-body")).is(codeBlock("xml", "nowrap").withContent(""));
}

@Test
public void subsectionOfResponseBody() throws IOException {
responseBody(beneathPath("a.b"))
Expand Down

0 comments on commit 15980d7

Please # to comment.