mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-29 10:12:34 +00:00
# Pull Request Template ## Description * add Company model with validations for name, domain, description and avatar * Add database migration fo * Implement endpoints for company CRUD operations * Add optional company relationship for contacts * Add test for models, controllers, factories and policies * Add authorization policies restricting delete to admins * support JSON API responses Please include a summary of the change and issue(s) fixed. Also, mention relevant motivation, context, and any dependencies that this change requires. Fixes #(cw-5650) ## Type of change Please delete options that are not relevant. - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [ ] This change requires a documentation update ## How Has This Been Tested? Tests are implemented using `RSpec` ``` $ bundle exec rails db:migrate $ bundle exec rspec spec/models/company_spec.rb spec/controllers/api/v1/accounts/companies_controller_spec.rb ``` ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
39 lines
1.5 KiB
Ruby
39 lines
1.5 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe Company, type: :model do
|
|
context 'with validations' do
|
|
it { is_expected.to validate_presence_of(:account_id) }
|
|
it { is_expected.to validate_presence_of(:name) }
|
|
it { is_expected.to validate_length_of(:name).is_at_most(100) }
|
|
it { is_expected.to validate_length_of(:description).is_at_most(1000) }
|
|
|
|
describe 'domain validation' do
|
|
it { is_expected.to allow_value('example.com').for(:domain) }
|
|
it { is_expected.to allow_value('sub.example.com').for(:domain) }
|
|
it { is_expected.to allow_value('').for(:domain) }
|
|
it { is_expected.to allow_value(nil).for(:domain) }
|
|
it { is_expected.not_to allow_value('invalid-domain').for(:domain) }
|
|
it { is_expected.not_to allow_value('.example.com').for(:domain) }
|
|
end
|
|
end
|
|
|
|
context 'with associations' do
|
|
it { is_expected.to belong_to(:account) }
|
|
it { is_expected.to have_many(:contacts).dependent(:nullify) }
|
|
end
|
|
|
|
describe 'scopes' do
|
|
let(:account) { create(:account) }
|
|
let!(:company_b) { create(:company, name: 'B Company', account: account) }
|
|
let!(:company_a) { create(:company, name: 'A Company', account: account) }
|
|
let!(:company_c) { create(:company, name: 'C Company', account: account) }
|
|
|
|
describe '.ordered_by_name' do
|
|
it 'orders companies by name alphabetically' do
|
|
companies = described_class.where(account: account).ordered_by_name
|
|
expect(companies.map(&:name)).to eq([company_a.name, company_b.name, company_c.name])
|
|
end
|
|
end
|
|
end
|
|
end
|