From 07bca1875f337b4fe087fb84be512682c0cc9844 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 20 Oct 2017 10:56:07 +0100 Subject: [PATCH] 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 --- .../snippet/StandardWriterResolver.java | 15 ++++-- .../snippet/StandardWriterResolverTests.java | 47 ++++++++++++++++++- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/snippet/StandardWriterResolver.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/snippet/StandardWriterResolver.java index 2b414493..51235a5e 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/snippet/StandardWriterResolver.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/snippet/StandardWriterResolver.java @@ -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); diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/snippet/StandardWriterResolverTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/snippet/StandardWriterResolverTests.java index a4d3460d..9dc871a1 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/snippet/StandardWriterResolverTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/snippet/StandardWriterResolverTests.java @@ -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"))); + } + }