Вложенная итерация над JSON с использованием Groovy Closure в REST-гарантированном - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующий ответ JSON для моей конечной точки REST:

{
  "response": {
    "status": 200,
    "startRow": 0,
    "endRow": 1,
    "totalRows": 1,
    "next": "",
    "data": {
      "id": "workflow-1",
      "name": "SampleWorkflow",
      "tasks": [
        {
          "id": "task-0",
          "name": "AWX",
          "triggered_by": ["task-5"]
        },
        {
          "id": "task-1",
          "name": "BrainStorming",
          "triggered_by": ["task-2", "task-5"]
        },
        {
          "id": "task-2",
          "name": "OnHold",
          "triggered_by": ["task-0", "task-4", "task-7", "task-8", "task9"]
        },
        {
          "id": "task-3",
          "name": "InvestigateSuggestions",
          "triggered_by": ["task-6"]
        },
        {
          "id": "task-4",
          "name": "Mistral",
          "triggered_by": ["task-3"]
        },
        {
          "id": "task-5",
          "name": "Ansible",
          "triggered_by": ["task-3"]
        },
        {
          "id": "task-6",
          "name": "Integration",
          "triggered_by": []
        },
        {
          "id": "task-7",
          "name": "Tower",
          "triggered_by": ["task-5"]
        },
        {
          "id": "task-8",
          "name": "Camunda",
          "triggered_by": ["task-3"]
        },
        {
          "id": "task-9",
          "name": "HungOnMistral",
          "triggered_by": ["task-0", "task-7"]
        },
        {
          "id": "task-10",
          "name": "MistralIsChosen",
          "triggered_by": ["task-1"]
        }
      ]
    }
  }
}

Я использую «уверенный в себе» с выражением gpath gpath для извлечения следующим образом:

given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{ it.triggered_by.contains('task-3') }.name")

, что правильно дает мне [Mistral, Ansible, Camunda]

Я пытаюсь найти имена задач, которые запускаются задачей InvestigateSuggestions. Но я не знаю наверняка, что задача, которую я должен передать contains(), равна task-3; Я знаю только его имя, то есть InvestigateSuggestions. Поэтому я пытаюсь сделать:

given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{ 
    it.triggered_by.contains(response.data.tasks.find{
    it.name.equals('InvestigateSuggestions')}.id) }.name")

, который не работает и жалуется, что параметр "response" был использован, но не определен.

Как перебрать внешнюю коллекцию из замыкания findAll, чтобы найти правильный id для перехода в contains() ??

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Вы можете использовать грязный секрет, restAssuredJsonRootObject. Это недокументировано (и может быть изменено, хотя, насколько я помню, за 7 лет + REST Assured).

Это позволит вам написать:

given()
.when()
.get("http://localhost:8080/workflow-1")
.then()
.extract()
.path("response.data.tasks.findAll{ 
    it.triggered_by.contains(restAssuredJsonRootObject.response.data.tasks.find{
    it.name.equals('InvestigateSuggestions')}.id) }.name")

Если вы не хотите использовать этот «хак», вам нужно сделать что-то похожее на то, что Майкл Пасха предложил в своем ответе .

Когда дело доходит до генерации совпадений на основе тела ответа, история лучше. Смотри документы здесь .

0 голосов
/ 01 сентября 2018

Я не уверен, что это идиоматично, но один из подходов - сначала найти id, а затем подставить в другой запрос:

@Test
void testCase1() {
    def json = given()
    .when()
    .get("http://localhost:5151/egg_minimal/stacko.json")

    // e.g. id = 'task-3' for name 'InvestigateSuggestions'

    def id = json
    .then()
    .extract()
    .path("response.data.tasks.find { it.name == 'InvestigateSuggestions' }.id")

    // e.g. tasks have name 'task-3'

    def tasks = json
    .then()
    .extract()
    .path("response.data.tasks.findAll{ it.triggered_by.contains('${id}') }.name")

    assertEquals(['Mistral', 'Ansible', 'Camunda'], tasks)
}
...