Bumping versions
This commit is contained in:
@@ -66,37 +66,32 @@ public class RecursiveFilesConverter {
|
||||
private final boolean excludeBuildFolders;
|
||||
|
||||
@Deprecated
|
||||
public RecursiveFilesConverter(ContractVerifierConfigProperties props,
|
||||
StubGeneratorProvider holder) {
|
||||
this(props.getStubsOutputDir(), props.getContractsDslDir(),
|
||||
props.getExcludedFiles(), props.getIncludedContracts(),
|
||||
props.getExcludeBuildFolders(), holder);
|
||||
public RecursiveFilesConverter(ContractVerifierConfigProperties props, StubGeneratorProvider holder) {
|
||||
this(props.getStubsOutputDir(), props.getContractsDslDir(), props.getExcludedFiles(),
|
||||
props.getIncludedContracts(), props.getExcludeBuildFolders(), holder);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public RecursiveFilesConverter(ContractVerifierConfigProperties props) {
|
||||
this(props.getStubsOutputDir(), props.getContractsDslDir(),
|
||||
props.getExcludedFiles(), props.getIncludedContracts(),
|
||||
props.getExcludeBuildFolders(), null);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public RecursiveFilesConverter(ContractVerifierConfigProperties props,
|
||||
File stubsOutputDir) {
|
||||
this(stubsOutputDir, props.getContractsDslDir(), props.getExcludedFiles(),
|
||||
this(props.getStubsOutputDir(), props.getContractsDslDir(), props.getExcludedFiles(),
|
||||
props.getIncludedContracts(), props.getExcludeBuildFolders(), null);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public RecursiveFilesConverter(ContractVerifierConfigProperties props,
|
||||
File stubsOutputDir, StubGeneratorProvider holder) {
|
||||
this(stubsOutputDir, props.getContractsDslDir(), props.getExcludedFiles(),
|
||||
props.getIncludedContracts(), props.getExcludeBuildFolders(), holder);
|
||||
public RecursiveFilesConverter(ContractVerifierConfigProperties props, File stubsOutputDir) {
|
||||
this(stubsOutputDir, props.getContractsDslDir(), props.getExcludedFiles(), props.getIncludedContracts(),
|
||||
props.getExcludeBuildFolders(), null);
|
||||
}
|
||||
|
||||
public RecursiveFilesConverter(File stubsOutputDir, File contractsDslDir,
|
||||
List<String> excludedFiles, String includedContracts,
|
||||
boolean excludeBuildFolders, StubGeneratorProvider holder) {
|
||||
@Deprecated
|
||||
public RecursiveFilesConverter(ContractVerifierConfigProperties props, File stubsOutputDir,
|
||||
StubGeneratorProvider holder) {
|
||||
this(stubsOutputDir, props.getContractsDslDir(), props.getExcludedFiles(), props.getIncludedContracts(),
|
||||
props.getExcludeBuildFolders(), holder);
|
||||
}
|
||||
|
||||
public RecursiveFilesConverter(File stubsOutputDir, File contractsDslDir, List<String> excludedFiles,
|
||||
String includedContracts, boolean excludeBuildFolders, StubGeneratorProvider holder) {
|
||||
this.outMappingsDir = stubsOutputDir;
|
||||
this.contractsDslDir = contractsDslDir;
|
||||
this.excludedFiles = excludedFiles;
|
||||
@@ -105,20 +100,16 @@ public class RecursiveFilesConverter {
|
||||
this.holder = holder == null ? new StubGeneratorProvider() : holder;
|
||||
}
|
||||
|
||||
public RecursiveFilesConverter(File stubsOutputDir, File contractsDslDir,
|
||||
List<String> excludedFiles, String includedContracts,
|
||||
boolean excludeBuildFolders) {
|
||||
this(stubsOutputDir, contractsDslDir, excludedFiles, includedContracts,
|
||||
excludeBuildFolders, null);
|
||||
public RecursiveFilesConverter(File stubsOutputDir, File contractsDslDir, List<String> excludedFiles,
|
||||
String includedContracts, boolean excludeBuildFolders) {
|
||||
this(stubsOutputDir, contractsDslDir, excludedFiles, includedContracts, excludeBuildFolders, null);
|
||||
}
|
||||
|
||||
public void processFiles() {
|
||||
ContractFileScanner scanner = new ContractFileScannerBuilder()
|
||||
.baseDir(contractsDslDir).excluded(new HashSet<>(excludedFiles))
|
||||
.ignored(new HashSet<>()).included(new HashSet<>())
|
||||
ContractFileScanner scanner = new ContractFileScannerBuilder().baseDir(contractsDslDir)
|
||||
.excluded(new HashSet<>(excludedFiles)).ignored(new HashSet<>()).included(new HashSet<>())
|
||||
.includeMatcher(includedContracts).build();
|
||||
MultiValueMap<Path, ContractMetadata> contracts = scanner
|
||||
.findContractsRecursively();
|
||||
MultiValueMap<Path, ContractMetadata> contracts = scanner.findContractsRecursively();
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Found the following contracts " + contracts);
|
||||
}
|
||||
@@ -128,14 +119,12 @@ public class RecursiveFilesConverter {
|
||||
log.debug("Will create a stub for contract [" + contract + "]");
|
||||
}
|
||||
File sourceFile = contract.getPath().toFile();
|
||||
Collection<StubGenerator> stubGenerators = contract
|
||||
.getConvertedContract() != null
|
||||
? holder.allOrDefault(new DslToWireMockClientConverter())
|
||||
: holder.converterForName(sourceFile.getName());
|
||||
Collection<StubGenerator> stubGenerators = contract.getConvertedContract() != null
|
||||
? holder.allOrDefault(new DslToWireMockClientConverter())
|
||||
: holder.converterForName(sourceFile.getName());
|
||||
try {
|
||||
String path = sourceFile.getPath();
|
||||
if (excludeBuildFolders && (matchesPath(path, "target")
|
||||
|| matchesPath(path, "build"))) {
|
||||
if (excludeBuildFolders && (matchesPath(path, "target") || matchesPath(path, "build"))) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Exclude build folder is set. Path [" + path
|
||||
+ "] contains [target] or [build] in its path");
|
||||
@@ -149,8 +138,8 @@ public class RecursiveFilesConverter {
|
||||
int contractsSize = contract.getConvertedContract().size();
|
||||
Path entryKey = entry.getKey();
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Stub Generators [" + stubGenerators
|
||||
+ "] will convert contents of [" + entryKey + "]");
|
||||
log.debug(
|
||||
"Stub Generators [" + stubGenerators + "] will convert contents of [" + entryKey + "]");
|
||||
}
|
||||
|
||||
for (StubGenerator stubGenerator : stubGenerators) {
|
||||
@@ -159,23 +148,18 @@ public class RecursiveFilesConverter {
|
||||
if (convertedContent == null || convertedContent.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
Set<Map.Entry<Contract, String>> entrySet = convertedContent
|
||||
.entrySet();
|
||||
Iterator<Map.Entry<Contract, String>> iterator = entrySet
|
||||
.iterator();
|
||||
Set<Map.Entry<Contract, String>> entrySet = convertedContent.entrySet();
|
||||
Iterator<Map.Entry<Contract, String>> iterator = entrySet.iterator();
|
||||
int index = 0;
|
||||
while (iterator.hasNext()) {
|
||||
Map.Entry<Contract, String> content = iterator.next();
|
||||
Contract dsl = content.getKey();
|
||||
String converted = content.getValue();
|
||||
if (StringUtils.hasText(converted)) {
|
||||
Path absoluteTargetPath = createAndReturnTargetDirectory(
|
||||
sourceFile);
|
||||
File newJsonFile = createTargetFileWithProperName(
|
||||
stubGenerator, absoluteTargetPath, sourceFile,
|
||||
contractsSize, index, dsl);
|
||||
Files.write(newJsonFile.toPath(),
|
||||
Collections.singletonList(converted),
|
||||
Path absoluteTargetPath = createAndReturnTargetDirectory(sourceFile);
|
||||
File newJsonFile = createTargetFileWithProperName(stubGenerator, absoluteTargetPath,
|
||||
sourceFile, contractsSize, index, dsl);
|
||||
Files.write(newJsonFile.toPath(), Collections.singletonList(converted),
|
||||
StandardCharsets.UTF_8);
|
||||
}
|
||||
index = index + 1;
|
||||
@@ -198,8 +182,7 @@ public class RecursiveFilesConverter {
|
||||
private static <T> T last(Iterable<T> self) {
|
||||
Iterator<T> iterator = self.iterator();
|
||||
if (!iterator.hasNext()) {
|
||||
throw new NoSuchElementException(
|
||||
"Cannot access last() element from an empty Iterable");
|
||||
throw new NoSuchElementException("Cannot access last() element from an empty Iterable");
|
||||
}
|
||||
T result = null;
|
||||
while (iterator.hasNext()) {
|
||||
@@ -209,8 +192,7 @@ public class RecursiveFilesConverter {
|
||||
}
|
||||
|
||||
private boolean nullOrEmpty(ContractMetadata contract) {
|
||||
return contract.getConvertedContract() == null
|
||||
|| nullOrEmpty(contract.getConvertedContract());
|
||||
return contract.getConvertedContract() == null || nullOrEmpty(contract.getConvertedContract());
|
||||
}
|
||||
|
||||
private boolean nullOrEmpty(Collection collection) {
|
||||
@@ -222,8 +204,7 @@ public class RecursiveFilesConverter {
|
||||
}
|
||||
|
||||
private Path createAndReturnTargetDirectory(File sourceFile) {
|
||||
Path relativePath = Paths.get(contractsDslDir.toURI())
|
||||
.relativize(sourceFile.getParentFile().toPath());
|
||||
Path relativePath = Paths.get(contractsDslDir.toURI()).relativize(sourceFile.getParentFile().toPath());
|
||||
Path absoluteTargetPath = outMappingsDir.toPath().resolve(relativePath);
|
||||
try {
|
||||
Files.createDirectories(absoluteTargetPath);
|
||||
@@ -234,19 +215,16 @@ public class RecursiveFilesConverter {
|
||||
return absoluteTargetPath;
|
||||
}
|
||||
|
||||
private File createTargetFileWithProperName(StubGenerator stubGenerator,
|
||||
Path absoluteTargetPath, File sourceFile, int contractsSize, int index,
|
||||
Contract dsl) {
|
||||
private File createTargetFileWithProperName(StubGenerator stubGenerator, Path absoluteTargetPath, File sourceFile,
|
||||
int contractsSize, int index, Contract dsl) {
|
||||
String name = generateName(dsl, contractsSize, stubGenerator, sourceFile, index);
|
||||
File newJsonFile = new File(absoluteTargetPath.toFile(), name);
|
||||
log.info("Creating new stub [" + newJsonFile.getPath() + "]");
|
||||
return newJsonFile;
|
||||
}
|
||||
|
||||
private String generateName(Contract dsl, int contractsSize, StubGenerator converter,
|
||||
File sourceFile, int index) {
|
||||
String generatedName = converter
|
||||
.generateOutputFileNameForInput(sourceFile.getName());
|
||||
private String generateName(Contract dsl, int contractsSize, StubGenerator converter, File sourceFile, int index) {
|
||||
String generatedName = converter.generateOutputFileNameForInput(sourceFile.getName());
|
||||
boolean hasDot = NamesUtil.hasDot(generatedName);
|
||||
String extension = hasDot ? NamesUtil.afterLastDot(generatedName) : "";
|
||||
if (StringUtils.hasText(dsl.getName()) && StringUtils.hasText(extension)) {
|
||||
|
||||
@@ -55,8 +55,8 @@ public interface StubGenerator<T> {
|
||||
* @return the converted stub mapping
|
||||
*/
|
||||
default T postProcessStubMapping(T stubMapping, Contract contract) {
|
||||
List<StubPostProcessor> processors = StubPostProcessor.PROCESSORS.stream()
|
||||
.filter(p -> p.isApplicable(contract)).collect(Collectors.toList());
|
||||
List<StubPostProcessor> processors = StubPostProcessor.PROCESSORS.stream().filter(p -> p.isApplicable(contract))
|
||||
.collect(Collectors.toList());
|
||||
if (processors.isEmpty()) {
|
||||
return defaultStubMappingPostProcessing(stubMapping, contract);
|
||||
}
|
||||
|
||||
@@ -33,8 +33,7 @@ import org.springframework.core.io.support.SpringFactoriesLoader;
|
||||
public class StubGeneratorProvider {
|
||||
|
||||
public StubGeneratorProvider() {
|
||||
this.converters
|
||||
.addAll(SpringFactoriesLoader.loadFactories(StubGenerator.class, null));
|
||||
this.converters.addAll(SpringFactoriesLoader.loadFactories(StubGenerator.class, null));
|
||||
}
|
||||
|
||||
public StubGeneratorProvider(List<StubGenerator> converters) {
|
||||
@@ -42,14 +41,12 @@ public class StubGeneratorProvider {
|
||||
}
|
||||
|
||||
public Collection<StubGenerator> converterForName(final String fileName) {
|
||||
return this.converters.stream()
|
||||
.filter(stubGenerator -> stubGenerator.canHandleFileName(fileName))
|
||||
return this.converters.stream().filter(stubGenerator -> stubGenerator.canHandleFileName(fileName))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public Collection<StubGenerator> allOrDefault(StubGenerator defaultStubGenerator) {
|
||||
return this.converters.isEmpty() ? Collections.singletonList(defaultStubGenerator)
|
||||
: this.converters;
|
||||
return this.converters.isEmpty() ? Collections.singletonList(defaultStubGenerator) : this.converters;
|
||||
}
|
||||
|
||||
private final List<StubGenerator> converters = new ArrayList<StubGenerator>();
|
||||
|
||||
@@ -33,8 +33,7 @@ public interface StubPostProcessor<T> {
|
||||
/**
|
||||
* List of registered stub post processors.
|
||||
*/
|
||||
List<StubPostProcessor> PROCESSORS = SpringFactoriesLoader
|
||||
.loadFactories(StubPostProcessor.class, null);
|
||||
List<StubPostProcessor> PROCESSORS = SpringFactoriesLoader.loadFactories(StubPostProcessor.class, null);
|
||||
|
||||
/**
|
||||
* @param stubMapping - generated stub mapping
|
||||
|
||||
@@ -38,10 +38,8 @@ class DefaultWireMockStubPostProcessor implements WireMockStubPostProcessor {
|
||||
|
||||
@Override
|
||||
public StubMapping postProcess(StubMapping stubMapping, Contract contract) {
|
||||
WireMockMetaData wireMockMetaData = WireMockMetaData
|
||||
.fromMetadata(contract.getMetadata());
|
||||
StubMapping stubMappingFromMetadata = stubMappingFromMetadata(
|
||||
wireMockMetaData.getStubMapping());
|
||||
WireMockMetaData wireMockMetaData = WireMockMetaData.fromMetadata(contract.getMetadata());
|
||||
StubMapping stubMappingFromMetadata = stubMappingFromMetadata(wireMockMetaData.getStubMapping());
|
||||
stubMapping.setResponse(mergedResponse(stubMapping, stubMappingFromMetadata));
|
||||
if (stubMappingFromMetadata.getPostServeActions() != null) {
|
||||
setPostServeActions(stubMapping, stubMappingFromMetadata);
|
||||
@@ -52,94 +50,76 @@ class DefaultWireMockStubPostProcessor implements WireMockStubPostProcessor {
|
||||
return stubMapping;
|
||||
}
|
||||
|
||||
public void setPostServeActions(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public void setPostServeActions(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
Map<String, Parameters> postServeActions = stubMapping.getPostServeActions();
|
||||
postServeActions = postServeActions != null ? postServeActions : new HashMap<>();
|
||||
postServeActions.putAll(stubMappingFromMetadata.getPostServeActions());
|
||||
stubMapping.setPostServeActions(postServeActions);
|
||||
}
|
||||
|
||||
public void setMetadata(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public void setMetadata(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
Metadata metadata = stubMapping.getMetadata();
|
||||
metadata = metadata != null ? metadata : new Metadata();
|
||||
metadata.putAll(stubMappingFromMetadata.getPostServeActions());
|
||||
stubMapping.setMetadata(metadata);
|
||||
}
|
||||
|
||||
public ResponseDefinition mergedResponse(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
ResponseDefinition responseDefinition = new ResponseDefinition(
|
||||
stubMapping.getResponse().getStatus(),
|
||||
stubMapping.getResponse().getStatusMessage(),
|
||||
stubMapping.getResponse().getBody(),
|
||||
stubMapping.getResponse().getJsonBody(),
|
||||
stubMapping.getResponse().getBase64Body(),
|
||||
stubMapping.getResponse().getBodyFileName(),
|
||||
stubMapping.getResponse().getHeaders(),
|
||||
public ResponseDefinition mergedResponse(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
ResponseDefinition responseDefinition = new ResponseDefinition(stubMapping.getResponse().getStatus(),
|
||||
stubMapping.getResponse().getStatusMessage(), stubMapping.getResponse().getBody(),
|
||||
stubMapping.getResponse().getJsonBody(), stubMapping.getResponse().getBase64Body(),
|
||||
stubMapping.getResponse().getBodyFileName(), stubMapping.getResponse().getHeaders(),
|
||||
stubMapping.getResponse().getAdditionalProxyRequestHeaders(),
|
||||
fixedDelayMilliseconds(stubMapping, stubMappingFromMetadata),
|
||||
delayDistribution(stubMapping, stubMappingFromMetadata),
|
||||
chunkedDribbleDelay(stubMapping, stubMappingFromMetadata),
|
||||
proxyBaseUrl(stubMapping, stubMappingFromMetadata),
|
||||
fault(stubMapping, stubMappingFromMetadata),
|
||||
proxyBaseUrl(stubMapping, stubMappingFromMetadata), fault(stubMapping, stubMappingFromMetadata),
|
||||
transformers(stubMapping, stubMappingFromMetadata),
|
||||
transformerParameters(stubMapping, stubMappingFromMetadata),
|
||||
wasConfigured(stubMapping, stubMappingFromMetadata));
|
||||
return responseDefinition;
|
||||
}
|
||||
|
||||
public Boolean wasConfigured(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public Boolean wasConfigured(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().isFromConfiguredStub() != null
|
||||
? stubMappingFromMetadata.getResponse().isFromConfiguredStub()
|
||||
: stubMapping.getResponse().isFromConfiguredStub();
|
||||
}
|
||||
|
||||
public Parameters transformerParameters(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public Parameters transformerParameters(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().getTransformerParameters() != null
|
||||
? stubMappingFromMetadata.getResponse().getTransformerParameters()
|
||||
: stubMapping.getResponse().getTransformerParameters();
|
||||
}
|
||||
|
||||
public List<String> transformers(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public List<String> transformers(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().getTransformers() != null
|
||||
? stubMappingFromMetadata.getResponse().getTransformers()
|
||||
: stubMapping.getResponse().getTransformers();
|
||||
? stubMappingFromMetadata.getResponse().getTransformers() : stubMapping.getResponse().getTransformers();
|
||||
}
|
||||
|
||||
public Fault fault(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().getFault() != null
|
||||
? stubMappingFromMetadata.getResponse().getFault()
|
||||
: stubMapping.getResponse().getFault();
|
||||
? stubMappingFromMetadata.getResponse().getFault() : stubMapping.getResponse().getFault();
|
||||
}
|
||||
|
||||
public String proxyBaseUrl(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public String proxyBaseUrl(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().getProxyBaseUrl() != null
|
||||
? stubMappingFromMetadata.getResponse().getProxyBaseUrl()
|
||||
: stubMapping.getResponse().getProxyBaseUrl();
|
||||
? stubMappingFromMetadata.getResponse().getProxyBaseUrl() : stubMapping.getResponse().getProxyBaseUrl();
|
||||
}
|
||||
|
||||
public ChunkedDribbleDelay chunkedDribbleDelay(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public ChunkedDribbleDelay chunkedDribbleDelay(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().getChunkedDribbleDelay() != null
|
||||
? stubMappingFromMetadata.getResponse().getChunkedDribbleDelay()
|
||||
: stubMapping.getResponse().getChunkedDribbleDelay();
|
||||
}
|
||||
|
||||
public DelayDistribution delayDistribution(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public DelayDistribution delayDistribution(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().getDelayDistribution() != null
|
||||
? stubMappingFromMetadata.getResponse().getDelayDistribution()
|
||||
: stubMapping.getResponse().getDelayDistribution();
|
||||
}
|
||||
|
||||
public Integer fixedDelayMilliseconds(StubMapping stubMapping,
|
||||
StubMapping stubMappingFromMetadata) {
|
||||
public Integer fixedDelayMilliseconds(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
|
||||
return stubMappingFromMetadata.getResponse().getFixedDelayMilliseconds() != null
|
||||
? stubMappingFromMetadata.getResponse().getFixedDelayMilliseconds()
|
||||
: stubMapping.getResponse().getFixedDelayMilliseconds();
|
||||
@@ -154,27 +134,22 @@ class DefaultWireMockStubPostProcessor implements WireMockStubPostProcessor {
|
||||
}
|
||||
else if (wiremock instanceof Map) {
|
||||
try {
|
||||
return StubMapping
|
||||
.buildFrom(this.objectMapper.writeValueAsString(wiremock));
|
||||
return StubMapping.buildFrom(this.objectMapper.writeValueAsString(wiremock));
|
||||
}
|
||||
catch (JsonProcessingException e) {
|
||||
throw new IllegalStateException(
|
||||
"Failed to build StubMapping for map [" + wiremock + "]", e);
|
||||
throw new IllegalStateException("Failed to build StubMapping for map [" + wiremock + "]", e);
|
||||
}
|
||||
}
|
||||
throw new UnsupportedOperationException(
|
||||
"Unsupported type for wiremock metadata extension");
|
||||
throw new UnsupportedOperationException("Unsupported type for wiremock metadata extension");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isApplicable(Contract contract) {
|
||||
boolean contains = contract.getMetadata()
|
||||
.containsKey(WireMockMetaData.METADATA_KEY);
|
||||
boolean contains = contract.getMetadata().containsKey(WireMockMetaData.METADATA_KEY);
|
||||
if (!contains) {
|
||||
return false;
|
||||
}
|
||||
Object stubMapping = WireMockMetaData.fromMetadata(contract.getMetadata())
|
||||
.getStubMapping();
|
||||
Object stubMapping = WireMockMetaData.fromMetadata(contract.getMetadata()).getStubMapping();
|
||||
return WireMockMetaData.APPLICABLE_CLASSES.stream()
|
||||
.anyMatch(aClass -> aClass.isAssignableFrom(stubMapping.getClass()));
|
||||
}
|
||||
|
||||
@@ -39,10 +39,8 @@ import org.springframework.util.StringUtils;
|
||||
*/
|
||||
public class DslToWireMockClientConverter extends DslToWireMockConverter {
|
||||
|
||||
private String convertASingleContract(String rootName, ContractMetadata contract,
|
||||
Contract dsl) {
|
||||
StubMapping stubMapping = new WireMockStubStrategy(rootName, contract, dsl)
|
||||
.toWireMockClientStub();
|
||||
private String convertASingleContract(String rootName, ContractMetadata contract, Contract dsl) {
|
||||
StubMapping stubMapping = new WireMockStubStrategy(rootName, contract, dsl).toWireMockClientStub();
|
||||
StubMapping mapping = postProcessStubMapping(stubMapping, dsl);
|
||||
if (mapping == null) {
|
||||
return "";
|
||||
@@ -51,16 +49,14 @@ public class DslToWireMockClientConverter extends DslToWireMockConverter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public StubMapping postProcessStubMapping(StubMapping stubMapping,
|
||||
Contract contract) {
|
||||
public StubMapping postProcessStubMapping(StubMapping stubMapping, Contract contract) {
|
||||
StubMapping mapping = super.postProcessStubMapping(stubMapping, contract);
|
||||
// apply the default WireMock processor as the last one
|
||||
return defaultStubMappingPostProcessing(mapping, contract);
|
||||
}
|
||||
|
||||
@Override
|
||||
public StubMapping defaultStubMappingPostProcessing(StubMapping stubMapping,
|
||||
Contract contract) {
|
||||
public StubMapping defaultStubMappingPostProcessing(StubMapping stubMapping, Contract contract) {
|
||||
DefaultWireMockStubPostProcessor processor = new DefaultWireMockStubPostProcessor();
|
||||
if (processor.isApplicable(contract)) {
|
||||
return processor.postProcess(stubMapping, contract);
|
||||
@@ -69,15 +65,13 @@ public class DslToWireMockClientConverter extends DslToWireMockConverter {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Contract, String> convertContents(String rootName,
|
||||
ContractMetadata contract) {
|
||||
public Map<Contract, String> convertContents(String rootName, ContractMetadata contract) {
|
||||
List<Contract> httpContracts = httpContracts(contract);
|
||||
if (httpContracts.isEmpty()) {
|
||||
return new HashMap<>();
|
||||
}
|
||||
if (contract.getConvertedContract().size() == 1) {
|
||||
return Collections.singletonMap(
|
||||
first((List<Contract>) contract.getConvertedContract()),
|
||||
return Collections.singletonMap(first((List<Contract>) contract.getConvertedContract()),
|
||||
convertASingleContract(rootName, contract,
|
||||
first((List<Contract>) contract.getConvertedContract())));
|
||||
}
|
||||
@@ -85,17 +79,16 @@ public class DslToWireMockClientConverter extends DslToWireMockConverter {
|
||||
}
|
||||
|
||||
private List<Contract> httpContracts(ContractMetadata contract) {
|
||||
return contract.getConvertedContract().stream()
|
||||
.filter(c -> c.getRequest() != null).collect(Collectors.toList());
|
||||
return contract.getConvertedContract().stream().filter(c -> c.getRequest() != null)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private Map<Contract, String> convertContracts(String rootName,
|
||||
ContractMetadata contract, List<Contract> contractsWithRequest) {
|
||||
private Map<Contract, String> convertContracts(String rootName, ContractMetadata contract,
|
||||
List<Contract> contractsWithRequest) {
|
||||
Map<Contract, String> convertedContracts = new LinkedHashMap<>();
|
||||
for (int i = 0; i < contractsWithRequest.size(); i++) {
|
||||
Contract dsl = contractsWithRequest.get(i);
|
||||
String name = StringUtils.hasText(dsl.getName())
|
||||
? NamesUtil.convertIllegalPackageChars(dsl.getName())
|
||||
String name = StringUtils.hasText(dsl.getName()) ? NamesUtil.convertIllegalPackageChars(dsl.getName())
|
||||
: rootName + "_" + i;
|
||||
convertedContracts.put(dsl, convertASingleContract(name, contract, dsl));
|
||||
}
|
||||
@@ -104,8 +97,7 @@ public class DslToWireMockClientConverter extends DslToWireMockConverter {
|
||||
|
||||
private static <T> T first(List<T> self) {
|
||||
if (self.isEmpty()) {
|
||||
throw new NoSuchElementException(
|
||||
"Cannot access first() element from an empty List");
|
||||
throw new NoSuchElementException("Cannot access first() element from an empty List");
|
||||
}
|
||||
return self.get(0);
|
||||
}
|
||||
|
||||
@@ -37,8 +37,7 @@ public class WireMockMetaData implements SpringCloudContractMetadata {
|
||||
/**
|
||||
* Applicable classes for Stub Mapping.
|
||||
*/
|
||||
static final List<Class> APPLICABLE_CLASSES = Arrays.asList(String.class,
|
||||
StubMapping.class, Map.class);
|
||||
static final List<Class> APPLICABLE_CLASSES = Arrays.asList(String.class, StubMapping.class, Map.class);
|
||||
|
||||
/**
|
||||
* {@link StubMapping} represented by one of the classes in
|
||||
@@ -55,8 +54,7 @@ public class WireMockMetaData implements SpringCloudContractMetadata {
|
||||
}
|
||||
|
||||
public static WireMockMetaData fromMetadata(Map<String, Object> metadata) {
|
||||
return MetadataUtil.fromMetadata(metadata, WireMockMetaData.METADATA_KEY,
|
||||
new WireMockMetaData());
|
||||
return MetadataUtil.fromMetadata(metadata, WireMockMetaData.METADATA_KEY, new WireMockMetaData());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -66,10 +64,8 @@ public class WireMockMetaData implements SpringCloudContractMetadata {
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "Metadata for extending WireMock stubs.\n\nStubMapping can be "
|
||||
+ "one of the following classes "
|
||||
+ APPLICABLE_CLASSES.stream()
|
||||
.map(aClass -> "`" + aClass.getSimpleName() + "`")
|
||||
return "Metadata for extending WireMock stubs.\n\nStubMapping can be " + "one of the following classes "
|
||||
+ APPLICABLE_CLASSES.stream().map(aClass -> "`" + aClass.getSimpleName() + "`")
|
||||
.collect(Collectors.toList())
|
||||
+ ". Please check "
|
||||
+ "the http://wiremock.org/docs/stubbing/ for more information about the StubMapping class properties.";
|
||||
|
||||
@@ -49,35 +49,25 @@ public class WireMockToDslConverter {
|
||||
|
||||
private static final JsonPointer PRIORITY_POINTER = JsonPointer.compile("/priority");
|
||||
|
||||
private static final JsonPointer REQUEST_METHOD_POINTER = JsonPointer
|
||||
.compile("/request/method");
|
||||
private static final JsonPointer REQUEST_METHOD_POINTER = JsonPointer.compile("/request/method");
|
||||
|
||||
private static final JsonPointer REQUEST_URL_POINTER = JsonPointer
|
||||
.compile("/request/url");
|
||||
private static final JsonPointer REQUEST_URL_POINTER = JsonPointer.compile("/request/url");
|
||||
|
||||
private static final JsonPointer REQUEST_URL_PATH_POINTER = JsonPointer
|
||||
.compile("/request/urlPath");
|
||||
private static final JsonPointer REQUEST_URL_PATH_POINTER = JsonPointer.compile("/request/urlPath");
|
||||
|
||||
private static final JsonPointer REQUEST_URL_PATTERN_POINTER = JsonPointer
|
||||
.compile("/request/urlPattern");
|
||||
private static final JsonPointer REQUEST_URL_PATTERN_POINTER = JsonPointer.compile("/request/urlPattern");
|
||||
|
||||
private static final JsonPointer REQUEST_URL_PATH_PATTERN_POINTER = JsonPointer
|
||||
.compile("/request/urlPathPattern");
|
||||
private static final JsonPointer REQUEST_URL_PATH_PATTERN_POINTER = JsonPointer.compile("/request/urlPathPattern");
|
||||
|
||||
private static final JsonPointer REQUEST_HEADERS_POINTER = JsonPointer
|
||||
.compile("/request/headers");
|
||||
private static final JsonPointer REQUEST_HEADERS_POINTER = JsonPointer.compile("/request/headers");
|
||||
|
||||
private static final JsonPointer REQUEST_BODY_POINTER = JsonPointer
|
||||
.compile("/request/bodyPatterns");
|
||||
private static final JsonPointer REQUEST_BODY_POINTER = JsonPointer.compile("/request/bodyPatterns");
|
||||
|
||||
private static final JsonPointer RESPONSE_STATUS_POINTER = JsonPointer
|
||||
.compile("/response/status");
|
||||
private static final JsonPointer RESPONSE_STATUS_POINTER = JsonPointer.compile("/response/status");
|
||||
|
||||
private static final JsonPointer RESPONSE_BODY_POINTER = JsonPointer
|
||||
.compile("/response/body");
|
||||
private static final JsonPointer RESPONSE_BODY_POINTER = JsonPointer.compile("/response/body");
|
||||
|
||||
private static final JsonPointer RESPONSE_HEADERS_POINTER = JsonPointer
|
||||
.compile("/response/headers");
|
||||
private static final JsonPointer RESPONSE_HEADERS_POINTER = JsonPointer.compile("/response/headers");
|
||||
|
||||
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
|
||||
|
||||
@@ -98,12 +88,10 @@ public class WireMockToDslConverter {
|
||||
|
||||
private String convertFromWireMockStub(String wireMockStringStub) {
|
||||
JsonNode wireMockStub = parseStubDefinition(wireMockStringStub);
|
||||
return buildPriority(wireMockStub) + "request {\n"
|
||||
+ buildRequestMethod(wireMockStub) + buildRequestUrl(wireMockStub)
|
||||
+ buildRequestUrlPattern(wireMockStub)
|
||||
+ buildRequestUrlPathPattern(wireMockStub)
|
||||
+ buildRequestUrlPath(wireMockStub) + buildRequestHeaders(wireMockStub)
|
||||
+ buildRequestBody(wireMockStub) + "}\n" + "response {\n"
|
||||
return buildPriority(wireMockStub) + "request {\n" + buildRequestMethod(wireMockStub)
|
||||
+ buildRequestUrl(wireMockStub) + buildRequestUrlPattern(wireMockStub)
|
||||
+ buildRequestUrlPathPattern(wireMockStub) + buildRequestUrlPath(wireMockStub)
|
||||
+ buildRequestHeaders(wireMockStub) + buildRequestBody(wireMockStub) + "}\n" + "response {\n"
|
||||
+ buildResponseStatus(wireMockStub) + buildResponseBody(wireMockStub)
|
||||
+ buildResponseHeaders(wireMockStub) + "}" + "\n";
|
||||
}
|
||||
@@ -157,10 +145,8 @@ public class WireMockToDslConverter {
|
||||
String requestUrlPattern = "";
|
||||
JsonNode requestUrlPatternNode = wireMockStub.at(REQUEST_URL_PATTERN_POINTER);
|
||||
if (!requestUrlPatternNode.isMissingNode()) {
|
||||
String escapedRequestUrlPatternValue = escapeJava(
|
||||
requestUrlPatternNode.asText());
|
||||
requestUrlPattern = "url $(consumer(regex('" + escapedRequestUrlPatternValue
|
||||
+ "')), producer('"
|
||||
String escapedRequestUrlPatternValue = escapeJava(requestUrlPatternNode.asText());
|
||||
requestUrlPattern = "url $(consumer(regex('" + escapedRequestUrlPatternValue + "')), producer('"
|
||||
+ new Xeger(escapedRequestUrlPatternValue).generate() + "'))\n";
|
||||
}
|
||||
return requestUrlPattern;
|
||||
@@ -168,13 +154,10 @@ public class WireMockToDslConverter {
|
||||
|
||||
private String buildRequestUrlPathPattern(JsonNode wireMockStub) {
|
||||
String requestUrlPathPattern = "";
|
||||
JsonNode requestUrlPathPatternNode = wireMockStub
|
||||
.at(REQUEST_URL_PATH_PATTERN_POINTER);
|
||||
JsonNode requestUrlPathPatternNode = wireMockStub.at(REQUEST_URL_PATH_PATTERN_POINTER);
|
||||
if (!requestUrlPathPatternNode.isMissingNode()) {
|
||||
String escapedRequestUrlPathPatternValue = escapeJava(
|
||||
requestUrlPathPatternNode.asText());
|
||||
requestUrlPathPattern = "urlPath $(consumer(regex('"
|
||||
+ escapedRequestUrlPathPatternValue + "')), producer('"
|
||||
String escapedRequestUrlPathPatternValue = escapeJava(requestUrlPathPatternNode.asText());
|
||||
requestUrlPathPattern = "urlPath $(consumer(regex('" + escapedRequestUrlPathPatternValue + "')), producer('"
|
||||
+ new Xeger(escapedRequestUrlPathPatternValue).generate() + "'))'\n";
|
||||
}
|
||||
return requestUrlPathPattern;
|
||||
@@ -187,14 +170,11 @@ public class WireMockToDslConverter {
|
||||
if (requestHeadersNode.isObject()) {
|
||||
requestHeadersBuilder.append("headers {\n");
|
||||
ObjectNode requestHeadersObjectNode = requestHeadersNode.deepCopy();
|
||||
Iterator<Map.Entry<String, JsonNode>> fields = requestHeadersObjectNode
|
||||
.fields();
|
||||
Iterator<Map.Entry<String, JsonNode>> fields = requestHeadersObjectNode.fields();
|
||||
fields.forEachRemaining(c -> {
|
||||
requestHeadersBuilder.append("header('").append(c.getKey()).append("',");
|
||||
Map.Entry<String, JsonNode> headerValue = c.getValue().deepCopy().fields()
|
||||
.next();
|
||||
String header = buildHeader(headerValue.getKey(),
|
||||
headerValue.getValue().asText());
|
||||
Map.Entry<String, JsonNode> headerValue = c.getValue().deepCopy().fields().next();
|
||||
String header = buildHeader(headerValue.getKey(), headerValue.getValue().asText());
|
||||
requestHeadersBuilder.append(header).append(")").append("\n");
|
||||
});
|
||||
requestHeadersBuilder.append("}");
|
||||
@@ -222,24 +202,17 @@ public class WireMockToDslConverter {
|
||||
Iterator<JsonNode> elements = requestBodyArrayNode.elements();
|
||||
Iterable<JsonNode> iterableFields = () -> elements;
|
||||
List<Map.Entry<String, JsonNode>> requestBodyObjectNodes = new ArrayList<>();
|
||||
StreamSupport.stream(iterableFields.spliterator(), false)
|
||||
.filter(f -> f instanceof ObjectNode).map(f -> (ObjectNode) f)
|
||||
.map(ObjectNode::fields)
|
||||
StreamSupport.stream(iterableFields.spliterator(), false).filter(f -> f instanceof ObjectNode)
|
||||
.map(f -> (ObjectNode) f).map(ObjectNode::fields)
|
||||
.forEachOrdered(i -> i.forEachRemaining(requestBodyObjectNodes::add));
|
||||
requestBodyObjectNodes.stream().filter(b -> b.getKey().equals("equalTo"))
|
||||
.findFirst().ifPresent(b -> requestBody.append("body ('")
|
||||
.append(b.getValue().asText()).append("')"));
|
||||
requestBodyObjectNodes.stream().filter(b -> b.getKey().equals("equalToJson"))
|
||||
.findFirst().ifPresent(b -> requestBody.append("body ('")
|
||||
.append(b.getValue().asText()).append("')"));
|
||||
requestBodyObjectNodes.stream().filter(b -> b.getKey().equals("matches"))
|
||||
.findFirst()
|
||||
requestBodyObjectNodes.stream().filter(b -> b.getKey().equals("equalTo")).findFirst()
|
||||
.ifPresent(b -> requestBody.append("body ('").append(b.getValue().asText()).append("')"));
|
||||
requestBodyObjectNodes.stream().filter(b -> b.getKey().equals("equalToJson")).findFirst()
|
||||
.ifPresent(b -> requestBody.append("body ('").append(b.getValue().asText()).append("')"));
|
||||
requestBodyObjectNodes.stream().filter(b -> b.getKey().equals("matches")).findFirst()
|
||||
.ifPresent(b -> requestBody.append("body $(consumer(regex('")
|
||||
.append(escapeJava(b.getValue().asText()))
|
||||
.append("')), producer('")
|
||||
.append(new Xeger(escapeJava(b.getValue().asText()))
|
||||
.generate())
|
||||
.append("'))"));
|
||||
.append(escapeJava(b.getValue().asText())).append("')), producer('")
|
||||
.append(new Xeger(escapeJava(b.getValue().asText())).generate()).append("'))"));
|
||||
}
|
||||
return requestBody.toString();
|
||||
}
|
||||
@@ -258,14 +231,10 @@ public class WireMockToDslConverter {
|
||||
String responseBody = "";
|
||||
JsonNode responseBodyNode = wireMockStub.at(RESPONSE_BODY_POINTER);
|
||||
if (responseBodyNode.isInt()) {
|
||||
responseBody += "body( "
|
||||
+ escapeJava(buildPrettyPrintResponseBody((IntNode) responseBodyNode))
|
||||
+ ")\n";
|
||||
responseBody += "body( " + escapeJava(buildPrettyPrintResponseBody((IntNode) responseBodyNode)) + ")\n";
|
||||
}
|
||||
if (responseBodyNode.isTextual()) {
|
||||
responseBody += "body( \""
|
||||
+ escapeJava(
|
||||
buildPrettyPrintResponseBody((TextNode) responseBodyNode))
|
||||
responseBody += "body( \"" + escapeJava(buildPrettyPrintResponseBody((TextNode) responseBodyNode))
|
||||
+ "\")\n";
|
||||
}
|
||||
return responseBody;
|
||||
@@ -278,8 +247,7 @@ public class WireMockToDslConverter {
|
||||
private String buildPrettyPrintResponseBody(TextNode node) {
|
||||
try {
|
||||
String textNode = node.asText();
|
||||
Object intermediateObjectForPrettyPrinting = OBJECT_MAPPER.reader()
|
||||
.readValue(textNode, Object.class);
|
||||
Object intermediateObjectForPrettyPrinting = OBJECT_MAPPER.reader().readValue(textNode, Object.class);
|
||||
DefaultIndenter customIndenter = new DefaultIndenter(" ", "\n");
|
||||
return OBJECT_MAPPER
|
||||
.writer(new PrivatePrettyPrinter().withArrayIndenter(customIndenter)
|
||||
@@ -287,8 +255,7 @@ public class WireMockToDslConverter {
|
||||
.writeValueAsString(intermediateObjectForPrettyPrinting);
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
"WireMock response body could not be pretty printed");
|
||||
throw new RuntimeException("WireMock response body could not be pretty printed");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,11 +266,9 @@ public class WireMockToDslConverter {
|
||||
if (requestHeadersNode.isObject()) {
|
||||
responseHeadersBuilder.append("headers {\n");
|
||||
ObjectNode responseHeadersObjectNode = requestHeadersNode.deepCopy();
|
||||
Iterator<Map.Entry<String, JsonNode>> fields = responseHeadersObjectNode
|
||||
.fields();
|
||||
fields.forEachRemaining(c -> responseHeadersBuilder.append("header('")
|
||||
.append(c.getKey()).append("',").append("'")
|
||||
.append(c.getValue().asText()).append("')\n"));
|
||||
Iterator<Map.Entry<String, JsonNode>> fields = responseHeadersObjectNode.fields();
|
||||
fields.forEachRemaining(c -> responseHeadersBuilder.append("header('").append(c.getKey()).append("',")
|
||||
.append("'").append(c.getValue().asText()).append("')\n"));
|
||||
responseHeadersBuilder.append("}");
|
||||
}
|
||||
return responseHeadersBuilder.toString();
|
||||
@@ -319,8 +284,7 @@ public class WireMockToDslConverter {
|
||||
@Override
|
||||
public DefaultPrettyPrinter withSeparators(Separators separators) {
|
||||
_separators = separators;
|
||||
_objectFieldValueSeparatorWithSpaces = separators
|
||||
.getObjectFieldValueSeparator() + " ";
|
||||
_objectFieldValueSeparatorWithSpaces = separators.getObjectFieldValueSeparator() + " ";
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,8 +60,7 @@ class DefaultWireMockStubPostProcessorTests {
|
||||
|
||||
@Test
|
||||
void should_not_be_applicable_for_missing_metadata_entry() {
|
||||
then(new DefaultWireMockStubPostProcessor().isApplicable(new Contract()))
|
||||
.isFalse();
|
||||
then(new DefaultWireMockStubPostProcessor().isApplicable(new Contract())).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -100,8 +99,7 @@ class DefaultWireMockStubPostProcessorTests {
|
||||
contract.getMetadata().put("wiremock", map);
|
||||
StubMapping stubMapping = StubMapping.buildFrom(STUB_MAPPING);
|
||||
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor()
|
||||
.postProcess(stubMapping, contract);
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor().postProcess(stubMapping, contract);
|
||||
|
||||
thenPostServerActionWasSet(result);
|
||||
}
|
||||
@@ -114,24 +112,20 @@ class DefaultWireMockStubPostProcessorTests {
|
||||
contract.getMetadata().put("wiremock", map);
|
||||
StubMapping stubMapping = StubMapping.buildFrom(STUB_MAPPING);
|
||||
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor()
|
||||
.postProcess(stubMapping, contract);
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor().postProcess(stubMapping, contract);
|
||||
|
||||
thenPostServerActionWasSet(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void should_merge_stub_mappings_when_stub_mapping_is_map()
|
||||
throws JsonProcessingException {
|
||||
void should_merge_stub_mappings_when_stub_mapping_is_map() throws JsonProcessingException {
|
||||
Contract contract = new Contract();
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("stubMapping",
|
||||
new ObjectMapper().readValue(POST_SERVE_ACTION, HashMap.class));
|
||||
map.put("stubMapping", new ObjectMapper().readValue(POST_SERVE_ACTION, HashMap.class));
|
||||
contract.getMetadata().put("wiremock", map);
|
||||
StubMapping stubMapping = StubMapping.buildFrom(STUB_MAPPING);
|
||||
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor()
|
||||
.postProcess(stubMapping, contract);
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor().postProcess(stubMapping, contract);
|
||||
|
||||
thenPostServerActionWasSet(result);
|
||||
}
|
||||
@@ -144,8 +138,7 @@ class DefaultWireMockStubPostProcessorTests {
|
||||
contract.getMetadata().put("wiremock", map);
|
||||
StubMapping stubMapping = StubMapping.buildFrom(STUB_MAPPING);
|
||||
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor()
|
||||
.postProcess(stubMapping, contract);
|
||||
StubMapping result = new DefaultWireMockStubPostProcessor().postProcess(stubMapping, contract);
|
||||
|
||||
then(result.getRequest().getMethod().getName()).isEqualTo("GET");
|
||||
then(result.getResponse().getStatus()).isEqualTo(200);
|
||||
|
||||
Reference in New Issue
Block a user