Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
103
research/chatwoot/spec/models/concerns/reauthorizable_shared.rb
Normal file
103
research/chatwoot/spec/models/concerns/reauthorizable_shared.rb
Normal file
@@ -0,0 +1,103 @@
|
||||
require 'rails_helper'
|
||||
|
||||
shared_examples_for 'reauthorizable' do
|
||||
let(:model) { described_class } # the class that includes the concern
|
||||
let(:obj) { FactoryBot.create(model.to_s.underscore.tr('/', '_').to_sym) }
|
||||
|
||||
it 'authorization_error!' do
|
||||
expect(obj.authorization_error_count).to eq 0
|
||||
|
||||
obj.authorization_error!
|
||||
|
||||
expect(obj.authorization_error_count).to eq 1
|
||||
end
|
||||
|
||||
it 'prompts reauthorization when error threshold is passed' do
|
||||
expect(obj.reauthorization_required?).to be false
|
||||
|
||||
obj.class::AUTHORIZATION_ERROR_THRESHOLD.times do
|
||||
obj.authorization_error!
|
||||
end
|
||||
|
||||
expect(obj.reauthorization_required?).to be true
|
||||
end
|
||||
|
||||
# Helper methods to set up mailer mocks
|
||||
def setup_automation_rule_mailer(_obj)
|
||||
account_mailer = instance_double(AdministratorNotifications::AccountNotificationMailer)
|
||||
automation_mailer_response = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
|
||||
allow(AdministratorNotifications::AccountNotificationMailer).to receive(:with).and_return(account_mailer)
|
||||
allow(account_mailer).to receive(:automation_rule_disabled).and_return(automation_mailer_response)
|
||||
end
|
||||
|
||||
def setup_integrations_hook_mailer(obj)
|
||||
integrations_mailer = instance_double(AdministratorNotifications::IntegrationsNotificationMailer)
|
||||
slack_mailer_response = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
|
||||
dialogflow_mailer_response = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
|
||||
allow(AdministratorNotifications::IntegrationsNotificationMailer).to receive(:with).and_return(integrations_mailer)
|
||||
allow(integrations_mailer).to receive(:slack_disconnect).and_return(slack_mailer_response)
|
||||
allow(integrations_mailer).to receive(:dialogflow_disconnect).and_return(dialogflow_mailer_response)
|
||||
|
||||
# Allow the model to respond to slack? and dialogflow? methods
|
||||
allow(obj).to receive(:slack?).and_return(true)
|
||||
allow(obj).to receive(:dialogflow?).and_return(false)
|
||||
end
|
||||
|
||||
def setup_channel_mailer(_obj)
|
||||
channel_mailer = instance_double(AdministratorNotifications::ChannelNotificationsMailer)
|
||||
facebook_mailer_response = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
|
||||
whatsapp_mailer_response = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
|
||||
email_mailer_response = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
|
||||
instagram_mailer_response = instance_double(ActionMailer::MessageDelivery, deliver_later: true)
|
||||
allow(AdministratorNotifications::ChannelNotificationsMailer).to receive(:with).and_return(channel_mailer)
|
||||
allow(channel_mailer).to receive(:facebook_disconnect).and_return(facebook_mailer_response)
|
||||
allow(channel_mailer).to receive(:whatsapp_disconnect).and_return(whatsapp_mailer_response)
|
||||
allow(channel_mailer).to receive(:email_disconnect).and_return(email_mailer_response)
|
||||
allow(channel_mailer).to receive(:instagram_disconnect).and_return(instagram_mailer_response)
|
||||
end
|
||||
|
||||
describe 'prompt_reauthorization!' do
|
||||
before do
|
||||
# Setup mailer mocks based on model type
|
||||
if model.to_s == 'AutomationRule'
|
||||
setup_automation_rule_mailer(obj)
|
||||
elsif model.to_s == 'Integrations::Hook'
|
||||
setup_integrations_hook_mailer(obj)
|
||||
else
|
||||
setup_channel_mailer(obj)
|
||||
end
|
||||
end
|
||||
|
||||
it 'sets reauthorization required flag' do
|
||||
expect(obj.reauthorization_required?).to be false
|
||||
obj.prompt_reauthorization!
|
||||
expect(obj.reauthorization_required?).to be true
|
||||
end
|
||||
|
||||
it 'calls the correct mailer based on model type' do
|
||||
obj.prompt_reauthorization!
|
||||
|
||||
if model.to_s == 'AutomationRule'
|
||||
expect(AdministratorNotifications::AccountNotificationMailer).to have_received(:with).with(account: obj.account)
|
||||
elsif model.to_s == 'Integrations::Hook'
|
||||
expect(AdministratorNotifications::IntegrationsNotificationMailer).to have_received(:with).with(account: obj.account)
|
||||
else
|
||||
expect(AdministratorNotifications::ChannelNotificationsMailer).to have_received(:with).with(account: obj.account)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it 'reauthorized!' do
|
||||
# setting up the object with the errors to validate its cleared on action
|
||||
obj.authorization_error!
|
||||
obj.prompt_reauthorization!
|
||||
expect(obj.reauthorization_required?).to be true
|
||||
expect(obj.authorization_error_count).not_to eq 0
|
||||
|
||||
obj.reauthorized!
|
||||
|
||||
# authorization errors are reset
|
||||
expect(obj.authorization_error_count).to eq 0
|
||||
expect(obj.reauthorization_required?).to be false
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user