Replace placeholders in snippet name as well as the operation name

Previously, StandardWriterResolver only replaced placeholders in the
operation name. This meant that the name and location of generated
snippets was unnecessarily limited.

This commit makes things more flexible by updating
StandardWriterResolver to replace placeholders in the snippet name
as well.

Closes gh-403
This commit is contained in:
Andy Wilkinson
2017-10-20 10:56:07 +01:00
parent f62b0f3ce7
commit 07bca1875f
2 changed files with 56 additions and 6 deletions

View File

@@ -82,11 +82,12 @@ public final class StandardWriterResolver implements WriterResolver {
@Override
public Writer resolve(String operationName, String snippetName,
RestDocumentationContext context) throws IOException {
File outputFile = resolveFile(
this.propertyPlaceholderHelper.replacePlaceholders(operationName,
this.placeholderResolverFactory.create(context)),
snippetName + "." + this.templateFormat.getFileExtension(), context);
PlaceholderResolver placeholderResolver = this.placeholderResolverFactory
.create(context);
String outputDirectory = replacePlaceholders(placeholderResolver, operationName);
String fileName = replacePlaceholders(placeholderResolver, snippetName) + "."
+ this.templateFormat.getFileExtension();
File outputFile = resolveFile(outputDirectory, fileName, context);
if (outputFile != null) {
createDirectoriesIfNecessary(outputFile);
return new OutputStreamWriter(new FileOutputStream(outputFile),
@@ -103,6 +104,10 @@ public final class StandardWriterResolver implements WriterResolver {
this.encoding = encoding;
}
private String replacePlaceholders(PlaceholderResolver resolver, String input) {
return this.propertyPlaceholderHelper.replacePlaceholders(input, resolver);
}
File resolveFile(String outputDirectory, String fileName,
RestDocumentationContext context) {
File outputFile = new File(outputDirectory, fileName);

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -17,14 +17,23 @@
package org.springframework.restdocs.snippet;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Writer;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.springframework.restdocs.ManualRestDocumentation;
import org.springframework.restdocs.RestDocumentationContext;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
@@ -35,6 +44,9 @@ import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor
*/
public class StandardWriterResolverTests {
@Rule
public final TemporaryFolder temp = new TemporaryFolder();
private final PlaceholderResolverFactory placeholderResolverFactory = mock(
PlaceholderResolverFactory.class);
@@ -69,6 +81,30 @@ public class StandardWriterResolverTests {
is(new File(absolutePath, "baz.txt")));
}
@Test
public void placeholdersAreResolvedInOperationName() throws IOException {
File outputDirectory = this.temp.newFolder();
RestDocumentationContext context = createContext(
outputDirectory.getAbsolutePath());
PlaceholderResolver resolver = mock(PlaceholderResolver.class);
given(resolver.resolvePlaceholder("a")).willReturn("alpha");
given(this.placeholderResolverFactory.create(context)).willReturn(resolver);
Writer writer = this.resolver.resolve("{a}", "bravo", context);
assertSnippetLocation(writer, new File(outputDirectory, "alpha/bravo.adoc"));
}
@Test
public void placeholdersAreResolvedInSnippetName() throws IOException {
File outputDirectory = this.temp.newFolder();
RestDocumentationContext context = createContext(
outputDirectory.getAbsolutePath());
PlaceholderResolver resolver = mock(PlaceholderResolver.class);
given(resolver.resolvePlaceholder("b")).willReturn("bravo");
given(this.placeholderResolverFactory.create(context)).willReturn(resolver);
Writer writer = this.resolver.resolve("alpha", "{b}", context);
assertSnippetLocation(writer, new File(outputDirectory, "alpha/bravo.adoc"));
}
private RestDocumentationContext createContext(String outputDir) {
ManualRestDocumentation manualRestDocumentation = new ManualRestDocumentation(
outputDir);
@@ -77,4 +113,13 @@ public class StandardWriterResolverTests {
return context;
}
private void assertSnippetLocation(Writer writer, File expectedLocation)
throws IOException {
writer.write("test");
writer.flush();
assertThat(expectedLocation.exists(), is(true));
assertThat(FileCopyUtils.copyToString(new FileReader(expectedLocation)),
is(equalTo("test")));
}
}