using System; using System.Threading.Tasks; using Moq; using Newtonsoft.Json.Linq; using NFluent; using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsFileTests { private readonly Mock _filesystemHandlerMock; private readonly WireMockServerSettings _settings = new WireMockServerSettings(); private const string ClientIp = "::1"; public ResponseWithHandlebarsFileTests() { _filesystemHandlerMock = new Mock(MockBehavior.Strict); _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); _settings.FileSystemHandler = _filesystemHandlerMock.Object; } [Fact] public async Task Response_ProvideResponseAsync_Handlebars_File() { // Assign var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); var response = Response.Create() .WithBodyAsJson(new { Data = "{{File \"x.json\"}}" }) .WithTransformer(); // Act var responseMessage = await response.ProvideResponseAsync(request, _settings); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); Check.That(j["Data"].Value()).Equals("abc"); // Verify _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString("x.json"), Times.Once); _filesystemHandlerMock.VerifyNoOtherCalls(); } [Fact] public async Task Response_ProvideResponseAsync_Handlebars_File_Replace() { // Assign var request = new RequestMessage(new UrlDetails("http://localhost:1234?id=x"), "GET", ClientIp); var response = Response.Create() .WithBodyAsJson(new { Data = "{{File \"{{request.query.id}}.json\"}}" }) .WithTransformer(); // Act var responseMessage = await response.ProvideResponseAsync(request, _settings); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); Check.That(j["Data"].Value()).Equals("abc"); // Verify _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString("x.json"), Times.Once); _filesystemHandlerMock.VerifyNoOtherCalls(); } [Fact] public void Response_ProvideResponseAsync_Handlebars_File_WithMissingArgument_ThrowsArgumentOutOfRangeException() { // Assign var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); var response = Response.Create() .WithBodyAsJson(new { Data = "{{File}}" }) .WithTransformer(); // Act Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settings)).Throws(); // Verify _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString(It.IsAny()), Times.Never); _filesystemHandlerMock.VerifyNoOtherCalls(); } } }