Improved tests for out of office feature and related controllers.
This commit is contained in:
parent
d6bae448db
commit
003d60d6b1
21 changed files with 679 additions and 135 deletions
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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 },
|
||||
]
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
58
db/migrate/20170910000002_out_of_office.rb
Normal file
58
db/migrate/20170910000002_out_of_office.rb
Normal file
|
@ -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
|
|
@ -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',
|
||||
|
|
|
@ -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 <new_customer_by_agent@example.com>", 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 <new_customer_by_agent@example.com>", result[0]['label'])
|
||||
assert_equal("Customer#{firstname} Customer Last <new_customer_by_agent@example.com>", 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 <new_customer_by_agent@example.com>", result[0]['label'])
|
||||
assert_equal("Customer#{firstname} Customer Last <new_customer_by_agent@example.com>", result[0]['value'])
|
||||
assert_not(result[0]['role_ids'])
|
||||
assert_not(result[0]['roles'])
|
||||
end
|
||||
|
||||
test 'user index and create with customer1' do
|
||||
|
|
|
@ -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'])
|
||||
|
|
321
test/unit/ticket_overview_out_of_office_test.rb
Normal file
321
test/unit/ticket_overview_out_of_office_test.rb
Normal file
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue