проблема функционального тестирования auth-hmac - PullRequest
3 голосов
/ 29 марта 2011

Я хочу использовать этот драгоценный камень в своем приложении API https://github.com/seangeo/auth-hmac/

У меня есть вопрос о создании тестов для аутентификации запроса.Я хочу подписать запрос с помощью hmac, но у контроллера rails нет заголовков http после следующего кода

 def setup
    #load from fixture
     @client = clients(:client_2)


 end

 def sign_valid_request(request,client)
    auth_hmac = AuthHMAC.new(client.key => client.secret )
    auth_hmac.sign!(request,client.key)
    request
  end

 def test_response_client_xml

      @request =  sign_valid_request(@request,@client)
      get :index  , :api_client_key => @client.key , :format=> "xml"
      @xml_response = @response.body

      assert_response :success
      assert_select   'id' , @client.id.to_s
end

Routes имеет такую ​​конфигурацию

scope '/:token/' do
     # route only json & xml format
    constraints :format=> /(json|xml)/  do
       resources :clients, :only => [:index]
    end

  end

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

У меня была такая же проблема с функциональным тестированием.Чтобы правильно подписать каждый запрос с AuthHMAC, вы должны указать в своем test_helper.rb

def with_hmac_signed_requests(access_key_id, secret, &block)
  unless ActionController::Base < ActionController::Testing
    ActionController::Base.class_eval { include ActionController::Testing }
  end

  @controller.instance_eval %Q(
    alias real_process_with_new_base_test process_with_new_base_test

    def process_with_new_base_test(request, response)
      signature = AuthHMAC.signature(request, "#{secret}")
      request.env['Authorization'] = "AuthHMAC #{access_key_id}:" + signature
      real_process_with_new_base_test(request, response)
    end
  )

  yield

  @controller.instance_eval %Q(
    undef process_with_new_base_test
    alias process_with_new_base_test real_process_with_new_base_test
  )
end

следующее, а затем в функциональных тестах:

test "secret_method should be protected by an HMAC signature" do
    with_hmac_signed_requests(key_id, secret) do
      get :protected_method
      assert_response :success
    end
end
1 голос
/ 01 апреля 2011

Вы можете попробовать это решение

  def sign_valid_request(request,client)
    auth_hmac = AuthHMAC.new(client.key => client.secret )
    auth_hmac.sign!(request,client.key)
    # because this would be deleted in request.recycle! method in test framework
    request.env.merge!(request.env['action_dispatch.request.parameters'])
    request
  end

Строка request.env.merge!(request.env['action_dispatch.request.parameters']) добавлена ​​здесь, поскольку инфраструктура тестового модуля Rails 3 удаляет все значения из action_dispatch.request.

Вы можете найти это поведение здесь: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/test_case.rb#L404

...