HTTP Basic Authentication のテスト例となるパッチを送りました

先日 Ramaze さんのMLで HTTP Basic Authentication のテストってどう書くの?という質問が出ていたのですが、誰も答えを出さないからちょっくらやってみるか!と思いました。しかしこれがまたなんとも書きづらいわけでして、仕方ないから lib/ramaze/spec/helper/browser.rb の Browser#initialize を変更するパッチを作成しました。

PATCH: spec file for examples/simple_auth.rb

これを適用すると Browser#initialize を変更しちゃいますが、次のようなテスト(spec/examples/simple_auth.rb)が書けるようになります。

require 'spec/helper'
require 'examples/simple_auth'

describe "SimpleAuth" do
  behaves_like 'browser'
  ramaze(:adapter => :webrick)

  it 'should show start page' do
    Browser.new do
      http.basic_authentication "username", "password"
      get('/').should == "Secret Info"
    end

    Browser.new do
      http.basic_authentication "admin", "secret"
      get('/').should == "Secret Info"
    end
  end

  it 'should not show start page' do
    Browser.new do
      lambda{ get('/') }.should.raise
    end

    Browser.new do
      lambda do
        http.basic_authentication "hello", "world"
        lambda{ get('/') }.should.raise
      end
    end
  end
end

つまり、Browser.new のブロック内の最初で http.basic_authentication username, password みたいに宣言してやれば良いわけです。これで続くリクエストは認証されますので、あとは御自由にテストしまくっちゃって下さい。実用的なアプリケーションのテストを考える場合には、まさか本番用のパスワードをテスト内にベタ書きするわけにもいかないでしょうから、もう少し工夫が必要だと思います。でも基本的にはこんな感じでやると良いと思います。

とは言え、これだけのために Browser#initialize を変更するのは影響が大き過ぎかもな、とも思います。しかしRamazeでテストをきっちり書いている人なんてまだ居ないと思うので、ひょっとしたパッチ通るかな?通るといいネ!

追記

無事パッチが取り込まれました、ありがとうございます。というかコミッタになったので、今後はこういう後方互換性を無視した危ないパッチを自分で適用しちゃうよ!なるべく変にいじらないように努力はするけど注意してね。