using System.Threading.Tasks; using System.Xml; using NFluent; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Settings; using WireMock.Types; using WireMock.Util; using Xunit; using Moq; using WireMock.Handlers; using FluentAssertions; #if !NETSTANDARD1_3 using Wmhelp.XPath2; #endif namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsXPathTests { private const string ClientIp = "::1"; private readonly Mock _filesystemHandlerMock; private readonly WireMockServerSettings _settings = new WireMockServerSettings(); public ResponseWithHandlebarsXPathTests() { _filesystemHandlerMock = new Mock(MockBehavior.Strict); _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); _settings.FileSystemHandler = _filesystemHandlerMock.Object; } [Fact] public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_BodyAsString() { // Assign var body = new BodyData { BodyAsString = @" abc def xyz ", DetectedBodyType = BodyType.String }; var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); var responseBuilder = Response.Create() .WithHeader("Content-Type", "application/xml") .WithBody("{{XPath.SelectSingleNode request.body \"/todo-list/todo-item[1]\"}}") .WithTransformer(); // Act var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); // Assert var nav = new XmlDocument { InnerXml = response.Message.BodyData.BodyAsString }.CreateNavigator(); var node = nav.XPath2SelectSingleNode("/response/todo-item"); Check.That(node.Value).Equals("abc"); Check.That(node.GetAttribute("id", "")).Equals("a1"); } [Fact] public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Text_Request_BodyAsString() { // Assign var body = new BodyData { BodyAsString = @" abc def xyz ", DetectedBodyType = BodyType.String }; var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); var responseBuilder = Response.Create() .WithHeader("Content-Type", "application/xml") .WithBody("{{XPath.SelectSingleNode request.body \"/todo-list/todo-item[1]/text()\"}}") .WithTransformer(); // Act var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("abc"); } [Fact] public async Task Response_ProvideResponse_Handlebars_XPath_SelectNodes_Request_BodyAsString() { // Assign var body = new BodyData { BodyAsString = @" abc def xyz ", DetectedBodyType = BodyType.String }; var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); var responseBuilder = Response.Create() .WithHeader("Content-Type", "application/xml") .WithBody("{{XPath.SelectNodes request.body \"/todo-list/todo-item\"}}") .WithTransformer(); // Act var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); // Assert var nav = new XmlDocument { InnerXml = response.Message.BodyData.BodyAsString }.CreateNavigator(); var nodes = nav.XPath2SelectNodes("/response/todo-item"); Check.That(nodes.Count + 1).IsEqualTo(3); } [Fact] public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_SoapXML_BodyAsString() { // Assign string soap = @" 10 MsgId10 Betalen CRM COU RdplDbTknLystByOvkLyst 8 N ? CRM CRMi BerId RdplDbTknLystByOvkLyst N 0000083256 0000083259 "; var body = new BodyData { BodyAsString = soap, DetectedBodyType = BodyType.String }; var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); var responseBuilder = Response.Create() .WithHeader("Content-Type", "application/xml") .WithBody("{{XPath.SelectSingleNode request.body \"//*[local-name()='TokenIdLijst']\"}}") .WithTransformer(); // Act var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); // Assert response.Message.BodyData.BodyAsString.Should().Contain("TokenIdLijst").And.Contain("0000083256").And.Contain("0000083259"); } [Fact] public async Task Response_ProvideResponse_Handlebars_XPath_Evaluate_Request_BodyAsString() { // Assign var body = new BodyData { BodyAsString = @" abc def xyz ", DetectedBodyType = BodyType.String }; var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); var responseBuilder = Response.Create() .WithHeader("Content-Type", "application/xml") .WithBody("{{XPath.Evaluate request.body \"boolean(/todo-list[count(todo-item) = 3])\"}}") .WithTransformer(); // Act var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsString).IsEqualIgnoringCase("True"); } [Fact] public async Task Response_ProvideResponse_Handlebars_XPath_Evaluate_Attribute_Request_BodyAsString() { // Assign var body = new BodyData { BodyAsString = @" abc def xyz ", DetectedBodyType = BodyType.String }; var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); var responseBuilder = Response.Create() .WithHeader("Content-Type", "application/xml") .WithBody("{{XPath.Evaluate request.body \"string(/todo-list/todo-item[1]/@id)\"}}") .WithTransformer(); // Act var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("a1"); } } }