feat: Enable Capacity Config UI (#5164)
- Enables Capacity Config in UI - Rewrite auto assignment Logic to consider only online agents fixes: #4990
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe AutoAssignment::AgentAssignmentService do
|
||||
let!(:account) { create(:account) }
|
||||
let!(:inbox) { create(:inbox, account: account, enable_auto_assignment: false) }
|
||||
let!(:inbox_members) { create_list(:inbox_member, 5, inbox: inbox) }
|
||||
let!(:conversation) { create(:conversation, inbox: inbox, account: account) }
|
||||
let!(:online_users) do
|
||||
{
|
||||
inbox_members[0].user_id.to_s => 'busy',
|
||||
inbox_members[1].user_id.to_s => 'busy',
|
||||
inbox_members[2].user_id.to_s => 'busy',
|
||||
inbox_members[3].user_id.to_s => 'online',
|
||||
inbox_members[4].user_id.to_s => 'online'
|
||||
}
|
||||
end
|
||||
|
||||
before do
|
||||
allow(::OnlineStatusTracker).to receive(:get_available_users).and_return(online_users)
|
||||
end
|
||||
|
||||
describe '#perform' do
|
||||
it 'will assign an online agent to the conversation' do
|
||||
expect(conversation.reload.assignee).to be_nil
|
||||
described_class.new(conversation: conversation, allowed_agent_ids: inbox_members.map(&:user_id).map(&:to_s)).perform
|
||||
expect(conversation.reload.assignee).not_to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe '#find_assignee' do
|
||||
it 'will return an online agent from the allowed agent ids in roud robin' do
|
||||
expect(described_class.new(conversation: conversation,
|
||||
allowed_agent_ids: inbox_members.map(&:user_id).map(&:to_s)).find_assignee).to eq(inbox_members[3].user)
|
||||
expect(described_class.new(conversation: conversation,
|
||||
allowed_agent_ids: inbox_members.map(&:user_id).map(&:to_s)).find_assignee).to eq(inbox_members[4].user)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,59 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe AutoAssignment::InboxRoundRobinService do
|
||||
subject(:inbox_round_robin_service) { described_class.new(inbox: inbox) }
|
||||
|
||||
let!(:account) { create(:account) }
|
||||
let!(:inbox) { create(:inbox, account: account) }
|
||||
let!(:inbox_members) { create_list(:inbox_member, 5, inbox: inbox) }
|
||||
|
||||
describe '#available_agent' do
|
||||
it 'returns nil if allowed_agent_ids is not passed or empty' do
|
||||
expect(described_class.new(inbox: inbox).available_agent).to be_nil
|
||||
end
|
||||
|
||||
it 'gets the first available agent in allowed_agent_ids and move agent to end of the list' do
|
||||
expected_queue = [inbox_members[0].user_id, inbox_members[4].user_id, inbox_members[3].user_id, inbox_members[2].user_id,
|
||||
inbox_members[1].user_id].map(&:to_s)
|
||||
described_class.new(inbox: inbox).available_agent(allowed_agent_ids: [inbox_members[0].user_id, inbox_members[4].user_id].map(&:to_s))
|
||||
expect(inbox_round_robin_service.send(:queue)).to eq(expected_queue)
|
||||
end
|
||||
|
||||
it 'constructs round_robin_queue if queue is not present' do
|
||||
inbox_round_robin_service.clear_queue
|
||||
expect(inbox_round_robin_service.send(:queue)).to eq([])
|
||||
inbox_round_robin_service.available_agent
|
||||
# the service constructed the redis queue before performing
|
||||
expect(inbox_round_robin_service.send(:queue).sort.map(&:to_i)).to eq(inbox_members.map(&:user_id).sort)
|
||||
end
|
||||
|
||||
it 'validates the queue and correct it before performing round robin' do
|
||||
# adding some invalid ids to queue
|
||||
inbox_round_robin_service.add_agent_to_queue([2, 3, 5, 9])
|
||||
expect(inbox_round_robin_service.send(:queue).sort.map(&:to_i)).not_to eq(inbox_members.map(&:user_id).sort)
|
||||
inbox_round_robin_service.available_agent
|
||||
# the service have refreshed the redis queue before performing
|
||||
expect(inbox_round_robin_service.send(:queue).sort.map(&:to_i)).to eq(inbox_members.map(&:user_id).sort)
|
||||
end
|
||||
|
||||
context 'when allowed_agent_ids is passed' do
|
||||
it 'will get the first allowed member and move it to the end of the queue' do
|
||||
expected_queue = [inbox_members[3].user_id, inbox_members[2].user_id, inbox_members[4].user_id, inbox_members[1].user_id,
|
||||
inbox_members[0].user_id].map(&:to_s)
|
||||
expect(described_class.new(inbox: inbox).available_agent(
|
||||
allowed_agent_ids: [
|
||||
inbox_members[3].user_id,
|
||||
inbox_members[2].user_id
|
||||
].map(&:to_s)
|
||||
)).to eq inbox_members[2].user
|
||||
expect(described_class.new(inbox: inbox).available_agent(
|
||||
allowed_agent_ids: [
|
||||
inbox_members[3].user_id,
|
||||
inbox_members[2].user_id
|
||||
].map(&:to_s)
|
||||
)).to eq inbox_members[3].user
|
||||
expect(inbox_round_robin_service.send(:queue)).to eq(expected_queue)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,75 +0,0 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe RoundRobin::ManageService do
|
||||
subject(:round_robin_manage_service) { described_class.new(inbox: inbox) }
|
||||
|
||||
let!(:account) { create(:account) }
|
||||
let!(:inbox) { create(:inbox, account: account) }
|
||||
let!(:inbox_members) { create_list(:inbox_member, 5, inbox: inbox) }
|
||||
|
||||
describe '#available_agent' do
|
||||
it 'returns nil if allowed_member_ids is empty' do
|
||||
expect(described_class.new(inbox: inbox, allowed_member_ids: []).available_agent).to be_nil
|
||||
end
|
||||
|
||||
it 'gets the first available agent in allowed_member_ids and move agent to end of the list' do
|
||||
expected_queue = [inbox_members[0].user_id, inbox_members[4].user_id, inbox_members[3].user_id, inbox_members[2].user_id,
|
||||
inbox_members[1].user_id].map(&:to_s)
|
||||
described_class.new(inbox: inbox, allowed_member_ids: [inbox_members[0].user_id, inbox_members[4].user_id]).available_agent
|
||||
expect(round_robin_manage_service.send(:queue)).to eq(expected_queue)
|
||||
end
|
||||
|
||||
it 'gets intersection of priority list and agent queue. get and move agent to the end of the list' do
|
||||
expected_queue = [inbox_members[2].user_id, inbox_members[4].user_id, inbox_members[3].user_id, inbox_members[1].user_id,
|
||||
inbox_members[0].user_id].map(&:to_s)
|
||||
# prority list will be ids in string, since thats what redis supplies to us
|
||||
expect(described_class.new(inbox: inbox, allowed_member_ids: [inbox_members[2].user_id])
|
||||
.available_agent(priority_list: [inbox_members[3].user_id.to_s, inbox_members[2].user_id.to_s])).to eq inbox_members[2].user
|
||||
expect(round_robin_manage_service.send(:queue)).to eq(expected_queue)
|
||||
end
|
||||
|
||||
it 'constructs round_robin_queue if queue is not present' do
|
||||
round_robin_manage_service.clear_queue
|
||||
expect(round_robin_manage_service.send(:queue)).to eq([])
|
||||
round_robin_manage_service.available_agent
|
||||
# the service constructed the redis queue before performing
|
||||
expect(round_robin_manage_service.send(:queue).sort.map(&:to_i)).to eq(inbox_members.map(&:user_id).sort)
|
||||
end
|
||||
|
||||
it 'validates the queue and correct it before performing round robin' do
|
||||
# adding some invalid ids to queue
|
||||
round_robin_manage_service.add_agent_to_queue([2, 3, 5, 9])
|
||||
expect(round_robin_manage_service.send(:queue).sort.map(&:to_i)).not_to eq(inbox_members.map(&:user_id).sort)
|
||||
round_robin_manage_service.available_agent
|
||||
# the service have refreshed the redis queue before performing
|
||||
expect(round_robin_manage_service.send(:queue).sort.map(&:to_i)).to eq(inbox_members.map(&:user_id).sort)
|
||||
end
|
||||
|
||||
context 'when allowed_member_ids is passed' do
|
||||
it 'will get the first allowed member and move it to the end of the queue' do
|
||||
expected_queue = [inbox_members[3].user_id, inbox_members[2].user_id, inbox_members[4].user_id, inbox_members[1].user_id,
|
||||
inbox_members[0].user_id].map(&:to_s)
|
||||
expect(described_class.new(inbox: inbox,
|
||||
allowed_member_ids: [inbox_members[3].user_id,
|
||||
inbox_members[2].user_id]).available_agent).to eq inbox_members[2].user
|
||||
expect(described_class.new(inbox: inbox,
|
||||
allowed_member_ids: [inbox_members[3].user_id,
|
||||
inbox_members[2].user_id]).available_agent).to eq inbox_members[3].user
|
||||
expect(round_robin_manage_service.send(:queue)).to eq(expected_queue)
|
||||
end
|
||||
|
||||
it 'will get union of priority list and allowed_member_ids and move it to the end of the queue' do
|
||||
expected_queue = [inbox_members[3].user_id, inbox_members[4].user_id, inbox_members[2].user_id, inbox_members[1].user_id,
|
||||
inbox_members[0].user_id].map(&:to_s)
|
||||
# prority list will be ids in string, since thats what redis supplies to us
|
||||
expect(described_class.new(inbox: inbox,
|
||||
allowed_member_ids: [inbox_members[3].user_id,
|
||||
inbox_members[2].user_id])
|
||||
.available_agent(
|
||||
priority_list: [inbox_members[3].user_id.to_s]
|
||||
)).to eq inbox_members[3].user
|
||||
expect(round_robin_manage_service.send(:queue)).to eq(expected_queue)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user