diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb index 7f02ceb5c..d92a9ad50 100644 --- a/spec/models/role_spec.rb +++ b/spec/models/role_spec.rb @@ -6,4 +6,32 @@ RSpec.describe Role do let(:new_group_access_instance) { build(:role) } include_examples 'HasGroups' + + context '#validate_agent_limit_by_attributes' do + + context 'agent creation limit surpassing prevention' do + + def current_agent_count + User.with_permissions('ticket.agent').count + end + + it 'prevents re-activation of Role with agent permission' do + Setting.set('system_agent_limit', current_agent_count) + + inactive_agent_role = create(:role, + active: false, + permissions: Permission.where(name: 'ticket.agent')) + + create(:user, roles: [inactive_agent_role]) + + initial_agent_count = current_agent_count + + expect do + inactive_agent_role.update!(active: true) + end.to raise_error(Exceptions::UnprocessableEntity) + + expect(current_agent_count).to eq(initial_agent_count) + end + end + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 73277580a..e0bc53ad6 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -530,4 +530,138 @@ RSpec.describe User do end end end + + context 'agent limit' do + + def current_agent_count + User.with_permissions('ticket.agent').count + end + + let(:agent_role) { Role.lookup(name: 'Agent') } + let(:admin_role) { Role.lookup(name: 'Admin') } + + context '#validate_agent_limit_by_role' do + + context 'agent creation limit not reached' do + + it 'grants agent creation' do + Setting.set('system_agent_limit', current_agent_count + 1) + + expect do + create(:agent_user) + end.to change { + current_agent_count + }.by(1) + end + + it 'grants role change' do + Setting.set('system_agent_limit', current_agent_count + 1) + + future_agent = create(:customer_user) + + expect do + future_agent.roles = [agent_role] + end.to change { + current_agent_count + }.by(1) + end + + context 'role updates' do + + it 'grants update by instances' do + Setting.set('system_agent_limit', current_agent_count + 1) + + agent = create(:agent_user) + + expect do + agent.roles = [ + admin_role, + agent_role + ] + agent.save! + end.not_to raise_error + end + + it 'grants update by id (Integer)' do + Setting.set('system_agent_limit', current_agent_count + 1) + + agent = create(:agent_user) + + expect do + agent.role_ids = [ + admin_role.id, + agent_role.id + ] + agent.save! + end.not_to raise_error + end + + it 'grants update by id (String)' do + Setting.set('system_agent_limit', current_agent_count + 1) + + agent = create(:agent_user) + + expect do + agent.role_ids = [ + admin_role.id.to_s, + agent_role.id.to_s + ] + agent.save! + end.not_to raise_error + end + end + end + + context 'agent creation limit surpassing prevention' do + + it 'creation of new agents' do + Setting.set('system_agent_limit', current_agent_count + 2) + + create_list(:agent_user, 2) + + initial_agent_count = current_agent_count + + expect do + create(:agent_user) + end.to raise_error(Exceptions::UnprocessableEntity) + + expect(current_agent_count).to eq(initial_agent_count) + end + + it 'prevents role change' do + Setting.set('system_agent_limit', current_agent_count) + + future_agent = create(:customer_user) + + initial_agent_count = current_agent_count + + expect do + future_agent.roles = [agent_role] + end.to raise_error(Exceptions::UnprocessableEntity) + + expect(current_agent_count).to eq(initial_agent_count) + end + end + end + + context '#validate_agent_limit_by_attributes' do + + context 'agent creation limit surpassing prevention' do + + it 'prevents re-activation of agents' do + Setting.set('system_agent_limit', current_agent_count) + + inactive_agent = create(:agent_user, active: false) + + initial_agent_count = current_agent_count + + expect do + inactive_agent.update!(active: true) + end.to raise_error(Exceptions::UnprocessableEntity) + + expect(current_agent_count).to eq(initial_agent_count) + end + end + end + end end diff --git a/test/unit/user_validate_agent_limit_test.rb b/test/unit/user_validate_agent_limit_test.rb deleted file mode 100644 index 34dd758a4..000000000 --- a/test/unit/user_validate_agent_limit_test.rb +++ /dev/null @@ -1,110 +0,0 @@ - -require 'test_helper' - -class UserValidateAgentLimit < ActiveSupport::TestCase - test 'user_validate_agent_limit' do - - UserInfo.current_user_id = 1 - agent_max = User.with_permissions('ticket.agent').count + 2 - Setting.set('system_agent_limit', agent_max) - role_agent = Role.lookup(name: 'Agent') - role_customer = Role.lookup(name: 'Customer') - - user1 = User.create!( - firstname: 'Firstname', - lastname: 'Lastname', - email: 'some-agentlimit-user@example.com', - login: 'some-agentlimit-user@example.com', - roles: [role_agent], - active: true, - ) - user2 = User.create!( - firstname: 'Firstname1', - lastname: 'Lastname1', - email: 'some-agentlimit-user-1@example.com', - login: 'some-agentlimit-user-1@example.com', - roles: [role_agent], - active: true, - ) - - assert_raises(Exceptions::UnprocessableEntity) do - user3 = User.create!( - firstname: 'Firstname2', - lastname: 'Lastname2', - email: 'some-agentlimit-user-2@example.com', - login: 'some-agentlimit-user-2@example.com', - roles: [role_agent], - active: true, - ) - end - - user3 = User.create!( - firstname: 'Firstname2', - lastname: 'Lastname2', - email: 'some-agentlimit-user-2@example.com', - login: 'some-agentlimit-user-2@example.com', - roles: [role_customer], - active: true, - ) - - assert_raises(Exceptions::UnprocessableEntity) do - user3.roles = [role_agent] - end - - assert_equal(User.with_permissions('ticket.agent').count, agent_max) - - Setting.set('system_agent_limit', agent_max + 1) - user3.reload - user3.roles = [role_agent] - user3.save! - - user3.active = false - user3.save! - - Setting.set('system_agent_limit', agent_max) - - # try to activate inactive agent again - assert_raises(Exceptions::UnprocessableEntity) do - user3 = User.find(user3.id) - user3.active = true - user3.save! - end - - assert_equal(User.with_permissions('ticket.agent').count, agent_max) - - # try to activate inactive role again - role_agent_limit = Role.create!( - name: 'agent-limit-test-invalid-role', - note: 'agent-limit-test-invalid-role Role.', - permissions: Permission.where(name: 'ticket.agent'), - active: false, - ) - user3.roles = [role_agent_limit] - user3.active = true - user3.save! - - assert_raises(Exceptions::UnprocessableEntity) do - role_agent_limit.active = true - role_agent_limit.save! - end - - assert_equal(User.with_permissions('ticket.agent').count, agent_max) - - # set roles of agent again - role_admin = Role.lookup(name: 'Admin') - user2.roles = [role_agent, role_admin] - user2.save! - - user2.role_ids = [role_admin.id, role_agent_limit.id] - user2.save! - - user2.role_ids = [role_admin.id.to_s, role_agent_limit.id.to_s] - user2.save! - - user1.destroy! - user2.destroy! - user3.destroy! - role_agent_limit.destroy! - Setting.set('system_agent_limit', nil) - end -end