- 更新日: 2014年1月8日
- RSpec
Omniauth の Facebook での OAuth 認証を RSpec でテスト(RequestSpec/インテグレーションテスト)
昨日のエントリー Rails + Devise + OmniAuth で Facebook/Twitter の OAuth 認証を RSpec + Capybara でインテグレーションテスト(RequestSpec) | EasyRamble の続き。Omniauth を使った Facebook による OAuth 認証をテストするコードです。
— 環境 —
rails-4.0.1
devise-3.2.2
omniauth-1.1.4
rspec-rails-2.14.0
capybara-2.2.0
Facebook での OAuth 認証に関する仕様
OAuth 認証と通常フォームからの認証を併用する仕様にして、Facebook での OAuth 認証に関しては以下の通りとしました。
・FacebookでのOAuth認証の場合に取得したEmailアドレスが、通常フォームからのユーザー登録によりすでにレコードに存在している場合は、FacebookでのOAuth認証を許可しない。
詳しくは以下を参照。
Rails4 で Devise と OmniAuth を使い、通常フォームでのユーザー登録・サインインと OAuth 認証を併用する仕様を考えた | EasyRamble
Rails4 で Devise と OmniAuth で、Twitter/Facebook のOAuth認証と通常フォームでの認証を併用して実装 | EasyRamble
テストの内容
以下のテストコードの箇所で、各々仕様に則したテストを行っています。
context “valid oauth signin when facebook email doesn’t exist in users table” do
OAuth 認証に使う Facebook ユーザーのEメールアドレスが users テーブルに存在しない時は、正常に OAuth 認証させる。
context “trying to sign up when facebook email already exists” do
Facebook の OAuth 認証によりEメールアドレスが存在する時は、通常フォームからのサインアップを許可しない。
context “trying to sign in with facebook oauth when the facebook email already exists” do
通常フォームからのサインアップによりEメールアドレスが存在する時は、Facebook での OAuth 認証を許可しない。
RequestSpec のテストコード
以下書いたテストコード。
spec/requests/omniauth_pages_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
require 'spec_helper' describe "Omniauth pages" do subject { page } describe 'with facebook oauth' do context "valid oauth signin when facebook email doesn't exist in users table" do let(:oauth_user) { set_omniauth(:facebook) } before do login_with_omniauth(oauth_user.provider) end let(:user) { User.where(:provider => oauth_user.provider, :uid => oauth_user.uid).first } specify { expect(user).not_to eq nil } specify { expect(user.provider).to eq oauth_user.provider } specify { expect(user.uid).to eq oauth_user.uid } specify { expect(user.name).to eq oauth_user.extra.raw_info.name } specify { expect(user.email).to eq oauth_user.info.email } it { should have_content(user.name) } it { should have_link('My page', href: user_path(user)) } it { should have_link('Users', href: users_path) } it { should have_link('Settings', href: edit_user_registration_path) } it { should have_link('Sign out', href: destroy_user_session_path) } it { should_not have_link('Sign in', href: new_user_session_path) } end context "trying to sign up when facebook email already exists" do let(:oauth_user) { set_omniauth(:facebook) } before do login_with_omniauth(oauth_user.provider) click_link "Sign out" visit new_user_registration_path fill_in "Email", with: oauth_user.info.email fill_in "Name", with: "HenoHeno" fill_in "Password", with: "foobarbaz" fill_in "Password confirmation", with: "foobarbaz" end it "should not create a user" do expect { click_button "Sign up" }.to change(User, :count).by(0) end it { should have_title("Sign up") } it { should have_link('Sign in', href: new_user_session_path) } end context "trying to sign in with facebook oauth when the facebook email already exists" do let(:user) { FactoryGirl.create(:user, email: "facebook_hoge@example.com") } let(:oauth_user) { set_omniauth(:facebook) } before do oauth_user.info.email = user.email login_with_omniauth(oauth_user.provider) end it { should have_title("Sign up") } it { should have_link('Sign in', href: new_user_session_path) } end end end |
以上 All green でした。Twitter での OAuth 認証のテストも同様に書けます。Twitter の OAuth 認証ではEメールアドレスを取得できないので、Eメールアドレスが存在するかどうかのテストは書く必要がありません。valid, invalid なOAuth認証のテストを書くと良いかと思います。突っ込み歓迎です。
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
Leave Your Message!