WireMock-Net / WireMock.Net

WireMock.Net is a flexible product for stubbing and mocking web HTTP responses using advanced request matching and response templating. Based on the functionality from http://WireMock.org, but extended with more functionality.
Apache License 2.0
1.35k stars 197 forks source link

Request Matching JsonPathMatcher Partially #1114

Open hmiguel opened 3 weeks ago

hmiguel commented 3 weeks ago

Hello, I'm trying to match a json path partially, but I'm not sure how to do it.

Here's what I have:

        var client = new HttpClient();
        var server = WireMockServer.Start();

        // this match
        var test1 = new { things = new { name = "RequiredThing" } };

        // this does not match
        var test2 = new { things = new { name = "RequiredThing" }, soup = "carrot" };

        server.Given(
            WireMock.RequestBuilders.Request.Create()
            .WithPath("/test1")
                .UsingPost()
                .WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]"))
            )
            .RespondWith(
                WireMock.ResponseBuilders.Response.Create()
                   .WithHeader("Content-Type", "application/json")
                   .WithStatusCode(200)
                   .WithDelay(TimeSpan.FromMilliseconds(50))
            );

        server.Given(
           WireMock.RequestBuilders.Request.Create()
           .WithPath("/test2")
               .UsingPost()
               .WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]"))
           )
           .RespondWith(
               WireMock.ResponseBuilders.Response.Create()
                  .WithHeader("Content-Type", "application/json")
                  .WithStatusCode(200)
                  .WithDelay(TimeSpan.FromMilliseconds(50))
           );

        var response1 = await client.PostAsJsonAsync($"http://localhost:{server.Port}/test1", test1);
        response1.EnsureSuccessStatusCode();

        var response2 = await client.PostAsJsonAsync($"http://localhost:{server.Port}/test2", test2);
        response2.EnsureSuccessStatusCode();

My expectation is that both requests match, but the second one fails.

The same approach using JmesPathMatching works fine.

server.Given(
    WireMock.RequestBuilders.Request.Create()
    .WithPath("/test2")
        .UsingPost()
       //.WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]"))
       .WithBody(new JmesPathMatcher("things.name == 'RequiredThing'"))
    )
    .RespondWith(
        WireMock.ResponseBuilders.Response.Create()
           .WithHeader("Content-Type", "application/json")
           .WithStatusCode(200)
           .WithDelay(TimeSpan.FromMilliseconds(50))
    );

WireMock.Net: 1.5.56