omniauthのtest

policyのtestしようと思ってguard動かすとボロボロボロボロ...。

まずログイン状態になってないのがアウツ。まぁsession入る要素無いし。

omniauth通さず、controller testで直にsession入れてしまえば良い気がするが、方法が見つからん。仕方ないので以下の手順にせざるを得ない

  1. omniauthでsession入れる
  2. ApplicationControllerでcurrent_user入れる
  3. やりたいtest実行

でもこれってomniauthにrequest送らなければならんが、どうやってrequest送るんだよとか探してた。

Integration Testing見に行って読んでパッと分かればすぐ終わる話。

つまりtest_modeにして /auth/provider にgetリクエスト投げればいいらしい。どこでどう書くんだよって感じでよくわからなかった。

全部のcontrollerで、ログインするかどうかは分からんが、とりあえずその準備をしておきたいのでtest_helper.rbに

if Rails.env.development? or Rails.env.test?
    OmniAuth.config.test_mode = true
    OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new({
        provider: 'twitter',
        uid: '123545',
        credentials: "credentials",
        info: {
            email: "iaia@example.com",
            name: "iaia",
            nickname: "iaia",
            description: "setumei",
            urls: {public_profile: "example@exampl.com", Website: "exampl.com"},
            location: "tokyo"
        },
        extra: {raw_info: "info"}
    })
end

って追加。各controller testでget /auth/provider する。

rails routes

すると /auth/provider 無い...。多分何か設定しなければいけないんだろう。面倒なので

get "/auth/twitter/callback"

してしまう。 常にログインしている状態でtestしたいので

setup do
    get "/auth/twitter/callback"
end

でわざわざrequestにomniauth.authとか送らんで良いらしい。test_helperで追加したmockが自動で request.env に入っている。そのためのtest_modeか。