2016-11-24 3 views
2

Я использую жемчужину Pact (и люблю его!) Для моего тестового набора контрактов. Для службы API, которую я тестирую, требуется токен авторизации для всех запросов.Как проверить pacts против API, для которого требуется токен аутентификации?

Я знаю, как создать токен API для моего пользователя, но я не знаю, где разместить токен в рабочем процессе Pact. Я искал документацию Пакта и репо для примеров, но мне не повезло.

Я попытался отправить POST в потребительских спецификациях, чтобы создать токен, но макет Pact-макета не знает, что делать с запросом и ошибками (как и следовало ожидать).

Я нашел this example и кажется многообещающим, в частности, возможность назначать предопределенные заголовки всем запросам с помощью requestFilter и метода addHeader.

Как я могу использовать такой фильтр запросов с драгоценным камнем Pact?

Если это не текущая функция, какие у меня альтернативы?

UPDATE:

J_A_X's answer работает отлично подходит для создания пактов с макетом сервером, но это не удовлетворяет ожидания провайдера услуг API действительного токен аутентификации. В частности, мне нужно динамически вставить действительные токены аутентификации в пакты при запуске pact: проверьте. Итак, на один шаг ближе, но все же нужно выяснить последнюю часть.

Matthew's answer содержит намеки на то, что представляется двумя возможными решениями для последней части (pact: verify). Я стесняюсь представить другую зависимость, поэтому мне бы хотелось, чтобы работа над классом ProxyApp работала. Я не понимаю, что именно я передал бы в ProxyApp.new(). Предложения?

ответ

1

Вам действительно не нужно использовать реальный токен для каждого взаимодействия с пактом, если вы действительно этого не хотите.

Обычно для такого рода вещей я просто создаю регулярное выражение для использования в заголовке для проверки определенных правил, сохраняя его «открытым». В моем проекте узла (который использует двоичный Рубиновый в спине), я создал эти 2 утилиты функции для создания объектов с рисунком, а другим для объекта минимума равного:

function term(matcher, generate) { 
    if ((typeof matcher === 'undefined') || (typeof generate === 'undefined')) { 
     throw 'Matcher and Generate arguments must be specified to use Term'; 
    } 
    return { 
     "json_class": "Pact::Term", 
     "data": { 
     "generate": generate, 
     "matcher": { 
      "json_class": "Regexp", 
      "o": 0, 
      "s": matcher 
     } 
     } 
    }; 
    } 

    function somethingLike(value) { 
    return { 
     "json_class": "Pact::SomethingLike", 
     "contents": value 
    }; 
    } 

Вы можете использовать его в DSL определение следующим образом:

mockService 
     .given('a form') 
     .uponReceiving('a GET request with a valid auth') 
     .withRequest('get', '/', term('^Bearer (?!null$).+$', 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ')) 
     .willRespondWith({ 
     status: 200, 
     headers: {'Content-Type': 'application/json;charset=utf-8'}, 
     body: {worked:true} 
     }); 

«термин» утилита имеет регулярное выражение в качестве первого параметра, а затем пример (который должен соответствовать первому) о том, что для использования во время испытания.

Я знаю, что это должно быть расширено лучше внутри самого Пакта, чтобы упростить его использование. Надеюсь, это поможет.

+0

Спасибо за обстоятельный ответ! Ваш пример, безусловно, работает, хотя он больше похож на обходной путь для меня. Я надеюсь на встроенный подход, который позволяет мне проверять пакты с реальными токенами аутентификации. – mycargus

+1

ну, вы можете их использовать, но проблема в том, что теперь вам нужно знать, что это будет перед созданием взаимодействий, а затем проверить их. Я не знаю, как создать этот поток легко, не обманывая каким-то образом, что по сути то же самое, что и делать это. В заключение спросите себя, действительно ли эта конкретная проверка взаимодействия важна для общего тестирования вашего провайдера. На мой взгляд, это не так, поэтому мое регулярное выражение; для меня важным является бизнес-API, который возвращает данные в правильном формате/типе. –

+0

Ваш подход отлично подходит для создания пактов с макетным сервером, но он не удовлетворяет ожиданиям поставщика услуг API действительного токена аутентификации. В частности, мне нужно динамически вставить действительные токены аутентификации в пакты при запуске pact: проверьте. Имеет ли это смысл? – mycargus

1

Реализация Пакта Ruby не поддерживает это непосредственно в соответствии с реализацией JVM.

Если вы используете прокси-сервер поставщика Pact, вы можете ознакомиться с некоторыми из вариантов, обсуждавшихся в https://github.com/realestate-com-au/pact/issues/49#issuecomment-65346357 и https://groups.google.com/forum/#!topic/pact-support/tSyKZMxsECk.

Примером может выглядеть примерно так:

class ProxyApp 

    def initialize real_app 
    @real_app = real_app 
    end 

    def call env 
    @real_app.call(env.merge('HTTP_AUTHORIZATION' => '12345')) 
    end 
end 

Pact.service_provider "Some Provider" do 
    app do 
    ProxyApp.new(RealApp) 
    end 

    honours_pact_with "Some Consumer" do 
    #... 
    end 
end 
+0

Я рассмотрю использование прокси-сервера поставщика. Спасибо! – mycargus

+0

Теперь я вижу, что вы рекомендуете два различных возможных решения: (1) использовать Прокси-провайдер Pact для проверки пактов против отдельного работающего провайдера или (2) использовать класс внутри pact_helper.rb поставщика, чтобы объединить динамический заголовок auth к проверке пакта. Сейчас я пытаюсь сделать второй подход. – mycargus

+0

Спасибо @mycargus, я бы хотел услышать, как вы идете. Это может быть хорошим примером, чтобы попасть в наши документы, так как это время от времени появляется. –