Кодированное / зашифрованное тело перед проверкой Пакта

Сервер, с которым мне нужно интегрироваться, возвращает свои ответы, закодированные как 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 в тесте и проверяйте это с фактическим)
Другие вопросы по тегам