6a6a37a67b
fixes: #3853 - Introduced DISABLE_GRAVATAR Global Config, which will stop chatwoot from making API requests to gravatar - Cleaned up avatar-related logic and centralized it into the avatarable concern - Added specs for the missing cases - Added migration for existing installations to move the avatar to attachment, rather than making the API that results in 404.
197 lines
5.4 KiB
Ruby
197 lines
5.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
require Rails.root.join 'spec/models/concerns/out_of_offisable_shared.rb'
|
|
require Rails.root.join 'spec/models/concerns/avatarable_shared.rb'
|
|
|
|
RSpec.describe Inbox do
|
|
describe 'validations' do
|
|
it { is_expected.to validate_presence_of(:account_id) }
|
|
it { is_expected.to validate_presence_of(:name) }
|
|
end
|
|
|
|
describe 'associations' do
|
|
it { is_expected.to belong_to(:account) }
|
|
|
|
it { is_expected.to belong_to(:channel) }
|
|
|
|
it { is_expected.to have_many(:contact_inboxes).dependent(:destroy_async) }
|
|
|
|
it { is_expected.to have_many(:contacts).through(:contact_inboxes) }
|
|
|
|
it { is_expected.to have_many(:inbox_members).dependent(:destroy_async) }
|
|
|
|
it { is_expected.to have_many(:members).through(:inbox_members).source(:user) }
|
|
|
|
it { is_expected.to have_many(:conversations).dependent(:destroy_async) }
|
|
|
|
it { is_expected.to have_many(:messages).through(:conversations) }
|
|
|
|
it { is_expected.to have_one(:agent_bot_inbox) }
|
|
|
|
it { is_expected.to have_many(:webhooks).dependent(:destroy_async) }
|
|
|
|
it { is_expected.to have_many(:reporting_events) }
|
|
|
|
it { is_expected.to have_many(:hooks) }
|
|
end
|
|
|
|
describe 'concerns' do
|
|
it_behaves_like 'out_of_offisable'
|
|
it_behaves_like 'avatarable'
|
|
end
|
|
|
|
describe '#add_member' do
|
|
let(:inbox) { FactoryBot.create(:inbox) }
|
|
let(:user) { FactoryBot.create(:user) }
|
|
|
|
it do
|
|
expect(inbox.inbox_members.size).to eq(0)
|
|
|
|
inbox.add_member(user.id)
|
|
expect(inbox.reload.inbox_members.size).to eq(1)
|
|
end
|
|
end
|
|
|
|
describe '#remove_member' do
|
|
let(:inbox) { FactoryBot.create(:inbox) }
|
|
let(:user) { FactoryBot.create(:user) }
|
|
|
|
before { inbox.add_member(user.id) }
|
|
|
|
it do
|
|
expect(inbox.inbox_members.size).to eq(1)
|
|
|
|
inbox.remove_member(user.id)
|
|
expect(inbox.reload.inbox_members.size).to eq(0)
|
|
end
|
|
end
|
|
|
|
describe '#facebook?' do
|
|
let(:inbox) do
|
|
FactoryBot.build(:inbox, channel: channel_val)
|
|
end
|
|
|
|
context 'when the channel type is Channel::FacebookPage' do
|
|
let(:channel_val) { Channel::FacebookPage.new }
|
|
|
|
it do
|
|
expect(inbox.facebook?).to be(true)
|
|
expect(inbox.inbox_type).to eq('Facebook')
|
|
end
|
|
end
|
|
|
|
context 'when the channel type is not Channel::FacebookPage' do
|
|
let(:channel_val) { Channel::WebWidget.new }
|
|
|
|
it do
|
|
expect(inbox.facebook?).to be(false)
|
|
expect(inbox.inbox_type).to eq('Website')
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#web_widget?' do
|
|
let(:inbox) do
|
|
FactoryBot.build(:inbox, channel: channel_val)
|
|
end
|
|
|
|
context 'when the channel type is Channel::WebWidget' do
|
|
let(:channel_val) { Channel::WebWidget.new }
|
|
|
|
it do
|
|
expect(inbox.web_widget?).to be(true)
|
|
expect(inbox.inbox_type).to eq('Website')
|
|
end
|
|
end
|
|
|
|
context 'when the channel is not Channel::WebWidget' do
|
|
let(:channel_val) { Channel::Api.new }
|
|
|
|
it do
|
|
expect(inbox.web_widget?).to be(false)
|
|
expect(inbox.inbox_type).to eq('API')
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#api?' do
|
|
let(:inbox) do
|
|
FactoryBot.build(:inbox, channel: channel_val)
|
|
end
|
|
|
|
context 'when the channel type is Channel::Api' do
|
|
let(:channel_val) { Channel::Api.new }
|
|
|
|
it do
|
|
expect(inbox.api?).to be(true)
|
|
expect(inbox.inbox_type).to eq('API')
|
|
end
|
|
end
|
|
|
|
context 'when the channel is not Channel::Api' do
|
|
let(:channel_val) { Channel::FacebookPage.new }
|
|
|
|
it do
|
|
expect(inbox.api?).to be(false)
|
|
expect(inbox.inbox_type).to eq('Facebook')
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#validations' do
|
|
let(:inbox) { FactoryBot.create(:inbox) }
|
|
|
|
context 'when validating inbox name' do
|
|
it 'does not allow any special character at the end' do
|
|
inbox.name = 'this is my inbox name-'
|
|
expect(inbox).not_to be_valid
|
|
expect(inbox.errors.full_messages).to eq(
|
|
['Name should not start or end with symbols, and it should not have < > / \\ @ characters.']
|
|
)
|
|
end
|
|
|
|
it 'does not allow any special character at the start' do
|
|
inbox.name = '-this is my inbox name'
|
|
expect(inbox).not_to be_valid
|
|
expect(inbox.errors.full_messages).to eq(
|
|
['Name should not start or end with symbols, and it should not have < > / \\ @ characters.']
|
|
)
|
|
end
|
|
|
|
it 'does not allow chacters like /\@<> in the entire string' do
|
|
inbox.name = 'inbox@name'
|
|
expect(inbox).not_to be_valid
|
|
expect(inbox.errors.full_messages).to eq(
|
|
['Name should not start or end with symbols, and it should not have < > / \\ @ characters.']
|
|
)
|
|
end
|
|
|
|
it 'does not empty string' do
|
|
inbox.name = ''
|
|
expect(inbox).not_to be_valid
|
|
expect(inbox.errors.full_messages[0]).to eq(
|
|
"Name can't be blank"
|
|
)
|
|
end
|
|
|
|
it 'does allow special characters except /\@<> in between' do
|
|
inbox.name = 'inbox-name'
|
|
expect(inbox).to be_valid
|
|
|
|
inbox.name = 'inbox_name.and_1'
|
|
expect(inbox).to be_valid
|
|
end
|
|
|
|
context 'when special characters allowed for some channel' do
|
|
let!(:tw_channel_val) { FactoryBot.create(:channel_twitter_profile) }
|
|
let(:inbox) { create(:inbox, channel: tw_channel_val) }
|
|
|
|
it 'does allow special chacters like /\@<> for Facebook Channel' do
|
|
inbox.name = 'inbox@name'
|
|
expect(inbox).to be_valid
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|