diff --git a/app/controllers/microsoft/callbacks_controller.rb b/app/controllers/microsoft/callbacks_controller.rb index 5b765f001..c3ecb8c09 100644 --- a/app/controllers/microsoft/callbacks_controller.rb +++ b/app/controllers/microsoft/callbacks_controller.rb @@ -45,13 +45,18 @@ class Microsoft::CallbacksController < ApplicationController channel_email.inbox end + # Fallback name, for when name field is missing from users_data + def fallback_name + users_data['email'].split('@').first.parameterize.titleize + end + def create_microsoft_channel_with_inbox ActiveRecord::Base.transaction do channel_email = Channel::Email.create!(email: users_data['email'], account: account) account.inboxes.create!( account: account, channel: channel_email, - name: users_data['name'] + name: users_data['name'] || fallback_name ) channel_email end diff --git a/spec/controllers/microsoft/callbacks_controller_spec.rb b/spec/controllers/microsoft/callbacks_controller_spec.rb index 7a647da6c..9579cade0 100644 --- a/spec/controllers/microsoft/callbacks_controller_spec.rb +++ b/spec/controllers/microsoft/callbacks_controller_spec.rb @@ -15,6 +15,11 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do refresh_token: SecureRandom.hex(10) } end + let(:response_body_success_without_name) do + { id_token: JWT.encode({ email: email }, false), access_token: SecureRandom.hex(10), token_type: 'Bearer', + refresh_token: SecureRandom.hex(10) } + end + it 'creates inboxes if authentication is successful' do stub_request(:post, 'https://login.microsoftonline.com/common/oauth2/v2.0/token') .with(body: { 'code' => code, 'grant_type' => 'authorization_code', @@ -52,6 +57,20 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do expect(Redis::Alfred.get(email)).to be_nil end + it 'creates inboxes with fallback_name when account name is not present in id_token' do + stub_request(:post, 'https://login.microsoftonline.com/common/oauth2/v2.0/token') + .with(body: { 'code' => code, 'grant_type' => 'authorization_code', + 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/microsoft/callback" }) + .to_return(status: 200, body: response_body_success_without_name.to_json, headers: { 'Content-Type' => 'application/json' }) + + get microsoft_callback_url, params: { code: code } + + expect(response).to redirect_to app_microsoft_inbox_agents_url(account_id: account.id, inbox_id: account.inboxes.last.id) + expect(account.inboxes.count).to be 1 + inbox = account.inboxes.last + expect(inbox.name).to eq email.split('@').first.parameterize.titleize + end + it 'redirects to microsoft app in case of error' do stub_request(:post, 'https://login.microsoftonline.com/common/oauth2/v2.0/token') .with(body: { 'code' => code, 'grant_type' => 'authorization_code',