mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 11:37:58 +00:00
This PR is part of https://github.com/chatwoot/chatwoot/pull/11054 to make the review cycle easier.
104 lines
4.5 KiB
Ruby
104 lines
4.5 KiB
Ruby
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
|