Skip to content

Commit

Permalink
Added ability to attach arbitrary JSON metadata to stubs, and to find…
Browse files Browse the repository at this point in the history
… and delete stubs based on metadata content
  • Loading branch information
tomakehurst committed May 15, 2018
1 parent f52855a commit 087fefa
Show file tree
Hide file tree
Showing 21 changed files with 411 additions and 42 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ dependencies {
exclude group: "org.hamcrest", module: "hamcrest-library"
}
testCompile "org.skyscreamer:jsonassert:1.2.3"
testCompile 'com.toomuchcoding.jsonassert:jsonassert:0.4.7'
testCompile 'com.toomuchcoding.jsonassert:jsonassert:0.4.12'
testCompile 'org.awaitility:awaitility:2.0.0'

testCompile "com.googlecode.jarjar:jarjar:1.3"
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/github/tomakehurst/wiremock/WireMockServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import com.github.tomakehurst.wiremock.junit.Stubbing;
import com.github.tomakehurst.wiremock.matching.RequestPattern;
import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;
import com.github.tomakehurst.wiremock.recording.RecordingStatusResult;
import com.github.tomakehurst.wiremock.recording.SnapshotRecordResult;
import com.github.tomakehurst.wiremock.recording.RecordSpec;
Expand Down Expand Up @@ -239,6 +240,16 @@ public StubMapping getSingleStubMapping(UUID id) {
return client.getStubMapping(id).getItem();
}

@Override
public List<StubMapping> findStubMappingsByMetadata(StringValuePattern pattern) {
return client.findAllStubsByMetadata(pattern);
}

@Override
public void removeStubMappingsByMetadata(StringValuePattern pattern) {
client.removeStubsByMetadataPattern(pattern);
}

@Override
public void removeStubMapping(StubMapping stubMapping){
wireMockApp.removeStubMapping(stubMapping);
Expand Down Expand Up @@ -438,4 +449,14 @@ public Options getOptions() {
public void shutdownServer() {
shutdown();
}

@Override
public ListStubMappingsResult findAllStubsByMetadata(StringValuePattern pattern) {
return wireMockApp.findAllStubsByMetadata(pattern);
}

@Override
public void removeStubsByMetadata(StringValuePattern pattern) {
wireMockApp.removeStubsByMetadata(pattern);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ private void initDefaultRoutes(Router router) {
router.add(GET, "/mappings/{id}", GetStubMappingTask.class);
router.add(PUT, "/mappings/{id}", EditStubMappingTask.class);
router.add(DELETE, "/mappings/{id}", RemoveStubMappingTask.class);
router.add(POST, "/mappings/find-by-metadata", FindStubMappingsByMetadataTask.class);
router.add(POST, "/mappings/remove-by-metadata", RemoveStubMappingsByMetadataTask.class);

router.add(GET, "/files", GetAllStubFilesTask.class);
router.add(PUT, "/files/{filename}", EditStubFileTask.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.github.tomakehurst.wiremock.admin;

import com.github.tomakehurst.wiremock.admin.model.ListStubMappingsResult;
import com.github.tomakehurst.wiremock.admin.model.PathParams;
import com.github.tomakehurst.wiremock.common.Json;
import com.github.tomakehurst.wiremock.core.Admin;
import com.github.tomakehurst.wiremock.http.Request;
import com.github.tomakehurst.wiremock.http.ResponseDefinition;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;

public class FindStubMappingsByMetadataTask implements AdminTask {

@Override
public ResponseDefinition execute(Admin admin, Request request, PathParams pathParams) {
StringValuePattern pattern = Json.read(request.getBodyAsString(), StringValuePattern.class);
ListStubMappingsResult stubMappings = admin.findAllStubsByMetadata(pattern);
return ResponseDefinition.okForJson(stubMappings);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.github.tomakehurst.wiremock.admin;

import com.github.tomakehurst.wiremock.admin.model.PathParams;
import com.github.tomakehurst.wiremock.common.Json;
import com.github.tomakehurst.wiremock.core.Admin;
import com.github.tomakehurst.wiremock.http.Request;
import com.github.tomakehurst.wiremock.http.ResponseDefinition;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;

public class RemoveStubMappingsByMetadataTask implements AdminTask {

@Override
public ResponseDefinition execute(Admin admin, Request request, PathParams pathParams) {
StringValuePattern pattern = Json.read(request.getBodyAsString(), StringValuePattern.class);
admin.removeStubsByMetadata(pattern);
return ResponseDefinition.okEmptyJson();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.github.tomakehurst.wiremock.client;

import com.github.tomakehurst.wiremock.common.Metadata;
import com.github.tomakehurst.wiremock.extension.Parameters;
import com.github.tomakehurst.wiremock.http.Request;
import com.github.tomakehurst.wiremock.http.RequestMethod;
Expand Down Expand Up @@ -42,6 +43,7 @@ class BasicMappingBuilder implements ScenarioMappingBuilder {
private String name;
private boolean isPersistent = false;
private Map<String, Parameters> postServeActions = newLinkedHashMap();
private Metadata metadata;

BasicMappingBuilder(RequestMethod method, UrlPattern urlPattern) {
requestPatternBuilder = new RequestPatternBuilder(method, urlPattern);
Expand Down Expand Up @@ -157,6 +159,24 @@ public <P> BasicMappingBuilder withPostServeAction(String extensionName, P param
return this;
}

@Override
public BasicMappingBuilder withMetadata(Map<String, ?> metadataMap) {
this.metadata = new Metadata(metadataMap);
return this;
}

@Override
public BasicMappingBuilder withMetadata(Metadata metadata) {
this.metadata = metadata;
return this;
}

@Override
public BasicMappingBuilder withMetadata(Metadata.Builder metadata) {
this.metadata = metadata.build();
return this;
}

@Override
public StubMapping build() {
if (scenarioName == null && (requiredScenarioState != null || newScenarioState != null)) {
Expand All @@ -175,6 +195,8 @@ public StubMapping build() {

mapping.setPostServeActions(postServeActions.isEmpty() ? null : postServeActions);

mapping.setMetadata(metadata);

return mapping;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@
import com.github.tomakehurst.wiremock.http.HttpHeader;
import com.github.tomakehurst.wiremock.http.HttpStatus;
import com.github.tomakehurst.wiremock.matching.RequestPattern;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;
import com.github.tomakehurst.wiremock.recording.RecordSpecBuilder;
import com.github.tomakehurst.wiremock.recording.RecordingStatusResult;
import com.github.tomakehurst.wiremock.recording.SnapshotRecordResult;
import com.github.tomakehurst.wiremock.recording.RecordSpec;
import com.github.tomakehurst.wiremock.security.ClientAuthenticator;
import com.github.tomakehurst.wiremock.security.NoClientAuthenticator;
import com.github.tomakehurst.wiremock.security.NotAuthorisedException;
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
import com.github.tomakehurst.wiremock.verification.FindNearMissesResult;
Expand Down Expand Up @@ -345,6 +345,24 @@ public void shutdownServer() {
postJsonAssertOkAndReturnBody(urlFor(ShutdownServerTask.class), null);
}

@Override
public ListStubMappingsResult findAllStubsByMetadata(StringValuePattern pattern) {
return executeRequest(
adminRoutes.requestSpecForTask(FindStubMappingsByMetadataTask.class),
pattern,
ListStubMappingsResult.class
);
}

@Override
public void removeStubsByMetadata(StringValuePattern pattern) {
executeRequest(
adminRoutes.requestSpecForTask(RemoveStubMappingsByMetadataTask.class),
pattern,
Void.class
);
}

public int port() {
return port;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
*/
package com.github.tomakehurst.wiremock.client;

import com.github.tomakehurst.wiremock.common.Metadata;
import com.github.tomakehurst.wiremock.matching.ContentPattern;
import com.github.tomakehurst.wiremock.matching.MultipartValuePatternBuilder;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
import com.google.common.collect.ImmutableMap;

import java.util.Map;
import java.util.UUID;
Expand All @@ -42,6 +44,10 @@ public interface MappingBuilder {

<P> MappingBuilder withPostServeAction(String extensionName, P parameters);

MappingBuilder withMetadata(Map<String, ?> metadata);
MappingBuilder withMetadata(Metadata metadata);
MappingBuilder withMetadata(Metadata.Builder metadata);

MappingBuilder willReturn(ResponseDefinitionBuilder responseDefBuilder);

StubMapping build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.github.tomakehurst.wiremock.client;

import com.github.tomakehurst.wiremock.common.Metadata;
import com.github.tomakehurst.wiremock.matching.ContentPattern;
import com.github.tomakehurst.wiremock.matching.MultipartValuePatternBuilder;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;
Expand All @@ -41,5 +42,9 @@ public interface ScenarioMappingBuilder extends MappingBuilder {

<P> ScenarioMappingBuilder withPostServeAction(String extensionName, P parameters);

ScenarioMappingBuilder withMetadata(Map<String, ?> metadata);
ScenarioMappingBuilder withMetadata(Metadata metadata);
ScenarioMappingBuilder withMetadata(Metadata.Builder metadata);

ScenarioMappingBuilder willReturn(ResponseDefinitionBuilder responseDefBuilder);
}
16 changes: 16 additions & 0 deletions src/main/java/com/github/tomakehurst/wiremock/client/WireMock.java
Original file line number Diff line number Diff line change
Expand Up @@ -756,4 +756,20 @@ public RecordingStatusResult getStubRecordingStatus() {
public static RecordSpecBuilder recordSpec() {
return new RecordSpecBuilder();
}

public List<StubMapping> findAllStubsByMetadata(StringValuePattern pattern) {
return admin.findAllStubsByMetadata(pattern).getMappings();
}

public static List<StubMapping> findStubsByMetadata(StringValuePattern pattern) {
return defaultInstance.get().findAllStubsByMetadata(pattern);
}

public void removeStubsByMetadataPattern(StringValuePattern pattern) {
admin.removeStubsByMetadata(pattern);
}

public static void removeStubsByMetadata(StringValuePattern pattern) {
defaultInstance.get().removeStubsByMetadataPattern(pattern);
}
}
86 changes: 86 additions & 0 deletions src/main/java/com/github/tomakehurst/wiremock/common/Metadata.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.github.tomakehurst.wiremock.common;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import static com.google.common.base.Preconditions.checkArgument;

public class Metadata extends LinkedHashMap<String, Object> {

public Metadata() {
}

public Metadata(Map<? extends String, ?> data) {
super(data);
}

public Integer getInt(String key) {
return checkValidityAndCast(key, Integer.class);
}

public Boolean getBoolean(String key) {
return checkValidityAndCast(key, Boolean.class);
}

public String getString(String key) {
return checkValidityAndCast(key, String.class);
}

public List<?> getList(String key) {
return checkValidityAndCast(key, List.class);
}

@SuppressWarnings("unchecked")
public Metadata getMetadata(String key) {
checkKeyPresent(key);
checkArgument(Map.class.isAssignableFrom(get(key).getClass()), key + " is not a map");
return new Metadata((Map<String, ?>) get(key));
}

@SuppressWarnings("unchecked")
private <T> T checkValidityAndCast(String key, Class<T> type) {
checkKeyPresent(key);
checkArgument(type.isAssignableFrom(get(key).getClass()), key + " is not of type " + type.getSimpleName());
return (T) get(key);
}

private void checkKeyPresent(String key) {
checkArgument(containsKey(key), key + "' not present");
}

public static Builder metadata() {
return new Builder();
}

public static class Builder {

private final ImmutableMap.Builder<String, Object> mapBuilder;

public Builder() {
this.mapBuilder = ImmutableMap.builder();
}

public Builder attr(String key, Object value) {
mapBuilder.put(key, value);
return this;
}

public Builder list(String key, Object... values) {
mapBuilder.put(key, ImmutableList.copyOf(values));
return this;
}

public Builder attr(String key, Metadata.Builder metadataBuilder) {
mapBuilder.put(key, metadataBuilder.build());
return this;
}

public Metadata build() {
return new Metadata(mapBuilder.build());
}
}
}
5 changes: 5 additions & 0 deletions src/main/java/com/github/tomakehurst/wiremock/core/Admin.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@

import com.github.tomakehurst.wiremock.admin.model.*;
import com.github.tomakehurst.wiremock.global.GlobalSettings;
import com.github.tomakehurst.wiremock.matching.MatchesJsonPathPattern;
import com.github.tomakehurst.wiremock.matching.RequestPattern;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;
import com.github.tomakehurst.wiremock.recording.RecordSpec;
import com.github.tomakehurst.wiremock.recording.RecordSpecBuilder;
import com.github.tomakehurst.wiremock.recording.RecordingStatusResult;
Expand Down Expand Up @@ -72,4 +74,7 @@ public interface Admin {
Options getOptions();

void shutdownServer();

ListStubMappingsResult findAllStubsByMetadata(StringValuePattern pattern);
void removeStubsByMetadata(StringValuePattern pattern);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.github.tomakehurst.wiremock.http.*;
import com.github.tomakehurst.wiremock.matching.RequestMatcherExtension;
import com.github.tomakehurst.wiremock.matching.RequestPattern;
import com.github.tomakehurst.wiremock.matching.StringValuePattern;
import com.github.tomakehurst.wiremock.recording.*;
import com.github.tomakehurst.wiremock.standalone.MappingsLoader;
import com.github.tomakehurst.wiremock.stubbing.InMemoryStubMappings;
Expand Down Expand Up @@ -395,4 +396,19 @@ public SnapshotRecordResult stopRecording() {
public RecordingStatusResult getRecordingStatus() {
return new RecordingStatusResult(recorder.getStatus().name());
}

@Override
public ListStubMappingsResult findAllStubsByMetadata(StringValuePattern pattern) {
return new ListStubMappingsResult(LimitAndOffsetPaginator.none(stubMappings.findByMetadata(pattern)));
}

@Override
public void removeStubsByMetadata(StringValuePattern pattern) {
List<StubMapping> foundMappings = stubMappings.findByMetadata(pattern);
for (StubMapping mapping: foundMappings) {
removeStubMapping(mapping);
}
}


}
Loading

0 comments on commit 087fefa

Please sign in to comment.