Skip to content

Commit

Permalink
Post multiple Mappings (#242)
Browse files Browse the repository at this point in the history
* Post multiple Mappings

* 1.0.6
  • Loading branch information
StefH authored Dec 15, 2018
1 parent d654ef9 commit 98097a0
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 38 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</PropertyGroup>

<PropertyGroup>
<VersionPrefix>1.0.5</VersionPrefix>
<VersionPrefix>1.0.6</VersionPrefix>
</PropertyGroup>

<Choose>
Expand Down
2 changes: 1 addition & 1 deletion GitHubReleaseNotes.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
https:/StefH/GitHubReleaseNotes

GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.5
GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.6
8 changes: 8 additions & 0 deletions src/WireMock.Net/Client/IFluentMockServerAdmin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ public interface IFluentMockServerAdmin
[Header("Content-Type", "application/json")]
Task<StatusModel> PostMappingAsync([Body] MappingModel mapping);

/// <summary>
/// Add new mappings.
/// </summary>
/// <param name="mappings">MappingModels</param>
[Post("__admin/mappings")]
[Header("Content-Type", "application/json")]
Task<StatusModel> PostMappingsAsync([Body] IList<MappingModel> mappings);

/// <summary>
/// Delete all mappings.
/// </summary>
Expand Down
42 changes: 34 additions & 8 deletions src/WireMock.Net/Server/FluentMockServer.Admin.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
using JetBrains.Annotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using WireMock.Admin.Mappings;
using WireMock.Admin.Scenarios;
using WireMock.Admin.Settings;
Expand Down Expand Up @@ -412,11 +412,21 @@ private ResponseMessage MappingsGet(RequestMessage requestMessage)

private ResponseMessage MappingsPost(RequestMessage requestMessage)
{
Guid? guid;
try
{
var mappingModel = DeserializeObject<MappingModel>(requestMessage);
guid = DeserializeAndAddOrUpdateMapping(mappingModel);
var mappingModels = DeserializeObjectArray<MappingModel>(requestMessage);
if (mappingModels.Length == 1)
{
Guid? guid = DeserializeAndAddOrUpdateMapping(mappingModels[0]);
return ResponseMessageBuilder.Create("Mapping added", 201, guid);
}

foreach (var mappingModel in mappingModels)
{
DeserializeAndAddOrUpdateMapping(mappingModel);
}

return ResponseMessageBuilder.Create("Mappings added", 201);
}
catch (ArgumentException a)
{
Expand All @@ -428,8 +438,6 @@ private ResponseMessage MappingsPost(RequestMessage requestMessage)
_logger.Error("HttpStatusCode set to 500 {0}", e);
return ResponseMessageBuilder.Create(e.ToString(), 500);
}

return ResponseMessageBuilder.Create("Mapping added", 201, guid);
}

private Guid? DeserializeAndAddOrUpdateMapping(MappingModel mappingModel, Guid? guid = null, string path = null)
Expand Down Expand Up @@ -793,5 +801,23 @@ private T DeserializeObject<T>(RequestMessage requestMessage)

return default(T);
}

private T[] DeserializeObjectArray<T>(RequestMessage requestMessage)
{
if (requestMessage?.BodyData?.DetectedBodyType == BodyType.Json)
{
var bodyAsJson = requestMessage.BodyData.BodyAsJson;

if (bodyAsJson is JArray jArray)
{
return jArray.ToObject<T[]>();
}

var value = ((JObject)requestMessage.BodyData.BodyAsJson).ToObject<T>();
return new[] { value };
}

return default(T[]);
}
}
}
82 changes: 54 additions & 28 deletions test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using System.Linq;
using NFluent;
using RestEase;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using NFluent;
using RestEase;
using WireMock.Admin.Mappings;
using WireMock.Admin.Settings;
using WireMock.Client;
Expand All @@ -19,7 +19,7 @@ public class FluentMockServerAdminRestClientTests
[Fact]
public async Task IFluentMockServerAdmin_GetSettingsAsync()
{
// Assign
// Arrange
var server = FluentMockServer.StartWithAdminInterface();
var api = RestClient.For<IFluentMockServerAdmin>(server.Urls[0]);

Expand All @@ -31,7 +31,7 @@ public async Task IFluentMockServerAdmin_GetSettingsAsync()
[Fact]
public async Task IFluentMockServerAdmin_PostSettingsAsync()
{
// Assign
// Arrange
var server = FluentMockServer.StartWithAdminInterface();
var api = RestClient.For<IFluentMockServerAdmin>(server.Urls[0]);

Expand All @@ -44,7 +44,7 @@ public async Task IFluentMockServerAdmin_PostSettingsAsync()
[Fact]
public async Task IFluentMockServerAdmin_PutSettingsAsync()
{
// Assign
// Arrange
var server = FluentMockServer.StartWithAdminInterface();
var api = RestClient.For<IFluentMockServerAdmin>(server.Urls[0]);

Expand All @@ -57,22 +57,15 @@ public async Task IFluentMockServerAdmin_PutSettingsAsync()
[Fact]
public async Task IFluentMockServerAdmin_PostMappingAsync()
{
// Assign
// Arrange
var server = FluentMockServer.StartWithAdminInterface();
var api = RestClient.For<IFluentMockServerAdmin>(server.Urls[0]);

// Act
var model = new MappingModel
{
Request = new RequestModel
{
Path = "/1"
},
Response = new ResponseModel
{
Body = "txt",
StatusCode = 200
},
Request = new RequestModel { Path = "/1" },
Response = new ResponseModel { Body = "txt", StatusCode = 200 },
Priority = 500,
Title = "test"
};
Expand All @@ -90,10 +83,41 @@ public async Task IFluentMockServerAdmin_PostMappingAsync()
server.Stop();
}

[Fact]
public async Task IFluentMockServerAdmin_PostMappingsAsync()
{
// Arrange
var server = FluentMockServer.StartWithAdminInterface();
var api = RestClient.For<IFluentMockServerAdmin>(server.Urls[0]);

// Act
var model1 = new MappingModel
{
Request = new RequestModel { Path = "/1" },
Response = new ResponseModel { Body = "txt 1" },
Title = "test 1"
};
var model2 = new MappingModel
{
Request = new RequestModel { Path = "/2" },
Response = new ResponseModel { Body = "txt 2" },
Title = "test 2"
};
var result = await api.PostMappingsAsync(new[] { model1, model2 });

// Assert
Check.That(result).IsNotNull();
Check.That(result.Status).IsNotNull();
Check.That(result.Guid).IsNull();
Check.That(server.Mappings.Where(m => !m.IsAdminInterface)).HasSize(2);

server.Stop();
}

[Fact]
public async Task IFluentMockServerAdmin_FindRequestsAsync()
{
// given
// Arrange
var server = FluentMockServer.Start(new FluentMockServerSettings
{
StartAdminInterface = true,
Expand All @@ -103,10 +127,10 @@ public async Task IFluentMockServerAdmin_FindRequestsAsync()
await new HttpClient().GetAsync(serverUrl + "/foo");
var api = RestClient.For<IFluentMockServerAdmin>(serverUrl);

// when
// Act
var requests = await api.FindRequestsAsync(new RequestModel { Methods = new[] { "GET" } });

// then
// Assert
Check.That(requests).HasSize(1);
var requestLogged = requests.First();
Check.That(requestLogged.Request.Method).IsEqualTo("GET");
Expand All @@ -117,7 +141,7 @@ public async Task IFluentMockServerAdmin_FindRequestsAsync()
[Fact]
public async Task IFluentMockServerAdmin_GetRequestsAsync()
{
// given
// Arrange
var server = FluentMockServer.Start(new FluentMockServerSettings
{
StartAdminInterface = true,
Expand All @@ -127,10 +151,10 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync()
await new HttpClient().GetAsync(serverUrl + "/foo");
var api = RestClient.For<IFluentMockServerAdmin>(serverUrl);

// when
// Act
var requests = await api.GetRequestsAsync();

// then
// Assert
Check.That(requests).HasSize(1);
var requestLogged = requests.First();
Check.That(requestLogged.Request.Method).IsEqualTo("GET");
Expand All @@ -141,7 +165,7 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync()
[Fact]
public async Task IFluentMockServerAdmin_GetRequestsAsync_JsonApi()
{
// given
// Arrange
var server = FluentMockServer.Start(new FluentMockServerSettings
{
StartAdminInterface = true,
Expand All @@ -159,13 +183,14 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync_JsonApi()
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType);

var response = await new HttpClient().SendAsync(request);
Check.That(response).IsNotNull();

var api = RestClient.For<IFluentMockServerAdmin>(serverUrl);

// when
// Act
var requests = await api.GetRequestsAsync();

// then
// Assert
Check.That(requests).HasSize(1);
var requestLogged = requests.First();
Check.That(requestLogged.Request.Method).IsEqualTo("POST");
Expand All @@ -176,7 +201,7 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync_JsonApi()
[Fact]
public async Task IFluentMockServerAdmin_GetRequestsAsync_Json()
{
// given
// Arrange
var server = FluentMockServer.Start(new FluentMockServerSettings
{
StartAdminInterface = true,
Expand All @@ -193,13 +218,14 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync_Json()
request.Content = new StringContent(data);
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType);
var response = await new HttpClient().SendAsync(request);
Check.That(response).IsNotNull();

var api = RestClient.For<IFluentMockServerAdmin>(serverUrl);

// when
// Act
var requests = await api.GetRequestsAsync();

// then
// Assert
Check.That(requests).HasSize(1);
var requestLogged = requests.First();
Check.That(requestLogged.Request.Method).IsEqualTo("POST");
Expand Down

0 comments on commit 98097a0

Please sign in to comment.