Вставьте matchJsonPath из Groovy в Spring Cloud Contract - PullRequest
0 голосов
/ 31 января 2020

При написании Spring Cloud Contract в Groovy я хочу указать явное JSON выражение пути. Выражение:

"$.['variants'][*][?(@.['name'] == 'product_0004' && @.['selected'] == true)]"

должно появиться в сгенерированном json, например:

{
  "request" : {
    "bodyPatterns": [ {
      "matchesJsonPath": "$.['variants'][*][?(@.['name'] == 'product_0004' && @.['selected'] == true)]"
    } ]
  }
}

, чтобы соответствовать, например:

{ "variants": [
    { "name": "product_0003", "selected": false },
    { "name": "product_0004", "selected": true  },
    { "name": "product_0005", "selected": false } ]
}

и не соответствует, например:

{ "variants": [
    { "name": "product_0003", "selected": false },
    { "name": "product_0004", "selected": false },
    { "name": "product_0005", "selected": true  } ]
}

Возможно ли это с помощью потребителей, bodyMatchers или другого объекта Groovy DSL?

1 Ответ

0 голосов
/ 03 марта 2020

Существуют некоторые возможности для сопоставления по пути json, но вы не обязательно используете его для сопоставления с явными значениями, а скорее для создания гибкой заглушки для потребителя с помощью регулярных выражений. Хотя есть некоторые возможности.

Таким образом, раздел body - это ваше тело запроса c с жестко закодированными значениями, а раздел bodyMatchers дает вам возможность сделать сопоставление заглушки со стороны потребителя более гибким.

Contract.make {
  request {
    method 'POST'
    url '/some-url'
    body ([
      id: id
      items: [
         foo: foo
         bar: bar
      ],
      [
         foo: foo
         bar: foo
      ]
    ])
    bodyMatchers {
        jsonPath('$.id', byEquality())       //1
        jsonPath('$.items[*].foo', byRegex('(?:^|\\W)foo(?:$|\\W)'))    //2
        jsonPath('$.items[*].bar', byRegex(nonBlank()))     //3
      }
      headers {
          contentType(applicationJson())
      }
  }
  response {
    status 200
  }
}

Я ссылался на некоторые строки

1: «byEquality ()» в разделе bodyMatchers означает: входные данные от потребителя должны быть равны значению, указанному в теле для совпадения этого контракта / заглушки, другими словами должен быть "id".

2: Я не уверен, насколько хорошо будет работать решение // 1, когда свойство находится в списке, и вы хотите, чтобы заглушка была гибкой с количеством предоставленных элементов. Для этого я также включил это byRegex, что означает, что для любого элемента в списке свойство foo должно иметь в точности значение «foo». Тем не менее, я действительно не знаю, почему вы хотели бы сделать это.

3: Именно здесь bodyMatchers действительно наиболее полезны. Эта строка означает: соответствовать этому контракту, если каждая строка свойств в списке элементов является непустой строкой. Это позволяет вам иметь динамическую заглушку c с гибким размером списков / массивов.

Все условия в bodyMatchers должны быть выполнены для соответствия заглушке.

...