pact-foundation/pact-js

Using a fromProviderState matcher in a query parameter value shouldn't return a json path matcher in the generated pact

csydvs opened this issue · 0 comments

csydvs commented

Software versions

Please provide at least OS and version of pact-js

  • OS: Mac OSX 12.6.5
  • Consumer Pact library: Pact JS 12.1.0
  • Provider Pact library: pact jvm maven 4.5.6
  • Node Version: 18.17.1

Issue Checklist

Please confirm the following:

  • [*] I have upgraded to the latest
  • [*] I have the read the FAQs in the Readme
  • [*] I have triple checked, that there are no unhandled promises in my code and have read the section on intermittent test failures
  • [n/a] I have set my log level to debug and attached a log file showing the complete request/response cycle
  • For bonus points and virtual high fives, I have created a reproduceable git repository (see below) to illustrate the problem

Expected behaviour

Using a fromProviderState matcher in a query parameter value shouldn't return a JsonPath matcher.

The reality is that I wasn't totally sure whether to open the bug on this side of the pact jvm side (for my provider), but I found this note from the V3 path specification, and if I'm reading it right, I think that it's an error on the pact-js side. But maybe there's something else I'm missing to get these things to match up correctly.

So, I think that in the generated pact, I should get something like this:

        "generators": {
          "query": {
            "fooIdentifier": {
              "expression": "${fooIdentifier}",
              "type": "ProviderState"
            }
          }
        },
        "matchingRules": {
          "query": {
            "fooIdentifier": {
              "combine": "AND",
              "matchers": [
                {
                  "match": "type"
                }
              ]
            }
          }
        },

Instead of

        "generators": {
          "query": {
            "$.fooIdentifier[0]": {
              "expression": "${fooIdentifier}",
              "type": "ProviderState"
            }
          }
        },
        "matchingRules": {
          "query": {
            "$.fooIdentifier[0]": {
              "combine": "AND",
              "matchers": [
                {
                  "match": "type"
                }
              ]
            }
          }
        },

If I make this change manually to the pact, then pact-jvm injects the provider state like I would expect.

Actual behaviour

Using json path in the path matchers for query parameters.

Steps to reproduce

Using provider = PactV3({ ... }), have a provider test with something like

provider.given('some state')
   .uponReceiving('a request for all the foos'))))
   .withRequest({
      method: 'GET',
      path: '/api/foos',
      query: {
          fooIdentifier: MatchersV3.fromProviderState('${fooIdentifier}', 'abc123')
      })
     .willRespondWith({
          status: 200
     })

And then do the test and generate the state.