Skip to content
fevereiro 2, 2011 / cassiomarques

Testando HTTP Basic Auth em request specs

O Rspec2 fornece um novo tipo de spec group chamado requests. Esses testes ficam em spec/requests e são uma boa opção para escrever testes de integração. Comecei a usar por aqui e tem me ajudado bastante em casos onde usar o Cucumber seria overkill.

Em um projeto atual um dos meus controllers usa HTTP Basic Authentication. Esse controller serve apenas como endpoint de uma API que a aplicação fornece e nunca será acessado via browser. Como a API será consumida apenas por um único cliente, dentro de uma rede conhecida, acho que HTTP Basic Auth está de bom tamanho neste caso. O problema foi pra descobrir como testar isso. Para os testes de controller costuma ser fácil, basta fazer algo como:

describe FoosController, "handling PUT /foos/123/save" do
  it "is successful with correct username and password" do
    request.env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials('some_username', "some_password")
    put :save, {:some => parameter}
    response.should be_success
  end
end

O problema é que nas request specs não temos acesso direto ao request. Tentar fazer o que mostrei acima não funciona, pois request é nil. A solução foi usar Rack::Test diretamente na minha spec. Primeiro, fiz a inclusão dos métodos do Rack::Test nas minhas request specs. No spec_helper.rb:

require 'rack/test'

Rspec.configure do |config|
  config.include Rack::Test::Methods, :type => :request
end

E no meu teste, bastou usar o método authorize do Rack::Test para enviar as credenciais para autenticação:

describe "my API endpoint" do
  let(:username) { 'valid_username' }
  let(:password) { 'valid_password' }

  it "should work with valid auth credentials" do
    authorize(username, password)
    put "/my/path/123/save", {:some => parameter}
    response.status.should == 200
  end
end

9 Comentários

Deixe um comentário
  1. Nando Vieira / fev 3 2011 12:34 am

    Já passei por isso!

    Você aboliu outras libs e agora só está usando requests? Eu fiz isso e não sinto falta nenhuma. \o/

    • cassiomarques / fev 3 2011 12:50 am

      Fala Nando,

      Comecei a brincar com requests tem pouco tempo. Ainda uso Cucumber para alguns clientes (com os quais aquela história do cara acompanhar realmente funciona, por incrível que pareça). Para outros casos o Steak é uma boa opção, por causa da integração com Capybara e consequentemente o Selenium Webdriver. Agora, se você me mostrar uma forma de rodar o Selenium pra testes de integração que usam JS (ou qualquer outro “browser”) eu dropo as outras libs na hora :)

      Abraço!

  2. Juan Pujol / out 2 2011 7:40 pm

    Cássio obrigado pela dica, mas quando fiz acaba retornando

    undefined method `autorize’ for #

    Sabe o que pode estar faltando?

    Obrigado.

    • cassiomarques / out 2 2011 7:47 pm

      Não é “autorize”, mas sim “authorize”, com “h”.

      • Juan Pujol / out 2 2011 8:43 pm

        Ue! que burro huahauha. Muito obrigado, vc me salvou!

        Você deveria traduzir este post, não achei a informação em lugar nenhum em inglês.

        Abraços

  3. wandersonvalerio / abr 21 2012 2:16 am

    Como faço para exibir a sintaxe coloridade igual a sua, meu blog está hospedado no domínio wordpress.com, ajuda ai por favor.

    • cassiomarques / abr 21 2012 2:20 am

      Coloque seu código assim

      seu código vai aqui...
      

      Troque o valor de language=”…” pela linguagem que você estiver usando.

      • wandersonvalerio / abr 21 2012 2:20 am

        Não entendi direito, mostre-me um exemplo por gentileza.

Trackbacks

  1. /*Codificando*/ :: Testando HTTP Basic Auth em request specs | Ruby Here Blog

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: