omniauthのtest
policyのtestしようと思ってguard動かすとボロボロボロボロ...。
まずログイン状態になってないのがアウツ。まぁsession入る要素無いし。
omniauth通さず、controller testで直にsession入れてしまえば良い気がするが、方法が見つからん。仕方ないので以下の手順にせざるを得ない
- omniauthでsession入れる
- ApplicationControllerでcurrent_user入れる
- やりたい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か。