Проверка / сопоставление поля JSON для числа, а не строки во входном запросе в Wiremock

#wiremock #wiremock-standalone

#wiremock #wiremock-автономный

Вопрос:

Я пытаюсь проверить конкретное поле json amount в запросе на наличие числа, а не строки

 {
  "request": {
    "method": "POST",
    "urlPath": "/charges",
    "bodyPatterns" : [
      {"matchesJsonPath" : "$[?(@.amount =~ /^[0-9]*$/i)]"}
    ]
}
 

Теперь request1 и request2 работают нормально, а request3 завершается с ошибкой. Но я ожидаю, что request2 также завершится ошибкой, потому что это строка, а не число, поскольку оно заключено в двойные кавычки.

Запрос 1,

 {
    "amount": 123,
}
 

Запрос 2,

 {
    "amount": "123",
}
 

Запрос 3,

 {
    "amount": "a123",
}
 

Возможно ли это?. Я вижу в документах wiremock

     Since WireMock’s matching operators all work on strings, 
the value selected by the JSONPath expression will be coerced to a string before the match is evaluated.
 

Ответ №1:

Я нашел обходной путь.

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

Итак, в matchesJsonPath выполните фиктивную проверку того, что значение больше или равно нулю. Это гарантирует, что значение 123 будет работать, но «123» выдаст ошибку

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

 {
  "request": {
    "method": "POST",
    "urlPath": "/charges",
    "bodyPatterns" : [
      {"matchesJsonPath" : "$[?(@.amount >= 0)]"}
    ]
}