From 003d60d6b16619598027bc063b7abc519d356b21 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Mon, 11 Sep 2017 02:50:05 +0200 Subject: [PATCH] Improved tests for out of office feature and related controllers. --- .gitlab-ci.yml | 2 + .../_ui_element/autocompletion.coffee | 10 +- .../_ui_element/ticket_selector.coffee | 11 + .../javascripts/app/controllers/users.coffee | 4 +- .../javascripts/app/models/overview.coffee | 2 +- .../javascripts/app/models/trigger.coffee | 2 +- app/controllers/search_controller.rb | 6 +- app/controllers/users_controller.rb | 5 +- .../concerns/has_search_index_backend.rb | 12 +- app/models/ticket.rb | 42 ++- app/models/user.rb | 17 + app/models/user/search.rb | 31 +- app/models/user/search_index.rb | 33 +- db/migrate/20170826000001_out_of_office.rb | 53 --- db/migrate/20170910000002_out_of_office.rb | 58 ++++ db/seeds/overviews.rb | 8 +- .../user_organization_controller_test.rb | 72 ++++ test/integration/elasticsearch_test.rb | 7 + .../ticket_overview_out_of_office_test.rb | 321 ++++++++++++++++++ test/unit/ticket_overview_test.rb | 92 ++--- test/unit/user_out_of_office_test.rb | 26 ++ 21 files changed, 679 insertions(+), 135 deletions(-) delete mode 100644 db/migrate/20170826000001_out_of_office.rb create mode 100644 db/migrate/20170910000002_out_of_office.rb create mode 100644 test/unit/ticket_overview_out_of_office_test.rb diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 34e5845d0..8ce7141b6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -293,6 +293,7 @@ test:integration:es_mysql: - ruby -I test/ test/controllers/search_controller_test.rb - ruby -I test/ test/integration/report_test.rb - ruby -I test/ test/controllers/form_controller_test.rb + - ruby -I test/ test/controllers/user_organization_controller_test.rb - rake db:drop test:integration:es_postgresql: @@ -310,6 +311,7 @@ test:integration:es_postgresql: - ruby -I test/ test/controllers/search_controller_test.rb - ruby -I test/ test/integration/report_test.rb - ruby -I test/ test/controllers/form_controller_test.rb + - ruby -I test/ test/controllers/user_organization_controller_test.rb - rake db:drop test:integration:zendesk_mysql: diff --git a/app/assets/javascripts/app/controllers/_ui_element/autocompletion.coffee b/app/assets/javascripts/app/controllers/_ui_element/autocompletion.coffee index 142b3be2e..11c2d9241 100644 --- a/app/assets/javascripts/app/controllers/_ui_element/autocompletion.coffee +++ b/app/assets/javascripts/app/controllers/_ui_element/autocompletion.coffee @@ -14,7 +14,7 @@ class App.UiElement.autocompletion # call calback on init if @callback && attribute.value && @params - @callback( @params ) + @callback(@params) b = (event, item) => # set html form attribute @@ -24,7 +24,7 @@ class App.UiElement.autocompletion # call calback if @callback params = App.ControllerForm.params(form) - @callback( params ) + @callback(params) ### $(@local_attribute_full).tagsInput( autocomplete_url: '/users/search', @@ -33,7 +33,7 @@ class App.UiElement.autocompletion auto: { source: '/users/search', minLength: 2, - select: ( event, ui ) -> + select: (event, ui) -> #@log 'notice', 'selected', event, ui b(event, ui.item) } @@ -45,8 +45,8 @@ class App.UiElement.autocompletion $(local_attribute_full).autocomplete( source: source, minLength: attribute.minLengt || 3, - select: ( event, ui ) -> + select: (event, ui) -> b(event, ui.item) ) - App.Delay.set( a, 280, undefined, 'form_autocompletion' ) + App.Delay.set(a, 280, undefined, 'form_autocompletion') item diff --git a/app/assets/javascripts/app/controllers/_ui_element/ticket_selector.coffee b/app/assets/javascripts/app/controllers/_ui_element/ticket_selector.coffee index 91b5ad0b3..cd5e81d25 100644 --- a/app/assets/javascripts/app/controllers/_ui_element/ticket_selector.coffee +++ b/app/assets/javascripts/app/controllers/_ui_element/ticket_selector.coffee @@ -80,6 +80,17 @@ class App.UiElement.ticket_selector if config.name && config.name.match(myRegExp) config.operator = operator elements["#{groupKey}.#{config.name}"] = config + + if attribute.out_of_office + elements['ticket.out_of_office_replacement_id'] = + name: 'out_of_office_replacement_id' + display: 'Out of office replacement' + tag: 'autocompletion_ajax' + relation: 'User' + null: false + translate: true + operator: ['is', 'is not'] + [defaults, groups, elements] @rowContainer: (groups, elements, attribute) -> diff --git a/app/assets/javascripts/app/controllers/users.coffee b/app/assets/javascripts/app/controllers/users.coffee index 03e2ba13d..07b893a58 100644 --- a/app/assets/javascripts/app/controllers/users.coffee +++ b/app/assets/javascripts/app/controllers/users.coffee @@ -140,7 +140,7 @@ class Index extends App.ControllerSubContent App.Ajax.request( id: 'search' type: 'GET' - url: @apiPath + '/users/search' + url: "#{@apiPath}/users/search" data: query: @query limit: 140 @@ -165,7 +165,7 @@ class Index extends App.ControllerSubContent type: 'GET' url: "#{@apiPath}/users/recent" data: - limit: 40 + limit: 50 role_ids: role_ids full: 1 processData: true diff --git a/app/assets/javascripts/app/models/overview.coffee b/app/assets/javascripts/app/models/overview.coffee index dd8c0b2e9..85581873c 100644 --- a/app/assets/javascripts/app/models/overview.coffee +++ b/app/assets/javascripts/app/models/overview.coffee @@ -9,7 +9,7 @@ class App.Overview extends App.Model { name: 'user_ids', display: 'Available for User', tag: 'column_select', multiple: true, null: true, relation: 'User', sortBy: 'firstname' }, { name: 'organization_shared', display: 'Only available for Users with shared Organization', tag: 'select', options: { true: 'yes', false: 'no' }, default: false, null: true }, { name: 'out_of_office', display: 'Only available for Users which are replacements for other users.', tag: 'select', options: { true: 'yes', false: 'no' }, default: false, null: true }, - { name: 'condition', display: 'Conditions for shown Tickets', tag: 'ticket_selector', null: false }, + { name: 'condition', display: 'Conditions for shown Tickets', tag: 'ticket_selector', null: false, out_of_office: true }, { name: 'prio', display: 'Prio', readonly: 1 }, { name: 'view::s' diff --git a/app/assets/javascripts/app/models/trigger.coffee b/app/assets/javascripts/app/models/trigger.coffee index 84d00dc7c..093feea5a 100644 --- a/app/assets/javascripts/app/models/trigger.coffee +++ b/app/assets/javascripts/app/models/trigger.coffee @@ -5,7 +5,7 @@ class App.Trigger extends App.Model @configure_attributes = [ { name: 'name', display: 'Name', tag: 'input', type: 'text', limit: 100, null: false }, { name: 'condition', display: 'Conditions for effected objects', tag: 'ticket_selector', null: false, preview: false, action: true, hasChanged: true }, - { name: 'perform', display: 'Execute changes on objects', tag: 'ticket_perform_action', null: true, notification: true }, + { name: 'perform', display: 'Execute changes on objects', tag: 'ticket_perform_action', null: true, notification: true, trigger: true }, { name: 'active', display: 'Active', tag: 'active', default: true }, { name: 'updated_at', display: 'Updated', tag: 'datetime', readonly: 1 }, ] diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index e0db600da..8e8df76af 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -57,7 +57,7 @@ class SearchController < ApplicationController } # do only one query to index search backend - if !objects_with_direct_search_index.empty? + if objects_with_direct_search_index.present? items = SearchIndexBackend.search(query, limit, objects_with_direct_search_index) items.each { |item| require item[:type].to_filename @@ -71,7 +71,7 @@ class SearchController < ApplicationController # e. g. do ticket query by Ticket class to handle ticket permissions objects_without_direct_search_index.each { |object| object_result = search_generic_backend(object, query, limit, current_user, assets) - if !object_result.empty? + if object_result.present? result = result.concat(object_result) end } @@ -92,7 +92,7 @@ class SearchController < ApplicationController # do query objects_in_order.each { |object| object_result = search_generic_backend(object, query, limit, current_user, assets) - if !object_result.empty? + if object_result.present? result = result.concat(object_result) end } diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 599deb6c2..ff2a98185 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -368,8 +368,9 @@ class UsersController < ApplicationController limit: params[:limit], current_user: current_user, } - if params[:role_ids].present? - query_params[:role_ids] = params[:role_ids] + [:role_ids, :permissions].each do |key| + next if params[key].blank? + query_params[key] = params[key] end # do query diff --git a/app/models/concerns/has_search_index_backend.rb b/app/models/concerns/has_search_index_backend.rb index c7a656493..038ceb0f6 100644 --- a/app/models/concerns/has_search_index_backend.rb +++ b/app/models/concerns/has_search_index_backend.rb @@ -19,10 +19,10 @@ update search index, if configured - will be executed automatically =end def search_index_update - return if ignore_search_indexing?(:update) + return true if ignore_search_indexing?(:update) # start background job to transfer data to search index - return if !SearchIndexBackend.enabled? + return true if !SearchIndexBackend.enabled? Delayed::Job.enqueue(BackgroundJobSearchIndex.new(self.class.to_s, id)) true end @@ -37,7 +37,7 @@ delete search index object, will be executed automatically =end def search_index_destroy - return if ignore_search_indexing?(:destroy) + return true if ignore_search_indexing?(:destroy) SearchIndexBackend.remove(self.class.to_s, id) true end @@ -58,7 +58,7 @@ returns def search_index_update_backend # fill up with search data attributes = search_index_attribute_lookup - return if !attributes + return true if !attributes # update backend SearchIndexBackend.add(self.class.to_s, attributes) @@ -86,10 +86,10 @@ returns attributes = {} %w(name note).each { |key| next if !self[key] - next if self[key].respond_to?('empty?') && self[key].empty? + next if self[key].respond_to?('blank?') && self[key].blank? attributes[key] = self[key] } - return if attributes.empty? + return true if attributes.blank? attributes end diff --git a/app/models/ticket.rb b/app/models/ticket.rb index c71a4cb8d..814949465 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -549,6 +549,12 @@ condition example # get attributes attributes = attribute.split(/\./) attribute = "#{attributes[0]}s.#{attributes[1]}" + + # magic selectors + if attributes[0] == 'ticket' && attributes[1] == 'out_of_office_replacement_id' + attribute = "#{attributes[0]}s.owner_id" + end + if attributes[0] == 'ticket' && attributes[1] == 'tags' selector['value'] = selector['value'].split(/,/).collect(&:strip) end @@ -567,8 +573,13 @@ condition example end elsif selector['pre_condition'] == 'current_user.id' raise "Use current_user.id in selector, but no current_user is set #{selector.inspect}" if !current_user_id - query += "#{attribute} IN (?)" - bind_params.push current_user_id + if attributes[1] == 'out_of_office_replacement_id' + query += "#{attribute} IN (?)" + bind_params.push User.find(current_user_id).out_of_office_agent_of.pluck(:id) + else + query += "#{attribute} IN (?)" + bind_params.push current_user_id + end elsif selector['pre_condition'] == 'current_user.organization_id' raise "Use current_user.id in selector, but no current_user is set #{selector.inspect}" if !current_user_id query += "#{attribute} IN (?)" @@ -579,8 +590,13 @@ condition example if selector['value'].nil? query += "#{attribute} IS NULL" else - query += "#{attribute} IN (?)" - bind_params.push selector['value'] + if attributes[1] == 'out_of_office_replacement_id' + query += "#{attribute} IN (?)" + bind_params.push User.find(selector['value']).out_of_office_agent_of.pluck(:id) + else + query += "#{attribute} IN (?)" + bind_params.push selector['value'] + end end # rubocop:enable Style/IfInsideElse end @@ -593,8 +609,13 @@ condition example query += "#{attribute} IS NOT NULL" end elsif selector['pre_condition'] == 'current_user.id' - query += "#{attribute} NOT IN (?)" - bind_params.push current_user_id + if attributes[1] == 'out_of_office_replacement_id' + query += "#{attribute} NOT IN (?)" + bind_params.push User.find(current_user_id).out_of_office_agent_of.pluck(:id) + else + query += "#{attribute} NOT IN (?)" + bind_params.push current_user_id + end elsif selector['pre_condition'] == 'current_user.organization_id' query += "#{attribute} NOT IN (?)" user = User.lookup(id: current_user_id) @@ -604,8 +625,13 @@ condition example if selector['value'].nil? query += "#{attribute} IS NOT NULL" else - query += "#{attribute} NOT IN (?)" - bind_params.push selector['value'] + if attributes[1] == 'out_of_office_replacement_id' + query += "#{attribute} NOT IN (?)" + bind_params.push User.find(selector['value']).out_of_office_agent_of.pluck(:id) + else + query += "#{attribute} NOT IN (?)" + bind_params.push selector['value'] + end end # rubocop:enable Style/IfInsideElse end diff --git a/app/models/user.rb b/app/models/user.rb index 05db0b85d..d56a76fab 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,6 +199,23 @@ returns =begin +gets users where user is replacement + + user = User.find(123) + result = user.out_of_office_agent_of + +returns + + result = [user_model1, user_model2] + +=end + + def out_of_office_agent_of + User.where(active: true, out_of_office: true, out_of_office_replacement_id: id).where('out_of_office_start_at <= ? AND out_of_office_end_at >= ?', Time.zone.today, Time.zone.today) + end + +=begin + get users activity stream user = User.find(123) diff --git a/app/models/user/search.rb b/app/models/user/search.rb index 37286e578..4d11b9fc5 100644 --- a/app/models/user/search.rb +++ b/app/models/user/search.rb @@ -40,6 +40,16 @@ search user current_user: user_model, ) +or with certain role_ids | permissions + + result = User.search( + query: 'some search term', + limit: 15, + current_user: user_model, + role_ids: [1,2,3], + permissions: ['ticket.agent'] + ) + returns result = [user_model1, user_model2, ...] @@ -56,9 +66,28 @@ returns # enable search only for agents and admins return [] if !search_preferences(current_user) + # lookup for roles of permission + if params[:permissions].present? + params[:role_ids] ||= [] + role_ids = Role.with_permissions(params[:permissions]).pluck(:id) + params[:role_ids].concat(role_ids) + end + # try search index backend if SearchIndexBackend.enabled? - items = SearchIndexBackend.search(query, limit, 'User') + query_extention = {} + if params[:role_ids].present? + query_extention['bool'] = {} + query_extention['bool']['must'] = [] + if !params[:role_ids].is_a?(Array) + params[:role_ids] = [params[:role_ids]] + end + access_condition = { + 'query_string' => { 'default_field' => 'role_ids', 'query' => "\"#{params[:role_ids].join('" OR "')}\"" } + } + query_extention['bool']['must'].push access_condition + end + items = SearchIndexBackend.search(query, limit, 'User', query_extention) users = [] items.each { |item| user = User.lookup(id: item[:id]) diff --git a/app/models/user/search_index.rb b/app/models/user/search_index.rb index a420ead22..1c39d8f9d 100644 --- a/app/models/user/search_index.rb +++ b/app/models/user/search_index.rb @@ -5,6 +5,33 @@ class User =begin +lookup name of ref. objects + + user = User.find(123) + attributes = user.search_index_attribute_lookup + +returns + + attributes # object with lookup data + +=end + + def search_index_attribute_lookup + attributes = super + + attributes['permissions'] = [] + permissions_with_child_ids.each do |permission_id| + permission = Permission.lookup(id: permission_id) + next if !permission + attributes['permissions'].push permission.name + end + attributes['role_ids'] = role_ids + + attributes + end + +=begin + get data to store in search index user = User.find(2) @@ -30,12 +57,12 @@ returns next if key == 'preferences' next if key == 'password' next if !value - next if value.respond_to?('empty?') && value.empty? + next if value.respond_to?('blank?') && value.blank? attributes[key] = value } - return if attributes.empty? + return if attributes.blank? - if attributes['organization_id'] + if attributes['organization_id'].present? organization = Organization.lookup(id: attributes['organization_id']) if organization attributes['organization'] = organization.name diff --git a/db/migrate/20170826000001_out_of_office.rb b/db/migrate/20170826000001_out_of_office.rb deleted file mode 100644 index 26cce7957..000000000 --- a/db/migrate/20170826000001_out_of_office.rb +++ /dev/null @@ -1,53 +0,0 @@ -class OutOfOffice < ActiveRecord::Migration[4.2] - def up - - # return if it's a new setup - return if !Setting.find_by(name: 'system_init_done') - - add_column :overviews, :out_of_office, :boolean, null: false, default: false - Overview.reset_column_information - - role_ids = Role.with_permissions(['ticket.agent']).map(&:id) - overview_role = Role.find_by(name: 'Agent') - Overview.create_if_not_exists( - name: 'My replacement Tickets', - link: 'my_replacement_tickets', - prio: 1080, - role_ids: role_ids, - out_of_office: true, - condition: { - 'ticket.state_id' => { - operator: 'is', - value: Ticket::State.by_category(:open).pluck(:id), - }, - #'ticket.out_of_office_replacement_id' => { - # operator: 'is', - # pre_condition: 'current_user.organization_id', - #}, - }, - order: { - by: 'created_at', - direction: 'DESC', - }, - view: { - d: %w(title customer group owner escalation_at), - s: %w(title customer group owner escalation_at), - m: %w(number title customer group owner escalation_at), - view_mode_default: 's', - }, - updated_by_id: 1, - created_by_id: 1, - ) - - add_column :users, :out_of_office, :boolean, null: false, default: false - add_column :users, :out_of_office_start_at, :date, null: true - add_column :users, :out_of_office_end_at, :date, null: true - add_column :users, :out_of_office_replacement_id, :integer, null: true - - add_index :users, [:out_of_office, :out_of_office_start_at, :out_of_office_end_at], name: 'index_out_of_office' - add_index :users, [:out_of_office_replacement_id] - add_foreign_key :users, :users, column: :out_of_office_replacement_id - - Cache.clear - end -end diff --git a/db/migrate/20170910000002_out_of_office.rb b/db/migrate/20170910000002_out_of_office.rb new file mode 100644 index 000000000..d80c2fb10 --- /dev/null +++ b/db/migrate/20170910000002_out_of_office.rb @@ -0,0 +1,58 @@ +class OutOfOffice < ActiveRecord::Migration[4.2] + def up + + # return if it's a new setup + return if !Setting.find_by(name: 'system_init_done') + + if !ActiveRecord::Base.connection.column_exists?(:overviews, :out_of_office) + add_column :overviews, :out_of_office, :boolean, null: false, default: false + Overview.reset_column_information + end + + role_ids = Role.with_permissions(['ticket.agent']).map(&:id) + overview_role = Role.find_by(name: 'Agent') + Overview.create_or_update( + name: 'My replacement Tickets', + link: 'my_replacement_tickets', + prio: 1080, + role_ids: role_ids, + out_of_office: true, + condition: { + 'ticket.state_id' => { + operator: 'is', + value: Ticket::State.by_category(:open).pluck(:id), + }, + 'ticket.out_of_office_replacement_id' => { + operator: 'is', + pre_condition: 'current_user.id', + }, + }, + order: { + by: 'created_at', + direction: 'DESC', + }, + view: { + d: %w(title customer group owner escalation_at), + s: %w(title customer group owner escalation_at), + m: %w(number title customer group owner escalation_at), + view_mode_default: 's', + }, + updated_by_id: 1, + created_by_id: 1, + ) + + if !ActiveRecord::Base.connection.column_exists?(:users, :out_of_office) + add_column :users, :out_of_office, :boolean, null: false, default: false + add_column :users, :out_of_office_start_at, :date, null: true + add_column :users, :out_of_office_end_at, :date, null: true + add_column :users, :out_of_office_replacement_id, :integer, null: true + + add_index :users, [:out_of_office, :out_of_office_start_at, :out_of_office_end_at], name: 'index_out_of_office' + add_index :users, [:out_of_office_replacement_id] + add_foreign_key :users, :users, column: :out_of_office_replacement_id + User.reset_column_information + end + + Cache.clear + end +end diff --git a/db/seeds/overviews.rb b/db/seeds/overviews.rb index ce1f052f6..e274c533b 100644 --- a/db/seeds/overviews.rb +++ b/db/seeds/overviews.rb @@ -171,10 +171,10 @@ Overview.create_if_not_exists( operator: 'is', value: Ticket::State.by_category(:open).pluck(:id), }, - #'ticket.out_of_office_replacement_id' => { - # operator: 'is', - # pre_condition: 'current_user.organization_id', - #}, + 'ticket.out_of_office_replacement_id' => { + operator: 'is', + pre_condition: 'current_user.id', + }, }, order: { by: 'created_at', diff --git a/test/controllers/user_organization_controller_test.rb b/test/controllers/user_organization_controller_test.rb index e4b453c5f..4079eba1f 100644 --- a/test/controllers/user_organization_controller_test.rb +++ b/test/controllers/user_organization_controller_test.rb @@ -1,5 +1,6 @@ # encoding: utf-8 require 'test_helper' +require 'rake' class UserOrganizationControllerTest < ActionDispatch::IntegrationTest setup do @@ -83,6 +84,39 @@ class UserOrganizationControllerTest < ActionDispatch::IntegrationTest organization_id: @organization.id, ) + # configure es + if ENV['ES_URL'].present? + #fail "ERROR: Need ES_URL - hint ES_URL='http://127.0.0.1:9200'" + Setting.set('es_url', ENV['ES_URL']) + + # Setting.set('es_url', 'http://127.0.0.1:9200') + # Setting.set('es_index', 'estest.local_zammad') + # Setting.set('es_user', 'elasticsearch') + # Setting.set('es_password', 'zammad') + + if ENV['ES_INDEX_RAND'].present? + ENV['ES_INDEX'] = "es_index_#{rand(999_999_999)}" + end + if ENV['ES_INDEX'].blank? + raise "ERROR: Need ES_INDEX - hint ES_INDEX='estest.local_zammad'" + end + Setting.set('es_index', ENV['ES_INDEX']) + + travel 1.minute + + # drop/create indexes + Rake::Task.clear + Zammad::Application.load_tasks + #Rake::Task["searchindex:drop"].execute + #Rake::Task["searchindex:create"].execute + Rake::Task['searchindex:rebuild'].execute + + # execute background jobs + Scheduler.worker(true) + + sleep 6 + end + end test 'user create tests - no user' do @@ -460,10 +494,12 @@ class UserOrganizationControllerTest < ActionDispatch::IntegrationTest # search as agent Scheduler.worker(true) + sleep 2 # let es time to come ready get "/api/v1/users/search?query=#{CGI.escape("Customer#{firstname}")}", params: {}, headers: @headers.merge('Authorization' => credentials) assert_response(200) result = JSON.parse(@response.body) assert_equal(Array, result.class) + assert_equal(result_user1['id'], result[0]['id']) assert_equal("Customer#{firstname}", result[0]['firstname']) assert_equal('Customer Last', result[0]['lastname']) @@ -489,6 +525,42 @@ class UserOrganizationControllerTest < ActionDispatch::IntegrationTest assert_equal("Customer#{firstname} Customer Last ", result[0]['value']) assert_not(result[0]['role_ids']) assert_not(result[0]['roles']) + + role = Role.find_by(name: 'Agent') + get "/api/v1/users/search?query=#{CGI.escape("Customer#{firstname}")}&role_ids=#{role.id}&label=true", params: {}, headers: @headers.merge('Authorization' => credentials) + assert_response(200) + result = JSON.parse(@response.body) + assert_equal(Array, result.class) + assert_equal(0, result.count) + + role = Role.find_by(name: 'Customer') + get "/api/v1/users/search?query=#{CGI.escape("Customer#{firstname}")}&role_ids=#{role.id}&label=true", params: {}, headers: @headers.merge('Authorization' => credentials) + assert_response(200) + result = JSON.parse(@response.body) + assert_equal(Array, result.class) + assert_equal(result_user1['id'], result[0]['id']) + assert_equal("Customer#{firstname} Customer Last ", result[0]['label']) + assert_equal("Customer#{firstname} Customer Last ", result[0]['value']) + assert_not(result[0]['role_ids']) + assert_not(result[0]['roles']) + + permission = Permission.find_by(name: 'ticket.agent') + get "/api/v1/users/search?query=#{CGI.escape("Customer#{firstname}")}&permissions=#{permission.name}&label=true", params: {}, headers: @headers.merge('Authorization' => credentials) + assert_response(200) + result = JSON.parse(@response.body) + assert_equal(Array, result.class) + assert_equal(0, result.count) + + permission = Permission.find_by(name: 'ticket.customer') + get "/api/v1/users/search?query=#{CGI.escape("Customer#{firstname}")}&permissions=#{permission.name}&label=true", params: {}, headers: @headers.merge('Authorization' => credentials) + assert_response(200) + result = JSON.parse(@response.body) + assert_equal(Array, result.class) + assert_equal(result_user1['id'], result[0]['id']) + assert_equal("Customer#{firstname} Customer Last ", result[0]['label']) + assert_equal("Customer#{firstname} Customer Last ", result[0]['value']) + assert_not(result[0]['role_ids']) + assert_not(result[0]['roles']) end test 'user index and create with customer1' do diff --git a/test/integration/elasticsearch_test.rb b/test/integration/elasticsearch_test.rb index 6f7646b7d..778c4100d 100644 --- a/test/integration/elasticsearch_test.rb +++ b/test/integration/elasticsearch_test.rb @@ -124,6 +124,13 @@ class ElasticsearchTest < ActiveSupport::TestCase assert_not(attributes['password']) assert_not(attributes['organization']) + attributes = @customer1.search_index_attribute_lookup + assert_equal('ES', attributes['firstname']) + assert_equal('Customer1', attributes['lastname']) + assert_equal('es-customer1@example.com', attributes['email']) + assert_not(attributes['password']) + assert_equal('Customer Organization Update', attributes['organization']) + # organization attributes = @organization1.search_index_data assert_equal('Customer Organization Update', attributes['name']) diff --git a/test/unit/ticket_overview_out_of_office_test.rb b/test/unit/ticket_overview_out_of_office_test.rb new file mode 100644 index 000000000..bbd7ca464 --- /dev/null +++ b/test/unit/ticket_overview_out_of_office_test.rb @@ -0,0 +1,321 @@ +# encoding: utf-8 +require 'test_helper' + +class TicketOverviewOutOfOfficeTest < ActiveSupport::TestCase + + setup do + group = Group.create_or_update( + name: 'OverviewReplacementTest', + updated_at: '2015-02-05 16:37:00', + updated_by_id: 1, + created_by_id: 1, + ) + roles = Role.where(name: 'Agent') + @agent1 = User.create_or_update( + login: 'ticket-overview-agent1@example.com', + firstname: 'Overview', + lastname: 'Agent1', + email: 'ticket-overview-agent1@example.com', + password: 'agentpw', + active: true, + roles: roles, + groups: [group], + out_of_office: false, + updated_at: '2015-02-05 16:37:00', + updated_by_id: 1, + created_by_id: 1, + ) + @agent2 = User.create_or_update( + login: 'ticket-overview-agent2@example.com', + firstname: 'Overview', + lastname: 'Agent2', + email: 'ticket-overview-agent2@example.com', + password: 'agentpw', + active: true, + roles: roles, + groups: [group], + out_of_office: false, + updated_at: '2015-02-05 16:38:00', + updated_by_id: 1, + created_by_id: 1, + ) + roles = Role.where(name: 'Customer') + organization1 = Organization.create_or_update( + name: 'Overview Org', + updated_at: '2015-02-05 16:37:00', + updated_by_id: 1, + created_by_id: 1, + ) + @customer1 = User.create_or_update( + login: 'ticket-overview-customer1@example.com', + firstname: 'Overview', + lastname: 'Customer1', + email: 'ticket-overview-customer1@example.com', + password: 'customerpw', + active: true, + organization_id: organization1.id, + roles: roles, + out_of_office: false, + updated_at: '2015-02-05 16:37:00', + updated_by_id: 1, + created_by_id: 1, + ) + + Overview.destroy_all + UserInfo.current_user_id = 1 + overview_role = Role.find_by(name: 'Agent') + @overview1 = Overview.create_or_update( + name: 'My replacement Tickets', + link: 'my_replacement', + prio: 1000, + role_ids: [overview_role.id], + out_of_office: true, + condition: { + 'ticket.state_id' => { + operator: 'is', + value: Ticket::State.by_category(:open).pluck(:id), + }, + 'ticket.out_of_office_replacement_id' => { + operator: 'is', + pre_condition: 'current_user.id', + }, + }, + order: { + by: 'created_at', + direction: 'ASC', + }, + view: { + d: %w(title customer group created_at), + s: %w(title customer group created_at), + m: %w(number title customer group created_at), + view_mode_default: 's', + }, + ) + @overview2 = Overview.create_if_not_exists( + name: 'My assigned Tickets', + link: 'my_assigned', + prio: 900, + role_ids: [overview_role.id], + condition: { + 'ticket.state_id' => { + operator: 'is', + value: Ticket::State.by_category(:open).pluck(:id), + }, + 'ticket.owner_id' => { + operator: 'is', + pre_condition: 'current_user.id', + }, + }, + order: { + by: 'created_at', + direction: 'ASC', + }, + view: { + d: %w(title customer group created_at), + s: %w(title customer group created_at), + m: %w(number title customer group created_at), + view_mode_default: 's', + }, + ) + + overview_role = Role.find_by(name: 'Customer') + @overview3 = Overview.create_or_update( + name: 'My Tickets', + link: 'my_tickets', + prio: 1100, + role_ids: [overview_role.id], + out_of_office: true, + condition: { + 'ticket.state_id' => { + operator: 'is', + value: [1, 2, 3, 4, 6, 7], + }, + 'ticket.out_of_office_replacement_id' => { + operator: 'is', + pre_condition: 'current_user.organization_id', + }, + }, + order: { + by: 'created_at', + direction: 'DESC', + }, + view: { + d: %w(title customer state created_at), + s: %w(number title state created_at), + m: %w(number title state created_at), + view_mode_default: 's', + }, + ) + + end + + test 'overview index' do + result = Ticket::Overviews.all( + current_user: @agent1, + ) + assert_equal(1, result.count) + assert_equal('My assigned Tickets', result[0].name) + + result = Ticket::Overviews.all( + current_user: @agent2, + ) + assert_equal(1, result.count) + assert_equal('My assigned Tickets', result[0].name) + + result = Ticket::Overviews.all( + current_user: @customer1, + ) + assert_equal(1, result.count) + assert_equal('My Tickets', result[0].name) + @agent1.out_of_office = true + @agent1.out_of_office_start_at = Time.zone.now - 2.days + @agent1.out_of_office_end_at = Time.zone.now + 2.days + @agent1.out_of_office_replacement_id = @agent2.id + @agent1.save! + + result = Ticket::Overviews.all( + current_user: @agent1, + ) + assert_equal(1, result.count) + assert_equal('My assigned Tickets', result[0].name) + + result = Ticket::Overviews.all( + current_user: @agent2, + ) + assert_equal(2, result.count) + assert_equal('My assigned Tickets', result[0].name) + assert_equal('My replacement Tickets', result[1].name) + + result = Ticket::Overviews.all( + current_user: @customer1, + ) + assert_equal(1, result.count) + assert_equal('My Tickets', result[0].name) + end + + test 'overview shown' do + result = Ticket::Overviews.index(@agent1) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My assigned Tickets') + assert_equal(result[0][:overview][:view], 'my_assigned') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + + result = Ticket::Overviews.index(@agent2) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My assigned Tickets') + assert_equal(result[0][:overview][:view], 'my_assigned') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + + result = Ticket::Overviews.index(@customer1) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My Tickets') + assert_equal(result[0][:overview][:view], 'my_tickets') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + + @agent1.out_of_office = true + @agent1.out_of_office_start_at = Time.zone.now - 2.days + @agent1.out_of_office_end_at = Time.zone.now + 2.days + @agent1.out_of_office_replacement_id = @agent2.id + @agent1.save! + + p User.where(active: true, out_of_office: true, out_of_office_replacement_id: @agent2.id) + p User.where(active: true, out_of_office: true, out_of_office_replacement_id: @agent2.id).where('out_of_office_start_at <= ? AND out_of_office_end_at >= ?', Time.zone.today, Time.zone.today) + assert_equal(@agent2.out_of_office_agent_of.count, 1) + assert(@agent2.out_of_office_agent_of[0]) + assert_equal(@agent2.out_of_office_agent_of[0].id, @agent1.id) + + result = Ticket::Overviews.index(@agent1) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My assigned Tickets') + assert_equal(result[0][:overview][:view], 'my_assigned') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + + result = Ticket::Overviews.index(@agent2) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My assigned Tickets') + assert_equal(result[0][:overview][:view], 'my_assigned') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + assert(result[1]) + assert_equal(result[1][:overview][:name], 'My replacement Tickets') + assert_equal(result[1][:overview][:view], 'my_replacement') + assert_equal(result[1][:count], 0) + assert_equal(result[1][:tickets].class, Array) + assert(result[1][:tickets].blank?) + + result = Ticket::Overviews.index(@customer1) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My Tickets') + assert_equal(result[0][:overview][:view], 'my_tickets') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + + ticket1 = Ticket.create!( + title: 'overview test 1', + group: Group.lookup(name: 'OverviewReplacementTest'), + customer_id: 2, + owner_id: @agent1.id, + state: Ticket::State.lookup(name: 'new'), + priority: Ticket::Priority.lookup(name: '2 normal'), + updated_by_id: 1, + created_by_id: 1, + ) + article1 = Ticket::Article.create!( + ticket_id: ticket1.id, + from: 'some_sender@example.com', + to: 'some_recipient@example.com', + subject: 'some subject', + message_id: 'some@id', + body: 'some message... 123', + internal: false, + sender: Ticket::Article::Sender.find_by(name: 'Customer'), + type: Ticket::Article::Type.find_by(name: 'email'), + updated_by_id: 1, + created_by_id: 1, + ) + + result = Ticket::Overviews.index(@agent1) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My assigned Tickets') + assert_equal(result[0][:overview][:view], 'my_assigned') + assert_equal(result[0][:count], 1) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets]) + assert_equal(result[0][:tickets][0][:id], ticket1.id) + + result = Ticket::Overviews.index(@agent2) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My assigned Tickets') + assert_equal(result[0][:overview][:view], 'my_assigned') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + assert(result[1]) + assert_equal(result[1][:overview][:name], 'My replacement Tickets') + assert_equal(result[1][:overview][:view], 'my_replacement') + assert_equal(result[1][:count], 1) + assert_equal(result[1][:tickets].class, Array) + assert(result[1][:tickets]) + assert_equal(result[1][:tickets][0][:id], ticket1.id) + + result = Ticket::Overviews.index(@customer1) + assert(result[0]) + assert_equal(result[0][:overview][:name], 'My Tickets') + assert_equal(result[0][:overview][:view], 'my_tickets') + assert_equal(result[0][:count], 0) + assert_equal(result[0][:tickets].class, Array) + assert(result[0][:tickets].blank?) + + end + +end diff --git a/test/unit/ticket_overview_test.rb b/test/unit/ticket_overview_test.rb index 029c18e6d..284787ee4 100644 --- a/test/unit/ticket_overview_test.rb +++ b/test/unit/ticket_overview_test.rb @@ -352,16 +352,16 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:name], 'My Tickets only with Note') assert_equal(result[2][:overview][:view], 'my_tickets_onyl_with_note') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) assert_equal(result[2][:count], 0) result = Ticket::Overviews.index(@agent2) @@ -369,16 +369,16 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) ticket1 = Ticket.create!( title: 'overview test 1', @@ -408,17 +408,17 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket1.id) assert_equal(result[1][:count], 1) assert_equal(result[2][:overview][:name], 'My Tickets only with Note') assert_equal(result[2][:overview][:view], 'my_tickets_onyl_with_note') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) assert_equal(result[2][:count], 0) result = Ticket::Overviews.index(@agent2) @@ -426,16 +426,16 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) travel 1.second # because of mysql millitime issues ticket2 = Ticket.create!( @@ -466,18 +466,18 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket1.id) assert_equal(result[1][:tickets][1][:id], ticket2.id) assert_equal(result[1][:count], 2) assert_equal(result[2][:overview][:name], 'My Tickets only with Note') assert_equal(result[2][:overview][:view], 'my_tickets_onyl_with_note') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) assert_equal(result[2][:count], 0) result = Ticket::Overviews.index(@agent2) @@ -485,16 +485,16 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) ticket2.owner_id = @agent1.id ticket2.save! @@ -509,7 +509,7 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket1.id) assert_equal(result[1][:count], 1) assert_equal(result[2][:overview][:name], 'My Tickets only with Note') @@ -523,16 +523,16 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) travel 1.second # because of mysql millitime issues ticket3 = Ticket.create!( @@ -571,7 +571,7 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket1.id) assert_equal(result[1][:tickets][1][:id], ticket3.id) assert_equal(result[1][:count], 2) @@ -588,18 +588,18 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:id], @overview2.id) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:id], @overview3.id) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) @overview2.order = { by: 'created_at', @@ -619,7 +619,7 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket3.id) assert_equal(result[1][:tickets][1][:id], ticket1.id) assert_equal(result[1][:count], 2) @@ -636,18 +636,18 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:id], @overview2.id) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:id], @overview3.id) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) @overview2.order = { by: 'priority_id', @@ -667,7 +667,7 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket1.id) assert_equal(result[1][:tickets][1][:id], ticket3.id) assert_equal(result[1][:count], 2) @@ -684,18 +684,18 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:id], @overview2.id) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:id], @overview3.id) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) @overview2.order = { by: 'priority_id', @@ -715,7 +715,7 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket3.id) assert_equal(result[1][:tickets][1][:id], ticket1.id) assert_equal(result[1][:count], 2) @@ -732,18 +732,18 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:id], @overview2.id) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:id], @overview3.id) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) @overview2.order = { by: 'priority', @@ -763,7 +763,7 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket1.id) assert_equal(result[1][:tickets][1][:id], ticket3.id) assert_equal(result[1][:count], 2) @@ -780,18 +780,18 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:id], @overview2.id) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:id], @overview3.id) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) @overview2.order = { by: 'priority', @@ -811,7 +811,7 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert_not(result[1][:tickets].empty?) + assert_not(result[1][:tickets].blank?) assert_equal(result[1][:tickets][0][:id], ticket3.id) assert_equal(result[1][:tickets][1][:id], ticket1.id) assert_equal(result[1][:count], 2) @@ -828,18 +828,18 @@ class TicketOverviewTest < ActiveSupport::TestCase assert_equal(result[0][:overview][:view], 'my_assigned') assert_equal(result[0][:count], 0) assert_equal(result[0][:tickets].class, Array) - assert(result[0][:tickets].empty?) + assert(result[0][:tickets].blank?) assert_equal(result[1][:overview][:id], @overview2.id) assert_equal(result[1][:overview][:name], 'Unassigned & Open') assert_equal(result[1][:overview][:view], 'all_unassigned') assert_equal(result[1][:tickets].class, Array) - assert(result[1][:tickets].empty?) + assert(result[1][:tickets].blank?) assert_equal(result[1][:count], 0) assert_equal(result[2][:overview][:id], @overview3.id) assert_equal(result[2][:overview][:name], 'My Tickets 2') assert_equal(result[2][:overview][:view], 'my_tickets_2') assert_equal(result[2][:tickets].class, Array) - assert(result[2][:tickets].empty?) + assert(result[2][:tickets].blank?) end diff --git a/test/unit/user_out_of_office_test.rb b/test/unit/user_out_of_office_test.rb index 6d8f68968..1d573bd89 100644 --- a/test/unit/user_out_of_office_test.rb +++ b/test/unit/user_out_of_office_test.rb @@ -14,6 +14,7 @@ class UserOutOfOfficeTest < ActiveSupport::TestCase email: 'user-out_of_office-agent1@example.com', password: 'agentpw', active: true, + out_of_office: false, roles: roles, groups: groups, ) @@ -24,6 +25,7 @@ class UserOutOfOfficeTest < ActiveSupport::TestCase email: 'user-out_of_office-agent2@example.com', password: 'agentpw', active: true, + out_of_office: false, roles: roles, groups: groups, ) @@ -34,6 +36,7 @@ class UserOutOfOfficeTest < ActiveSupport::TestCase email: 'user-out_of_office-agent3@example.com', password: 'agentpw', active: true, + out_of_office: false, roles: roles, groups: groups, ) @@ -99,6 +102,9 @@ class UserOutOfOfficeTest < ActiveSupport::TestCase travel 2.days assert(@agent1.out_of_office?) + assert(@agent1.out_of_office_agent_of.blank?) + assert_equal(1, @agent2.out_of_office_agent_of.count) + assert_equal(@agent1.id, @agent2.out_of_office_agent_of[0].id) travel 1.day @@ -116,6 +122,9 @@ class UserOutOfOfficeTest < ActiveSupport::TestCase assert_not(@agent2.out_of_office_agent) + assert_equal(0, @agent1.out_of_office_agent_of.count) + assert_equal(0, @agent2.out_of_office_agent_of.count) + @agent2.out_of_office = true @agent2.out_of_office_start_at = Time.zone.now @agent2.out_of_office_end_at = Time.zone.now + 4.days @@ -126,6 +135,23 @@ class UserOutOfOfficeTest < ActiveSupport::TestCase assert_equal(@agent2.out_of_office_agent.id, @agent3.id) + assert_equal(0, @agent1.out_of_office_agent_of.count) + assert_equal(0, @agent2.out_of_office_agent_of.count) + assert_equal(1, @agent3.out_of_office_agent_of.count) + assert_equal(@agent2.id, @agent3.out_of_office_agent_of[0].id) + + travel 4.days + + assert_equal(0, @agent1.out_of_office_agent_of.count) + assert_equal(0, @agent2.out_of_office_agent_of.count) + assert_equal(1, @agent3.out_of_office_agent_of.count) + assert_equal(@agent2.id, @agent3.out_of_office_agent_of[0].id) + + travel 1.day + + assert_equal(0, @agent1.out_of_office_agent_of.count) + assert_equal(0, @agent2.out_of_office_agent_of.count) + assert_equal(0, @agent3.out_of_office_agent_of.count) end end