🔒

Request Spec で Basic 認証に対応する

2023/01/09に公開

概要

前に API モード の Rails プロジェクトに administrate を導入したことがあった.

https://github.com/thoughtbot/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