Files
leadchat/spec/models/account_spec.rb
Gabriel Jablonski e635122ff6 fix: add presence validation for account name (#12636)
## Description

When a user tries creating a new account through the Super Admin
dashboard, and they forget to fill in the account name, they're faced
with an ugly error (generic "Something went wrong" on production).

This PR simply adds the `validates :name, presence: true` model
validation on `Account` model, which is translated as a proper error
message on the Super Admin UI.
2025-11-25 20:11:15 +05:30

222 lines
7.9 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Account do
it { is_expected.to have_many(:users).through(:account_users) }
it { is_expected.to have_many(:account_users) }
it { is_expected.to have_many(:inboxes).dependent(:destroy_async) }
it { is_expected.to have_many(:conversations).dependent(:destroy_async) }
it { is_expected.to have_many(:contacts).dependent(:destroy_async) }
it { is_expected.to have_many(:canned_responses).dependent(:destroy_async) }
it { is_expected.to have_many(:facebook_pages).class_name('::Channel::FacebookPage').dependent(:destroy_async) }
it { is_expected.to have_many(:web_widgets).class_name('::Channel::WebWidget').dependent(:destroy_async) }
it { is_expected.to have_many(:webhooks).dependent(:destroy_async) }
it { is_expected.to have_many(:notification_settings).dependent(:destroy_async) }
it { is_expected.to have_many(:reporting_events) }
it { is_expected.to have_many(:portals).dependent(:destroy_async) }
it { is_expected.to have_many(:categories).dependent(:destroy_async) }
it { is_expected.to have_many(:teams).dependent(:destroy_async) }
# This validation happens in ApplicationRecord
describe 'length validations' do
let(:account) { create(:account) }
it 'validates name presence' do
account.name = ''
account.valid?
expect(account.errors[:name]).to include("can't be blank")
end
it 'validates name length' do
account.name = 'a' * 256
account.valid?
expect(account.errors[:name]).to include('is too long (maximum is 255 characters)')
end
it 'validates domain length' do
account.domain = 'a' * 150
account.valid?
expect(account.errors[:domain]).to include('is too long (maximum is 100 characters)')
end
end
describe 'usage_limits' do
let(:account) { create(:account) }
it 'returns ChatwootApp.max limits' do
expect(account.usage_limits[:agents]).to eq(ChatwootApp.max_limit)
expect(account.usage_limits[:inboxes]).to eq(ChatwootApp.max_limit)
end
end
describe 'inbound_email_domain' do
let(:account) { create(:account) }
it 'returns the domain from inbox if inbox value is present' do
account.update(domain: 'test.com')
with_modified_env MAILER_INBOUND_EMAIL_DOMAIN: 'test2.com' do
expect(account.inbound_email_domain).to eq('test.com')
end
end
it 'returns the domain from ENV if inbox value is nil' do
account.update(domain: nil)
with_modified_env MAILER_INBOUND_EMAIL_DOMAIN: 'test.com' do
expect(account.inbound_email_domain).to eq('test.com')
end
end
it 'returns the domain from ENV if inbox value is empty string' do
account.update(domain: '')
with_modified_env MAILER_INBOUND_EMAIL_DOMAIN: 'test.com' do
expect(account.inbound_email_domain).to eq('test.com')
end
end
end
describe 'support_email' do
let(:account) { create(:account) }
it 'returns the support email from inbox if inbox value is present' do
account.update(support_email: 'support@chatwoot.com')
with_modified_env MAILER_SENDER_EMAIL: 'hello@chatwoot.com' do
expect(account.support_email).to eq('support@chatwoot.com')
end
end
it 'returns the support email from ENV if inbox value is nil' do
account.update(support_email: nil)
with_modified_env MAILER_SENDER_EMAIL: 'hello@chatwoot.com' do
expect(account.support_email).to eq('hello@chatwoot.com')
end
end
it 'returns the support email from ENV if inbox value is empty string' do
account.update(support_email: '')
with_modified_env MAILER_SENDER_EMAIL: 'hello@chatwoot.com' do
expect(account.support_email).to eq('hello@chatwoot.com')
end
end
end
context 'when after_destroy is called' do
it 'conv_dpid_seq and camp_dpid_seq_ are deleted' do
account = create(:account)
query = "select * from information_schema.sequences where sequence_name in ('camp_dpid_seq_#{account.id}', 'conv_dpid_seq_#{account.id}');"
expect(ActiveRecord::Base.connection.execute(query).count).to eq(2)
expect(account.locale).to eq('en')
account.destroy
expect(ActiveRecord::Base.connection.execute(query).count).to eq(0)
end
end
describe 'locale' do
it 'returns correct language if the value is set' do
account = create(:account, locale: 'fr')
expect(account.locale).to eq('fr')
expect(account.locale_english_name).to eq('french')
end
it 'returns english if the value is not set' do
account = create(:account, locale: nil)
expect(account.locale).to be_nil
expect(account.locale_english_name).to eq('english')
end
it 'returns english if the value is empty string' do
account = create(:account, locale: '')
expect(account.locale).to be_nil
expect(account.locale_english_name).to eq('english')
end
it 'returns correct language if the value has country code' do
account = create(:account, locale: 'pt_BR')
expect(account.locale).to eq('pt_BR')
expect(account.locale_english_name).to eq('portuguese')
end
end
describe 'settings' do
let(:account) { create(:account) }
context 'when auto_resolve_after' do
it 'validates minimum value' do
account.settings = { auto_resolve_after: 4 }
expect(account).to be_invalid
expect(account.errors.messages).to eq({ auto_resolve_after: ['must be greater than or equal to 10'] })
end
it 'validates maximum value' do
account.settings = { auto_resolve_after: 1_439_857 }
expect(account).to be_invalid
expect(account.errors.messages).to eq({ auto_resolve_after: ['must be less than or equal to 1439856'] })
end
it 'allows valid values' do
account.settings = { auto_resolve_after: 15 }
expect(account).to be_valid
account.settings = { auto_resolve_after: 1_439_856 }
expect(account).to be_valid
end
it 'allows null values' do
account.settings = { auto_resolve_after: nil }
expect(account).to be_valid
end
end
context 'when auto_resolve_message' do
it 'allows string values' do
account.settings = { auto_resolve_message: 'This conversation has been resolved automatically.' }
expect(account).to be_valid
end
it 'allows empty string' do
account.settings = { auto_resolve_message: '' }
expect(account).to be_valid
end
it 'allows nil values' do
account.settings = { auto_resolve_message: nil }
expect(account).to be_valid
end
end
context 'when using store_accessor' do
it 'correctly gets and sets auto_resolve_after' do
account.auto_resolve_after = 30
expect(account.auto_resolve_after).to eq(30)
expect(account.settings['auto_resolve_after']).to eq(30)
end
it 'correctly gets and sets auto_resolve_message' do
message = 'This conversation was automatically resolved'
account.auto_resolve_message = message
expect(account.auto_resolve_message).to eq(message)
expect(account.settings['auto_resolve_message']).to eq(message)
end
it 'handles nil values correctly' do
account.auto_resolve_after = nil
account.auto_resolve_message = nil
expect(account.auto_resolve_after).to be_nil
expect(account.auto_resolve_message).to be_nil
end
end
context 'when using with_auto_resolve scope' do
it 'finds accounts with auto_resolve_after set' do
account.update(auto_resolve_after: 40 * 24 * 60)
expect(described_class.with_auto_resolve.pluck(:id)).to include(account.id)
end
it 'does not find accounts without auto_resolve_after' do
account.update(auto_resolve_after: nil)
expect(described_class.with_auto_resolve.pluck(:id)).not_to include(account.id)
end
end
end
end