diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb index 376efc52..5e6823a2 100644 --- a/app/controllers/services_controller.rb +++ b/app/controllers/services_controller.rb @@ -9,11 +9,16 @@ class ServicesController < ApplicationController def create service = Service.initialize_from_omniauth( omniauth_hash ) + service.user = current_user - if current_user.services << service + if service.save flash[:success] = t('flash.service.create.success') else - flash[:error] = t('flash.service.create.error') + if service.errors.details.has_key?(:uid) && service.errors.details[:uid].any? { |err| err[:error] == :taken } + flash[:error] = "The #{service.type.split('::').last.titleize} account you are trying to connect is already connected to another #{APP_CONFIG['site_name']} account. If you are unable to disconnect the account yourself, please send us a Direct Message on Twitter: @retrospring." + else + flash[:error] = t('flash.service.create.error') + end end if origin diff --git a/spec/controllers/services_controller_spec.rb b/spec/controllers/services_controller_spec.rb new file mode 100644 index 00000000..112e97e1 --- /dev/null +++ b/spec/controllers/services_controller_spec.rb @@ -0,0 +1,41 @@ +require 'rails_helper' + +describe ServicesController, type: :controller do + context 'successful Twitter sign in' do + let(:user) { FactoryBot.create(:user) } + + before do + sign_in user + OmniAuth.config.test_mode = true + OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new({ + 'provider' => 'twitter', + 'uid' => '12', + 'info' => { 'nickname' => 'jack' }, + 'credentials' => { 'token' => 'AAAA', 'secret' => 'BBBB' } + }) + request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] + end + + after do + OmniAuth.config.mock_auth[:twitter] = nil + end + + subject { get :create, params: { provider: 'twitter' } } + + context 'no services connected' do + it 'creates a service integration' do + expect { subject }.to change { Service.count }.by(1) + end + end + + context 'a user has a service connected' do + let(:other_user) { FactoryBot.create(:user) } + let!(:service) { Services::Twitter.create(user: other_user, uid: 12) } + + it 'shows an error when trying to attach a service account which is already connected' do + subject + expect(flash[:error]).to eq("The Twitter account you are trying to connect is already connected to another #{APP_CONFIG['site_name']} account. If you are unable to disconnect the account yourself, please send us a Direct Message on Twitter: @retrospring.") + end + end + end +end