91 lines
3 KiB
Ruby
91 lines
3 KiB
Ruby
|
describe AgentConnect::AgentController, type: :controller do
|
||
|
describe '#callback' do
|
||
|
let(:email) { 'i@email.com' }
|
||
|
subject { get :callback, params: { code: code } }
|
||
|
|
||
|
context 'when the callback code is correct' do
|
||
|
let(:code) { 'correct' }
|
||
|
let(:user_info) { { 'sub' => 'sub', 'email' => ' I@email.com' } }
|
||
|
|
||
|
context 'and user_info returns some info' do
|
||
|
before do
|
||
|
expect(AgentConnectService).to receive(:user_info).and_return(user_info)
|
||
|
end
|
||
|
|
||
|
context 'and the instructeur does not have an account yet' do
|
||
|
before do
|
||
|
expect(controller).to receive(:sign_in)
|
||
|
end
|
||
|
|
||
|
it 'creates the user, signs in and redirects to procedure_path' do
|
||
|
expect { subject }.to change { User.count }.by(1).and change { Instructeur.count }.by(1)
|
||
|
|
||
|
last_user = User.last
|
||
|
|
||
|
expect(last_user.email).to eq(email)
|
||
|
expect(last_user.confirmed_at).to be_present
|
||
|
expect(last_user.instructeur.agent_connect_id).to eq('sub')
|
||
|
expect(response).to redirect_to(instructeur_procedures_path)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'and the instructeur already has an account' do
|
||
|
let!(:instructeur) { create(:instructeur, email: email) }
|
||
|
|
||
|
before do
|
||
|
expect(controller).to receive(:sign_in)
|
||
|
end
|
||
|
|
||
|
it 'reuses the account, signs in and redirects to procedure_path' do
|
||
|
expect { subject }.to change { User.count }.by(0).and change { Instructeur.count }.by(0)
|
||
|
|
||
|
instructeur.reload
|
||
|
|
||
|
expect(instructeur.agent_connect_id).to eq('sub')
|
||
|
expect(response).to redirect_to(instructeur_procedures_path)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'and the instructeur already has an account as a user' do
|
||
|
let!(:user) { create(:user, email: email) }
|
||
|
|
||
|
before do
|
||
|
expect(controller).to receive(:sign_in)
|
||
|
end
|
||
|
|
||
|
it 'reuses the account, signs in and redirects to procedure_path' do
|
||
|
expect { subject }.to change { User.count }.by(0).and change { Instructeur.count }.by(1)
|
||
|
|
||
|
instructeur = user.reload.instructeur
|
||
|
|
||
|
expect(instructeur.agent_connect_id).to eq('sub')
|
||
|
expect(response).to redirect_to(instructeur_procedures_path)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'but user_info raises and error' do
|
||
|
before do
|
||
|
expect(AgentConnectService).to receive(:user_info).and_raise(Rack::OAuth2::Client::Error.new(500, error: 'Unknown'))
|
||
|
end
|
||
|
|
||
|
it 'aborts the processus' do
|
||
|
expect { subject }.to change { User.count }.by(0).and change { Instructeur.count }.by(0)
|
||
|
|
||
|
expect(response).to redirect_to(new_user_session_path)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'when the callback code is blank' do
|
||
|
let(:code) { '' }
|
||
|
|
||
|
it 'aborts the processus' do
|
||
|
expect { subject }.to change { User.count }.by(0).and change { Instructeur.count }.by(0)
|
||
|
|
||
|
expect(response).to redirect_to(new_user_session_path)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|