Search code examples
spring-cloud-contract

How can I verify that a map's values are not empty


Suppose I have a contract like this specified in groovy:

org.springframework.cloud.contract.spec.Contract.make {
request {
    method "GET"
    url "/api/profiles"
    headers {
        header('Accept': 'application/json;charset=UTF-8')
        header('Content-Type': 'application/json;charset=UTF-8')
    }
}
response {
    status 200
    headers {
        header('Content-Type': 'application/json;charset=UTF-8')
    }
    body(
            value(
                    stub(
                            '''\
                    [
                      {
                        "profile": "profile1",
                        "myMap": {}
                      },
                      {
                        "profile": "profile2",
                        "myMap": {
                          "12345": "FOO",
                          "asdf": "BAR"
                        }
                      }
                    ]   
                    '''
                    ),
                    test(
                            [
                                    [
                                            "profile" : regex(nonEmpty()),
                                            "myMap": [
                                                         [
                                                            ??
                                                         ]
                                                      ]
                                    ]
                            ]
                    )
            )
    )
}

}

Now I want to test that the map contains String to String entries where the values must not be empty. The map itself may be empty.

How can I test for dynamic key name?


Solution

  • On the response side of the contract you have to chose whether you're using the map notation or the string notation. If you want to do assertions on pieces of the response you have to embed those assertions inside the body or use the test matchers.

    You can put the body as a multiline string and then write the testMatchers section

    testMatchers{
        jsonPath('$.[*].myMap', byCommand('assertKeys($it)'))
    }
    

    then it's enough for you to provide the assertion in the assertKeys method.