Сопоставление заголовка Spring Cloud Contract YAML

При создании нового ресурса методом POST местоположение нового ресурса добавляется в ответ в виде заголовка Location.

Как создать YML-контракт spring-cloud, чтобы убедиться, что ответ содержит заголовок Location с допустимым значением URI?

Я пытался использовать YAML ниже, но это не сработало.

request:
  method: POST
  url: /customers/v1
  body:
    firstName: First Name
    lastName: Last Name
    dateOfBirth: "1990-12-12"
    active: false
  headers:
    Content-Type: application/json
response:
  status: 201
  matchers:
    headers:
      - key: Location
        regex: "http://localhost/customers/v1/*"

Сгенерированный код для тестирования

@Test
public void validate_create_customer_successfully() throws Exception {
    // given:
        MockMvcRequestSpecification request = given()
                .header("Content-Type", "application/json")
                .body("{\"firstName\":\"First Name\",\"lastName\":\"Last Name\",\"dateOfBirth\":\"1990-12-12\",\"active\":false}");

    // when:
        ResponseOptions response = given().spec(request)
                    .post("/customers/v1");

    // then:
        assertThat(response.statusCode()).isEqualTo(201);
}

Сгенерированный код не содержит проверки заголовков.


person Sudhir    schedule 01.03.2020    source источник
comment
Какую версию весеннего облачного контракта вы используете? Пожалуйста, проверьте, работает ли последняя доступная версия ga   -  person Marcin Grzejszczak    schedule 02.03.2020
comment
@MarcinGrzejszczak Я использую 2.2.1.RELEASE. Мой репозиторий доступен здесь для справки.   -  person Sudhir    schedule 02.03.2020


Ответы (2)


Я не проверял это, но что произойдет, если вы попробуете:

response:
  status: 201
  matchers:
    headers:
      - key: Location
        type: by_regex
        predefined: url

Это то, что вы бы использовали для сопоставления тела, я не уверен, что это сработает для заголовков.

Просто чтобы вы были в курсе. Я считаю, что раздел сопоставителей предназначен только для тестирования стороны ответа (проверка ответа, отправленного производителем). Если вы также хотите предоставить этот заголовок в качестве ответа-заглушки для вашего потребителя, вам нужно будет добавить его вне раздела сопоставления с фиксированным значением.

person I.Brok    schedule 03.03.2020
comment
Спасибо за предложение, но оно не сработало. type: by_regex приводит к ошибке, которая препятствует созданию соответствующего тестового примера. Я пробовал с regexType: as_string, но результат все тот же. - person Sudhir; 03.03.2020
comment
К сожалению, это, вероятно, не поддерживается в разделе заголовка. Если вы используете groovy dsl вместо yaml, я знаю, что у вас есть возможность определить проверку ответа производителя пользовательских функций: cloud.spring.io/spring-cloud-contract/2.1.x/single/ Это позволит вам определить функцию в вашем тесте база, которая затем могла бы использовать Pattern URL = UrlHelper.URL. Но эти пользовательские функции не поддерживаются в yaml dsl. - person I.Brok; 03.03.2020
comment
Еще раз спасибо за предложение. Упомянутая вами ссылка помогла мне лучше понять ее и подтолкнула к дальнейшим поискам. Наконец, этот пример показал мне новый вариант, и он сработал - person Sudhir; 03.03.2020

Ниже определение yaml работает

response:
  status: 201
  headers:
      Location: "http://localhost/customers/v1/"
  matchers:
    headers:
      - key: Location
        regex: "http://localhost/customers/v1/.*"

Сгенерированный код для тестирования

// then:
    assertThat(response.statusCode()).isEqualTo(201);
    assertThat(response.header("Location")).matches("http://localhost/customers/v1/.*");

Это работает, как и ожидалось. Я не знаю почему. Может кто-нибудь объяснить?

person Sudhir    schedule 03.03.2020
comment
О да. Я мог бы указать вам на это, но я думал, что вы хотите проверить любой действительный URL-адрес и вам нужен предопределенный шаблон URL-адреса. Разница в том, что в вашем вопросе вы использовали предопределенный шаблон регулярного выражения для URL-адреса, предоставленного контрактом Spring Cloud. Однако, по-видимому, это не поддерживается для заголовка, как мы пришли к выводу. Однако теперь вы предоставляете свое собственное регулярное выражение, которое поддерживается для заголовков, которое не соответствует ни одному из URL-адресов, а вашему конкретному URL-адресу с любым возможным дополнением. - person I.Brok; 03.03.2020