pactpact-jvm

PACT jvm matching rules are being ignored when running test


I'm using PACT JVM https://github.com/DiUS/pact-jvm/tree/master/provider/pact-jvm-provider-junit I don't know why the matching rules in my contact are being ignored. My HTTP test

@RunWith(SpringRestPactRunner.class) // Say JUnit to run tests with custom Runner
@Provider("provDataTest")// Set up name of tested provider
@PactBroker(host="pact-broker.services", port = "80")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,
        properties = {"spring.profiles.active=dev"},
        classes = Application.class)
public class ContractTesting {

    private static String token;

    @BeforeClass //Method will be run once: before whole contract test suite
    public static void setUpService() {
        //Run DB, create schema
        //Run service
        //...
        System.out.println("Now service in default state");
    }

    @TargetRequestFilter
    public void exampleRequestFilter(HttpRequest request) {

    }

    @State("Check correct data json structure in case code: 401")
    public void checkDataInCaseUnauthorized() {

    }

    @TestTarget // Annotation denotes Target that will be used for tests
    public final Target target = new HttpTarget(8082);

And my Contract file

{
  "provider": {
    "name": "provDataTest"
  },
  "consumer": {
    "name": "test"
  },
  "interactions": [
    {
      "description": "Read all links_401",
      "request": {
        "method": "GET",
        "path": "/v1/consumer/me/link_social_account",
        "headers": {
          "invalidAuth": "401"
        }
      },
      "response": {
        "status": 401,
        "headers": {
          "Content-Type": "text/json;charset=utf-8"
        },
        "body": {
          "error": {
            "code": 401,
            "message": "session incorrect",
            "errors": []
          }
        },
        "matchingRules": {
          "body": {
            "$.error": {
              "matchers": [
                {
                  "match": "type"
                }
              ],
              "combine": "AND"
            },
            "$.error.code": {
              "matchers": [
                {
                  "match": "integer"
                }
              ],
              "combine": "AND"
            },
            "$.error.message": {
              "matchers": [
                {
                  "match": "type"
                }
              ],
              "combine": "AND"
            },
            "$.error.errors[*].message": {
              "matchers": [
                {
                  "match": "type"
                }
              ],
              "combine": "AND"
            },
            "$.error.errors[*].field": {
              "matchers": [
                {
                  "match": "type"
                }
              ],
              "combine": "AND"
            }
          },
          "header": {
            "Content-Type": {
              "matchers": [
                {
                  "match": "text/json;charset=utf-8",
                  "regex": "regex"
                }
              ],
              "combine": "AND"
            }
          }
        }
      },
      "providerStates": [
        {
          "name": "Check correct data json structure in case code: 401"
        }
      ]
    }
  ],
  "metadata": {
    "pactSpecification": {
      "version": "3.0.0"
    },
    "pact-jvm": {
      "version": "3.2.11"
    }
  }
}

And show error after run

Read all links_401 returns a response which has a matching body
      Read all links_401 returns a response which has a matching
body=BodyComparisonResult(mismatches={/=[BodyMismatch(expected=[B@480e8a7a, actual=[B@10378c35, mismatch=Actual body '[B@10378c35' is not equal to the expected body '[B@480e8a7a', path=/, diff=null)]},
 diff=[-{"error":{"code":401,"message":"session incorrect","errors":[]}}, 
+{"error":{"code":401,"message":"session incorrect, please login again (CR_A1004)","errors":[]}}])

I have tried to change regex but the problem is still happening. It is only correct when message data correct.

Please help to give my point incorrect.

Thanks,


Solution

  • The problem is with your content-type header: "Content-Type": "text/json;charset=utf-8". The proper content type for JSON payloads should be application/json. That is why the matchers are not being applied, because the body is being treated as a text payload. Just change the content type and then the body will be parsed as a JSON document and the matchers will be applied to the fields.