Skip to content

Commit

Permalink
Created an acceptance test for stub persistence. Fixed bug preventing…
Browse files Browse the repository at this point in the history
… edited files saving back to the same file that created them.
tomakehurst committed Oct 25, 2016
1 parent 737c7a7 commit b105792
Showing 5 changed files with 182 additions and 123 deletions.
Original file line number Diff line number Diff line change
@@ -17,7 +17,10 @@

import com.github.tomakehurst.wiremock.admin.AdminRoutes;
import com.github.tomakehurst.wiremock.admin.LimitAndOffsetPaginator;
import com.github.tomakehurst.wiremock.admin.model.*;
import com.github.tomakehurst.wiremock.admin.model.GetServeEventsResult;
import com.github.tomakehurst.wiremock.admin.model.ListStubMappingsResult;
import com.github.tomakehurst.wiremock.admin.model.SingleServedStubResult;
import com.github.tomakehurst.wiremock.admin.model.SingleStubMappingResult;
import com.github.tomakehurst.wiremock.common.FileSource;
import com.github.tomakehurst.wiremock.extension.AdminApiExtension;
import com.github.tomakehurst.wiremock.extension.PostServeAction;
@@ -28,23 +31,12 @@
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.standalone.JsonFileMappingsSource;
import com.github.tomakehurst.wiremock.standalone.MappingsLoader;
import com.github.tomakehurst.wiremock.standalone.MappingsSource;
import com.github.tomakehurst.wiremock.stubbing.InMemoryStubMappings;
import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
import com.github.tomakehurst.wiremock.stubbing.StubMappings;
import com.github.tomakehurst.wiremock.verification.DisabledRequestJournal;
import com.github.tomakehurst.wiremock.verification.FindNearMissesResult;
import com.github.tomakehurst.wiremock.verification.FindRequestsResult;
import com.github.tomakehurst.wiremock.verification.InMemoryRequestJournal;
import com.github.tomakehurst.wiremock.verification.LoggedRequest;
import com.github.tomakehurst.wiremock.verification.NearMiss;
import com.github.tomakehurst.wiremock.verification.NearMissCalculator;
import com.github.tomakehurst.wiremock.verification.RequestJournal;
import com.github.tomakehurst.wiremock.verification.RequestJournalDisabledException;
import com.github.tomakehurst.wiremock.verification.VerificationResult;
import com.github.tomakehurst.wiremock.verification.*;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
Original file line number Diff line number Diff line change
@@ -33,6 +33,7 @@

import static com.github.tomakehurst.wiremock.core.WireMockApp.MAPPINGS_ROOT;
import static com.github.tomakehurst.wiremock.extension.ExtensionLoader.valueAssignableFrom;
import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.collect.Lists.transform;
import static com.google.common.collect.Maps.newLinkedHashMap;
import static java.util.Arrays.asList;
@@ -57,6 +58,8 @@ public class WireMockConfiguration implements Options {
private boolean browserProxyingEnabled = false;
private ProxySettings proxySettings = ProxySettings.NO_PROXY;
private FileSource filesRoot = new SingleRootFileSource("src/test/resources");
private MappingsSource mappingsSource;

private Notifier notifier = new Slf4jNotifier(false);
private boolean requestJournalDisabled = false;
private Optional<Integer> maxRequestJournalEntries = Optional.absent();
@@ -71,6 +74,14 @@ public class WireMockConfiguration implements Options {

private Map<String, Extension> extensions = newLinkedHashMap();

private MappingsSource getMappingsSource() {
if (mappingsSource == null) {
mappingsSource = new JsonFileMappingsSource(filesRoot.child(MAPPINGS_ROOT));
}

return mappingsSource;
}

public static WireMockConfiguration wireMockConfig() {
return new WireMockConfiguration();
}
@@ -179,7 +190,7 @@ public WireMockConfiguration usingFilesUnderDirectory(String path) {
}

public WireMockConfiguration usingFilesUnderClasspath(String path) {
this.filesRoot = new ClasspathFileSource(path);
fileSource(new ClasspathFileSource(path));
return this;
}

@@ -188,6 +199,11 @@ public WireMockConfiguration fileSource(FileSource fileSource) {
return this;
}

public WireMockConfiguration mappingSource(MappingsSource mappingsSource) {
this.mappingsSource = mappingsSource;
return this;
}

public WireMockConfiguration notifier(Notifier notifier) {
this.notifier = notifier;
return this;
@@ -293,12 +309,12 @@ public FileSource filesRoot() {

@Override
public MappingsLoader mappingsLoader() {
return new JsonFileMappingsSource(filesRoot.child(MAPPINGS_ROOT));
return getMappingsSource();
}

@Override
public MappingsSaver mappingsSaver() {
return new JsonFileMappingsSource(filesRoot.child(MAPPINGS_ROOT));
return getMappingsSource();
}

@Override
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.github.tomakehurst.wiremock;

import com.github.tomakehurst.wiremock.client.MappingBuilder;
import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.common.FileSource;
import com.github.tomakehurst.wiremock.common.Json;
import com.github.tomakehurst.wiremock.common.SingleRootFileSource;
import com.github.tomakehurst.wiremock.core.Options;
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
import com.github.tomakehurst.wiremock.junit.Stubbing;
import com.github.tomakehurst.wiremock.testsupport.WireMockTestClient;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.UUID;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.common.Exceptions.throwUnchecked;
import static com.github.tomakehurst.wiremock.core.WireMockApp.FILES_ROOT;
import static com.github.tomakehurst.wiremock.core.WireMockApp.MAPPINGS_ROOT;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
import static com.github.tomakehurst.wiremock.testsupport.WireMatchers.hasFileContaining;
import static com.google.common.base.Charsets.UTF_8;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

public class StubMappingPersistenceAcceptanceTest {

Path rootDir;
WireMockServer wireMockServer;
WireMockTestClient testClient;
Stubbing wm;

@Before
public void init() throws Exception {
rootDir = Files.createTempDirectory("temp-filesource");
FileSource fileSource = new SingleRootFileSource(rootDir.toAbsolutePath().toString());
fileSource.createIfNecessary();
FileSource filesFileSource = fileSource.child(FILES_ROOT);
filesFileSource.createIfNecessary();
FileSource mappingsFileSource = fileSource.child(MAPPINGS_ROOT);
mappingsFileSource.createIfNecessary();

wireMockServer = new WireMockServer(wireMockConfig().fileSource(fileSource).dynamicPort());
wireMockServer.start();
testClient = new WireMockTestClient(wireMockServer.port());
WireMock.configureFor(wireMockServer.port());
wm = wireMockServer;
}

@Test
public void savesAllInMemoryStubMappings() {
wm.stubFor(get(urlEqualTo("/1")).willReturn(aResponse().withBody("one")));
wm.stubFor(get(urlEqualTo("/2")).willReturn(aResponse().withBody("two")));
wm.stubFor(get(urlEqualTo("/3")).willReturn(aResponse().withBody("three")));

wireMockServer.saveMappings();

assertThat(rootDir.resolve("mappings"), hasFileContaining("one"));
assertThat(rootDir.resolve("mappings"), hasFileContaining("two"));
assertThat(rootDir.resolve("mappings"), hasFileContaining("three"));
}

@Test
public void savesEditedStubToTheFileItOriginatedFrom() throws Exception {
Path mappingsDir = rootDir.resolve("mappings");
UUID stubId = UUID.randomUUID();

writeMappingFile("mapping-to-edit.json", get(urlEqualTo("/edit"))
.withId(stubId)
.willReturn(aResponse().withBody("initial"))
);

wireMockServer.resetToDefaultMappings(); // Loads from the file system

assertThat(wm.getStubMappings().get(0).getId(), is(stubId));
assertThat(wm.getStubMappings().get(0).getResponse().getBody(), is("initial"));

wm.editStub(get(urlEqualTo("/edit"))
.withId(stubId)
.willReturn(aResponse().withBody("modified")));

wireMockServer.saveMappings();

assertThat(mappingsDir.toFile().list().length, is(1));
assertThat(mappingsDir, hasFileContaining("modified"));
}

private void writeMappingFile(String name, MappingBuilder stubBuilder) throws IOException {
Path mappingsDir = rootDir.resolve("mappings");
byte[] json = Json.write(stubBuilder.build()).getBytes(UTF_8);
Files.write(mappingsDir.resolve(name), json);
}
}
Original file line number Diff line number Diff line change
@@ -16,120 +16,15 @@
package com.github.tomakehurst.wiremock.standalone;

import com.github.tomakehurst.wiremock.common.ClasspathFileSource;
import com.github.tomakehurst.wiremock.common.FileSource;
import com.github.tomakehurst.wiremock.common.Json;
import com.github.tomakehurst.wiremock.common.TextFile;
import com.github.tomakehurst.wiremock.stubbing.InMemoryStubMappings;
import com.github.tomakehurst.wiremock.stubbing.StubMapping;
import com.github.tomakehurst.wiremock.stubbing.StubMappings;
import com.google.common.collect.Lists;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Before;
import org.junit.Test;

import java.net.URI;

import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

public class JsonFileMappingsSourceTest {

private Mockery context;

private FileSource mappingsFileSource;
private JsonFileMappingsSource jsonFileMappingsSource;

@Before
public void setUp() throws Exception {
context = new Mockery();
mappingsFileSource = context.mock(FileSource.class, "mappingFileSource");
jsonFileMappingsSource = new JsonFileMappingsSource(mappingsFileSource);
}

@Test
public void loadsMappingsFromFile() throws Exception {

final StubMappings stubMappings = new InMemoryStubMappings();

final String mappingFileName = "testmapping.json";
final URI fileUri = this.getClass().getResource("/mappings/" + mappingFileName).toURI();
final TextFile textFile = new TextFile(fileUri);

final String mappingFileSource = fileUri.getPath().replace("/" + mappingFileName, "");


context.checking(new Expectations() {{
atLeast(1).of(mappingsFileSource).exists();
will(returnValue(true));
oneOf(mappingsFileSource).listFilesRecursively();
will(returnValue(Lists.newArrayList(textFile)));
oneOf(mappingsFileSource).getUri();
will(returnValue(URI.create(mappingFileSource)));
}});

jsonFileMappingsSource.loadMappingsInto(stubMappings);

assertThat(stubMappings.getAll(), hasSize(1));
}

@Test
public void savesMappingToFile() throws Exception {

final StubMapping stubMapping = new StubMapping();
stubMapping.setTransient(true);

final StubMappings stubMappings = new InMemoryStubMappings();
stubMappings.addMapping(stubMapping);

context.checking(new Expectations() {{
one(mappingsFileSource).writeTextFile(
with(allOf(startsWith("saved-mapping-"), endsWith(".json"))),
with(Json.write(stubMapping))
);
}});

jsonFileMappingsSource.saveMappings(stubMappings);
assertThat(stubMapping.isTransient(), is(false));
}

@Test
public void savesEditedMappingToTheFileItOriginatedFrom() throws Exception {

final StubMappings stubMappings = new InMemoryStubMappings();

final String mappingFileName = "testmapping.json";
final URI fileUri = this.getClass().getResource("/mappings/" + mappingFileName).toURI();
final TextFile textFile = new TextFile(fileUri);

final String mappingFileSource = fileUri.getPath().replace(mappingFileName, "");

context.checking(new Expectations() {{
atLeast(1).of(mappingsFileSource).exists();
will(returnValue(true));
oneOf(mappingsFileSource).listFilesRecursively();
will(returnValue(Lists.newArrayList(textFile)));
oneOf(mappingsFileSource).getUri();
will(returnValue(URI.create(mappingFileSource)));
}});

jsonFileMappingsSource.loadMappingsInto(stubMappings);

final StubMapping stubMapping = stubMappings.getAll().get(0);
stubMapping.setTransient(true);

context.checking(new Expectations() {{
one(mappingsFileSource).writeTextFile(
with(mappingFileName),
with(Json.write(stubMapping))
);
}});

jsonFileMappingsSource.saveMappings(stubMappings);
assertThat(stubMapping.isTransient(), is(false));
}

@Test
public void loadsMappingsViaClasspathFileSource() {
ClasspathFileSource fileSource = new ClasspathFileSource("jar-filesource");
Loading
Oops, something went wrong.

0 comments on commit b105792

Please sign in to comment.