diff --git a/app/assets/javascripts/app/controllers/ticket_zoom.coffee b/app/assets/javascripts/app/controllers/ticket_zoom.coffee index d0457204a..652d078d3 100644 --- a/app/assets/javascripts/app/controllers/ticket_zoom.coffee +++ b/app/assets/javascripts/app/controllers/ticket_zoom.coffee @@ -500,6 +500,8 @@ class App.TicketZoom extends App.Controller if @Config.get('ticket_auto_assignment') is true if @ticket.owner_id is 1 && @permissionCheck('ticket.agent') && @ticket.editable('full') userIdsIgnore = @Config.get('ticket_auto_assignment_user_ids_ignore') || [] + if !_.isArray(userIdsIgnore) + userIdsIgnore = [userIdsIgnore] userIgnored = false currentUserId = App.Session.get('id') for userIdIgnore in userIdsIgnore diff --git a/script/build/test_slice_tests.sh b/script/build/test_slice_tests.sh index 25577293e..0e2ffae2a 100755 --- a/script/build/test_slice_tests.sh +++ b/script/build/test_slice_tests.sh @@ -25,7 +25,6 @@ if [ "$LEVEL" == '1' ]; then # test/browser/agent_navigation_and_title_test.rb # test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb - rm test/browser/agent_ticket_auto_assignment_test.rb rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb @@ -107,7 +106,6 @@ elif [ "$LEVEL" == '2' ]; then rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb - rm test/browser/agent_ticket_auto_assignment_test.rb rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb @@ -189,7 +187,6 @@ elif [ "$LEVEL" == '3' ]; then rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_organization_profile_test.rb # test/browser/agent_ticket_attachment_test.rb - # test/browser/agent_ticket_auto_assignment_test.rb # rm test/browser/agent_ticket_create_available_types_test.rb # rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb #rm test/browser/agent_ticket_create_cc_tokenizer_test.rb @@ -271,7 +268,6 @@ elif [ "$LEVEL" == '4' ]; then rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb - rm test/browser/agent_ticket_auto_assignment_test.rb rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb @@ -352,7 +348,6 @@ elif [ "$LEVEL" == '5' ]; then rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb - rm test/browser/agent_ticket_auto_assignment_test.rb rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb @@ -436,7 +431,6 @@ elif [ "$LEVEL" == '6' ]; then rm test/browser/agent_navigation_and_title_test.rb rm test/browser/agent_organization_profile_test.rb rm test/browser/agent_ticket_attachment_test.rb - rm test/browser/agent_ticket_auto_assignment_test.rb rm test/browser/agent_ticket_create_available_types_test.rb rm test/browser/agent_ticket_create_attachment_missing_after_reload_test.rb rm test/browser/agent_ticket_create_cc_tokenizer_test.rb diff --git a/spec/system/admin/settings/ticket_spec.rb b/spec/system/admin/settings/ticket_spec.rb new file mode 100644 index 000000000..83bf9c16a --- /dev/null +++ b/spec/system/admin/settings/ticket_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' + +RSpec.describe 'Admin > Settings > Ticket', type: :system do + + describe 'owner auto-assignment admin settings' do + it 'enable and disable feature' do + + click(:manage) + + within(:active_content) do + click(:href, '#settings/ticket') + click(:href, '#auto_assignment') + expect(page).to have_field('ticket_auto_assignment', checked: false, visible: false) + find('.js-ticketAutoAssignment').click() + expect(page).to have_field('ticket_auto_assignment', checked: true, visible: false) + end + + refresh + + within(:active_content) do + find('a[href="#auto_assignment"]').click() + expect(page).to have_field('ticket_auto_assignment', checked: true, visible: false) + find('.js-ticketAutoAssignment').click() + expect(page).to have_field('ticket_auto_assignment', checked: false, visible: false) + end + end + end + +end diff --git a/spec/system/ticket/zoom_spec.rb b/spec/system/ticket/zoom_spec.rb new file mode 100644 index 000000000..b5364f0e1 --- /dev/null +++ b/spec/system/ticket/zoom_spec.rb @@ -0,0 +1,132 @@ +require 'rails_helper' + +RSpec.describe 'Ticket zoom', type: :system do + + describe 'owner auto-assignment' do + let!(:ticket) { create(:ticket, group: Group.find_by(name: 'Users'), state: Ticket::State.find_by(name: 'new')) } + let!(:session_user) { User.find_by(login: 'master@example.com') } + + context 'for agent disabled' do + before do + Setting.set('ticket_auto_assignment', false) + Setting.set('ticket_auto_assignment_selector', { condition: { 'ticket.state_id' => { operator: 'is', value: Ticket::State.by_category(:work_on).pluck(:id) } } }) + Setting.set('ticket_auto_assignment_user_ids_ignore', []) + end + + it 'do not assign ticket to current session user' do + refresh + visit "#ticket/zoom/#{ticket.id}" + + within(:active_content) do + expect(page).to have_css('select[name=owner_id]') + expect(page).to have_select('owner_id', + selected: '-', + options: ['-', 'Agent 1 Test', 'Test Master Agent']) + end + end + end + + context 'for agent enabled' do + before do + Setting.set('ticket_auto_assignment', true) + Setting.set('ticket_auto_assignment_selector', { condition: { 'ticket.state_id' => { operator: 'is', value: Ticket::State.by_category(:work_on).pluck(:id) } } }) + end + + context 'with empty "ticket_auto_assignment_user_ids_ignore"' do + it 'assigns ticket to current session user' do + refresh + visit "#ticket/zoom/#{ticket.id}" + + within(:active_content) do + expect(page).to have_css('.content.active select[name=owner_id]') + expect(page).to have_select('owner_id', + selected: session_user.fullname, + options: ['-', 'Agent 1 Test', 'Test Master Agent']) + end + end + end + + context 'with "ticket_auto_assignment_user_ids_ignore" (as integer)' do + it 'assigns ticket not to current session user' do + Setting.set('ticket_auto_assignment_user_ids_ignore', session_user.id) + + refresh + visit "#ticket/zoom/#{ticket.id}" + + within(:active_content) do + expect(page).to have_css('select[name=owner_id]') + expect(page).to have_select('owner_id', + selected: '-', + options: ['-', 'Agent 1 Test', 'Test Master Agent']) + end + end + end + + context 'with "ticket_auto_assignment_user_ids_ignore" (as string)' do + it 'assigns ticket not to current session user' do + Setting.set('ticket_auto_assignment_user_ids_ignore', session_user.id.to_s) + + refresh + visit "#ticket/zoom/#{ticket.id}" + + within(:active_content) do + expect(page).to have_css('select[name=owner_id]') + expect(page).to have_select('owner_id', + selected: '-', + options: ['-', 'Agent 1 Test', 'Test Master Agent']) + end + end + end + + context 'with "ticket_auto_assignment_user_ids_ignore" (as [integer])' do + it 'assigns ticket not to current session user' do + Setting.set('ticket_auto_assignment_user_ids_ignore', [session_user.id]) + + refresh + visit "#ticket/zoom/#{ticket.id}" + + within(:active_content) do + expect(page).to have_css('select[name=owner_id]') + expect(page).to have_select('owner_id', + selected: '-', + options: ['-', 'Agent 1 Test', 'Test Master Agent']) + end + end + end + + context 'with "ticket_auto_assignment_user_ids_ignore" (as [string])' do + it 'assigns ticket not to current session user' do + Setting.set('ticket_auto_assignment_user_ids_ignore', [session_user.id.to_s]) + + refresh + visit "#ticket/zoom/#{ticket.id}" + + within(:active_content) do + expect(page).to have_css('select[name=owner_id]') + expect(page).to have_select('owner_id', + selected: '-', + options: ['-', 'Agent 1 Test', 'Test Master Agent']) + end + end + end + + context 'with "ticket_auto_assignment_user_ids_ignore" and other user ids' do + it 'assigns ticket to current session user' do + Setting.set('ticket_auto_assignment_user_ids_ignore', [99_999, 999_999]) + + refresh + visit "#ticket/zoom/#{ticket.id}" + + within(:active_content) do + expect(page).to have_css('select[name=owner_id]') + expect(page).to have_select('owner_id', + selected: session_user.fullname, + options: ['-', 'Agent 1 Test', 'Test Master Agent']) + end + end + end + end + + end + +end diff --git a/test/browser/agent_ticket_auto_assignment_test.rb b/test/browser/agent_ticket_auto_assignment_test.rb deleted file mode 100644 index 56ae1e49d..000000000 --- a/test/browser/agent_ticket_auto_assignment_test.rb +++ /dev/null @@ -1,152 +0,0 @@ -require 'browser_test_helper' - -class AgentTicketAutoAssignmentTest < TestCase - def test_ticket - - @browser = browser_instance - login( - username: 'agent1@example.com', - password: 'test', - url: browser_url, - ) - tasks_close_all() - - # - # attachment checks - new ticket - # - - # create new ticket with no attachment, attachment check should pop up - ticket1 = ticket_create( - data: { - customer: 'nico', - group: 'Users', - title: 'test_auto_assignment_1 - ticket 1', - body: 'test_auto_assignment_1 - ticket 1 - no auto assignment', - }, - ) - - ticket2 = ticket_create( - data: { - customer: 'nico', - group: 'Users', - title: 'test_auto_assignment_2 - ticket 2', - body: 'test_auto_assignment_2 - ticket 2 - no auto assignment', - }, - ) - - ticket3 = ticket_create( - data: { - customer: 'nico', - group: 'Users', - title: 'test_auto_assignment_3 - ticket 3', - body: 'test_auto_assignment_3 - ticket 3 - no auto assignment', - }, - ) - - tasks_close_all() - - logout() - - login( - username: 'master@example.com', - password: 'test', - url: browser_url, - ) - tasks_close_all() - - # open ticket#1 - ticket_open_by_search( - number: ticket1[:number], - ) - - # verify if owner is set - match( - css: '.content.active .sidebar select[name="owner_id"]', - value: '-', - ) - - # open ticket#2 - ticket_open_by_search( - number: ticket2[:number], - ) - - # verify if owner is set - match( - css: '.content.active .sidebar select[name="owner_id"]', - value: '-', - ) - - tasks_close_all() - - # enable auto assignment - click(css: 'a[href="#manage"]') - click(css: '.content.active a[href="#settings/ticket"]') - click(css: '.content.active a[href="#auto_assignment"]') - switch( - css: '.content.active .js-ticketAutoAssignment', - type: 'on', - ) - - # open ticket#1 - ticket_open_by_search( - number: ticket1[:number], - ) - - # verify if owner is set - watch_for( - css: '.content.active .sidebar select[name="owner_id"]', - value: 'Test Master', - timeout: 2, - ) - - # open ticket#2 - ticket_open_by_search( - number: ticket2[:number], - ) - - # verify if owner is set - watch_for( - css: '.content.active .sidebar select[name="owner_id"]', - value: 'Test Master', - timeout: 2, - ) - - # define auto assignment exception - click(css: 'a[href="#manage"]') - # flanky - click(css: '.content.active a[href="#settings/ticket"]') - click(css: '.content.active a[href="#auto_assignment"]') - click(css: '.content.active .js-select.js-option[title="master@example.com"]') - click(css: '.content.active .js-timeAccountingFilter') - - watch_for_disappear( - css: '.content.active .sidebar select[name="owner_id"]', - value: 'Test Master', - timeout: 10, - ) - - # open ticket#3 - ticket_open_by_search( - number: ticket3[:number], - ) - - # verify if owner is not set - sleep 6 - match( - css: '.content.active .sidebar select[name="owner_id"]', - value: '-', - ) - - tasks_close_all() - - # disable auto assignment - click(css: 'a[href="#manage"]') - click(css: '.content.active a[href="#settings/ticket"]') - click(css: '.content.active a[href="#auto_assignment"]') - switch( - css: '.content.active .js-ticketAutoAssignment', - type: 'off', - ) - - end -end