🔒
Request Spec で Basic 認証に対応する
概要
前に API モード の Rails プロジェクトに administrate を導入したことがあった.
administrate はコントローラー内の処理をカスタマイズすることが可能で,例えば create アクションを実行時にメールを送信するなども可能となる.
そうなるとコントローラーのテストコードも書きたくなるが,administrate などの管理画面系の gem を利用する場合,大抵 Basic 認証を設定していたりする.
今回は Request Spec で Basic 認証に対応する方法をメモしておく.
前提
Ruby 3.1.2
Ruby on Rails 7.0.3 (API モード)
RSpec 3.11
設定方法
Basic 認証用のヘルパーメソッドを追加する
まずは下記のような Basic 認証を通すためのヘルパーメソッドを作成する.
# spec/support/admin/basic_auth_request_helper.rb
module Admin::BasicAuthRequestHelper
def headers
# 実際は下記のようにハードコーディングするのではなく環境変数などで設定する
user = 'ここにuser名を入れる'
password = 'ここにパスワードを入れる'
{ HTTP_AUTHORIZATION: ActionController::HttpAuthentication::Basic.encode_credentials(user, password) }
end
end
Request Spec でヘルパーメソッドを使う
先程作成したヘルパーメソッドを実際に Request Spec で使う.
使う箇所は post
の 第2引数にセットする.
※spec_helper.rb
にヘルパーメソッドを読み込ませる方法もあるが, Rails API 側は Basic 認証を利用していないため使いやすさを考慮し, 読み込ませていない
# spec/requests/admin/hoges_spec.rb
require 'rails_helper'
RSpec.xdescribe Admin::HogesController, type: :request do
# 作成した BasicAuthRequestHelper を読み込ませる
include Admin::BasicAuthRequestHelper
describe 'create' do
context 'hogeを作成する' do
it 'メールを送信すること' do
# headers メソッドを第2引数にセット
post('/admin/hoges', params: {
hoge: {
name: 'test-hoge',
}
}, headers:)
expect(ActionMailer::Base.deliveries.size).to eq 1
end
end
end
end
これで Request Spec を実行すると下記のように Basic 認証をした上でテストを実行することができる.
$ bundle exec rspec ./spec/requests/admin/hoges_spec.rb
Admin::HogesController
create
hogeを作成する
メールを送信すること
Finished in 1.45 seconds (files took 3.62 seconds to load)
1 example, 0 failures
まとめと所感
今回は Request Spec で Basic 認証に対応する方法についてまとめた.
私事だが超久しぶりにブログを書いたのでこの記事を皮切りに定期的に記事を書いていきたいと思う.
Discussion