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"))); + } + }