Кодированное / зашифрованное тело перед проверкой Пакта
Сервер, с которым мне нужно интегрироваться, возвращает свои ответы, закодированные как JWT. Хуже того, тело ответа на самом деле является json, в форме:
{d: token} with token = JWT.encode({id: 123, field: "John", etc.})
Я хотел бы использовать проверку пакта для содержимого декодированного токена. Я знаю, что могу легко заключить договор, подтверждающий, что я получаю {d: string}, я не могу выполнить точное совпадение со строкой (поскольку JWT содержит несколько различных идентификаторов). То, что я хочу, это следующее, что предполагает добавление новой функциональности Pact.JWT.
my_provider.
upon_receiving('my request')
.with(method: :post,
path: '/order',
headers: {'Content-Type' => 'application/json'}
).will_respond_with(
status: 200,
headers: {'Content-Type' => 'application/json; charset=utf-8'},
body: {
d: Pact::JWT( {
id: Pact.like(123),
field: Pact.term(generate: "John", matcher: /J.*/
},signing_key,algo
)
})
Если не считать добавления Pact::JWT, есть ли способ достичь такого результата?
Я уже использую пакт-прокси для проверки. Я знаю, что вы можете изменить запрос перед отправкой его для проверки ( Как проверить соглашения по API, для которого требуется токен аутентификации?). Можете ли вы изменить запрос после получения его от прокси-сервера?
Если это так, я могу запланировать следующую работу:
- переключение в моем реальном коде, чтобы иногда ожидать, что ответы будут декодированы, а не в JWT
- запускать мои тесты один раз с выключенным (нормальное поведение кода, mocks возвращает закодированные данные JWT.
- Запустите мои тесты второй раз с выключенным выключателем (код ожидает данные, уже декодированные, mocks возвращает декодированные данные.)
- использовать контракт JSON из этого второго запуска
- подключитесь к прокси: проверьте задачу, чтобы декодировать JWT на лету, и используйте существующие механизмы пакта для проверки. (Шаг который я не знаю как сделать).
Мой код в рубине. У меня нет доступа к провайдеру.
Любые предложения приветствуются! Спасибо
1 ответ
Вы можете изменить запрос или ответ с помощью (другого) прокси-приложения.
class ProxyApp
def initialize real_provider_app
@real_provider_app = real_provider_app
end
def call env
response = @real_provider_app.call(env)
# modify response here
response
end
end
Pact.service_provider "My Service Provider" do
app { ProxyApp.new(RealApp) }
end
Пакт как инструмент, я не ожидаю, что это даст такое поведение из коробки.
На мой взгляд, лучшее,
- Не меняйте исходный код только для тестов
- Убедитесь, что ваши тесты проверяют только кодированный json (генерируйте кодированный ожидаемый json в тесте и проверяйте это с фактическим)