## Description Two improvements to Agent Capacity Policy: **1. Support exclusion via zero conversation limit** Allow `conversation_limit` to be `0` on inbox capacity limits. Agents with a zero limit are excluded from auto-assignment for that inbox while remaining members for manual assignment. **2. Fix exclusion rules duration input** - Default changed from `10` to `null` so time-based exclusion isn't applied unless explicitly set. - Minimum lowered from 10 to 1 minute. - `DurationInput` updated to handle `null` values correctly. ## Type of change Please delete options that are not relevant. - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Added model and capacity service specs for zero-limit exclusion behavior. - Tested manually via UI flows ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] 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 --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
46 lines
1.9 KiB
Ruby
46 lines
1.9 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe InboxCapacityLimit, type: :model do
|
|
let(:account) { create(:account) }
|
|
let(:policy) { create(:agent_capacity_policy, account: account) }
|
|
let(:inbox) { create(:inbox, account: account) }
|
|
|
|
describe 'validations' do
|
|
subject { create(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox) }
|
|
|
|
it { is_expected.to validate_presence_of(:conversation_limit) }
|
|
it { is_expected.to validate_numericality_of(:conversation_limit).is_greater_than_or_equal_to(0).only_integer }
|
|
it { is_expected.to validate_uniqueness_of(:inbox_id).scoped_to(:agent_capacity_policy_id) }
|
|
end
|
|
|
|
describe 'zero conversation limit (exclusion policy)' do
|
|
it 'allows conversation_limit of 0' do
|
|
limit = build(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox, conversation_limit: 0)
|
|
expect(limit).to be_valid
|
|
end
|
|
|
|
it 'rejects negative conversation_limit' do
|
|
limit = build(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox, conversation_limit: -1)
|
|
expect(limit).not_to be_valid
|
|
end
|
|
end
|
|
|
|
describe 'uniqueness constraint' do
|
|
it 'prevents duplicate inbox limits for the same policy' do
|
|
create(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox)
|
|
duplicate = build(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox)
|
|
|
|
expect(duplicate).not_to be_valid
|
|
expect(duplicate.errors[:inbox_id]).to include('has already been taken')
|
|
end
|
|
|
|
it 'allows the same inbox in different policies' do
|
|
other_policy = create(:agent_capacity_policy, account: account)
|
|
create(:inbox_capacity_limit, agent_capacity_policy: policy, inbox: inbox)
|
|
|
|
different_policy_limit = build(:inbox_capacity_limit, agent_capacity_policy: other_policy, inbox: inbox)
|
|
expect(different_policy_limit).to be_valid
|
|
end
|
|
end
|
|
end
|