Improved auto seen feature for online notifications.

This commit is contained in:
Martin Edenhofer 2016-02-22 08:58:33 +01:00
parent c43274e518
commit 57b1f3409e
7 changed files with 471 additions and 365 deletions

View file

@ -48,11 +48,11 @@ curl http://localhost/api/v1/online_notifications.json -v -u #{login}:#{password
def index
if params[:full]
render json: OnlineNotification.list_full(current_user, 75)
render json: OnlineNotification.list_full(current_user, 100)
return
end
notifications = OnlineNotification.list(current_user, 75)
notifications = OnlineNotification.list(current_user, 100)
model_index_render_result(notifications)
end

View file

@ -2,6 +2,15 @@
class Observer::Ticket::Notification::BackgroundJob
def initialize(params, via_web = false)
=begin
:type => 'update',
:ticket_id => 123,
:changes => {
'attribute1' => [before,now],
'attribute2' => [before,now],
}
=end
@p = params
@via_web = via_web
end
@ -141,13 +150,19 @@ class Observer::Ticket::Notification::BackgroundJob
used_channels = []
if channels['online']
used_channels.push 'online'
seen = ticket.online_notification_seen_state(user.id)
# delete old notifications
if @p[:type] == 'reminder_reached' || @p[:type] == 'escalation'
seen = false
OnlineNotification.remove_by_type('Ticket', ticket.id, @p[:type])
# on updates without state changes create unseen messages
elsif @p[:type] != 'create' && (!@p[:changes] || @p[:changes].empty? || !@p[:changes]['state_id'])
seen = false
else
seen = ticket.online_notification_seen_state(user.id)
end
OnlineNotification.add(
type: @p[:type],
object: 'Ticket',

View file

@ -18,6 +18,11 @@ class Observer::Ticket::OnlineNotificationSeen < ActiveRecord::Observer
# return if we run import mode
return if Setting.get('import_mode')
# set seen only if state has changes
return if !record.changes
return if record.changes.empty?
return if !record.changes['state_id']
# check if existing online notifications for this ticket should be set to seen
return true if !record.online_notification_seen_state

View file

@ -44,9 +44,9 @@ add a new online notification for this user
seen: data[:seen],
user_id: data[:user_id],
created_by_id: data[:created_by_id],
updated_by_id: data[:updated_by_id],
created_at: data[:created_at],
updated_at: data[:updated_at],
updated_by_id: data[:updated_by_id] || data[:created_by_id],
created_at: data[:created_at] || Time.zone.now,
updated_at: data[:updated_at] || Time.zone.now,
}
OnlineNotification.create(record)
@ -205,6 +205,53 @@ returns:
=begin
check if all notifications are seed for dedecated object
OnlineNotification.all_seen?('Ticket', 123)
returns:
true # false
=end
def self.all_seen?(object, o_id)
notifications = OnlineNotification.list_by_object(object, o_id)
notifications.each {|onine_notification|
return false if !onine_notification['seen']
}
true
end
=begin
check if notification was created for certain user
OnlineNotification.exists?(for_user, object, o_id, type, created_by_user, seen)
returns:
true # false
=end
# rubocop:disable Metrics/ParameterLists
def self.exists?(user, object, o_id, type, created_by_user, seen)
# rubocop:enable Metrics/ParameterLists
notifications = OnlineNotification.list(user, 10)
notifications.each {|notification|
next if notification['o_id'] != o_id
next if notification['object'] != object
next if notification['type'] != type
next if notification['created_by_id'] != created_by_user.id
next if notification['seen'] != seen
return true
}
false
end
=begin
cleanup old online notifications
OnlineNotification.cleanup

View file

@ -167,6 +167,31 @@ module NotificationFactory
)
end
=begin
get count of already sent notifications
count = NotificationFactory.already_sent?(ticket, recipient_user, type)
retunes
8
=end
def self.already_sent?(ticket, recipient, type)
result = ticket.history_get()
count = 0
result.each {|item|
next if item['type'] != 'notification'
next if item['object'] != 'Ticket'
next if item['value_to'] !~ /#{recipient.email}/i
next if item['value_to'] !~ /#{type}/i
count += 1
}
count
end
=begin
result = NotificationFactory.template(

View file

@ -30,294 +30,345 @@ class OnlineNotificationTest < ActiveSupport::TestCase
)
customer_user = User.lookup(email: 'nicole.braun@zammad.org')
Rails.configuration.webserver_is_active = true
test 'ticket notification' do
tests = [
# test 1
{
create: {
ticket: {
group_id: Group.lookup( name: 'Users' ).id,
customer_id: customer_user.id,
owner_id: User.lookup( login: '-' ).id,
title: 'Unit Test 1 (äöüß)!',
state_id: Ticket::State.lookup( name: 'closed' ).id,
priority_id: Ticket::Priority.lookup( name: '2 normal' ).id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
},
article: {
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
type_id: Ticket::Article::Type.lookup( name: 'phone' ).id,
sender_id: Ticket::Article::Sender.lookup( name: 'Customer' ).id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false
},
online_notification: {
seen_only_exists: true,
},
},
update: {
ticket: {
title: 'Unit Test 1 (äöüß) - update!',
state_id: Ticket::State.lookup( name: 'open' ).id,
priority_id: Ticket::Priority.lookup( name: '1 low' ).id,
updated_by_id: customer_user.id,
},
online_notification: {
seen_only_exists: false,
},
},
check: [
{
type: 'create',
object: 'Ticket',
created_by_id: agent_user1.id,
},
{
type: 'update',
object: 'Ticket',
created_by_id: customer_user.id,
},
],
},
# case #1
ticket1 = Ticket.create(
group_id: Group.lookup(name: 'Users').id,
customer_id: customer_user.id,
owner_id: User.lookup(login: '-').id,
title: 'Unit Test 1 (äöüß)!',
state_id: Ticket::State.lookup(name: 'closed').id,
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
)
article1 = Ticket::Article.create(
ticket_id: ticket1.id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
type_id: Ticket::Article::Type.lookup(name: 'phone').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false
)
# test 2
{
create: {
ticket: {
group_id: Group.lookup( name: 'Users' ).id,
customer_id: customer_user.id,
owner_id: User.lookup( login: '-' ).id,
title: 'Unit Test 2 (äöüß)!',
state_id: Ticket::State.lookup( name: 'new' ).id,
priority_id: Ticket::Priority.lookup( name: '2 normal' ).id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
},
article: {
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
type_id: Ticket::Article::Type.lookup( name: 'phone' ).id,
sender_id: Ticket::Article::Sender.lookup( name: 'Customer' ).id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false
},
online_notification: {
seen_only_exists: false,
},
},
update: {
ticket: {
title: 'Unit Test 2 (äöüß) - update!',
state_id: Ticket::State.lookup( name: 'closed' ).id,
priority_id: Ticket::Priority.lookup( name: '1 low' ).id,
updated_by_id: customer_user.id,
},
online_notification: {
seen_only_exists: true,
},
},
check: [
{
type: 'create',
object: 'Ticket',
created_by_id: agent_user1.id,
},
{
type: 'update',
object: 'Ticket',
created_by_id: customer_user.id,
},
],
},
# test 3
{
create: {
ticket: {
group_id: Group.lookup( name: 'Users' ).id,
customer_id: customer_user.id,
owner_id: User.lookup( login: '-' ).id,
title: 'Unit Test 3 (äöüß)!',
state_id: Ticket::State.lookup( name: 'new' ).id,
priority_id: Ticket::Priority.lookup( name: '2 normal' ).id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
},
article: {
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
type_id: Ticket::Article::Type.lookup( name: 'phone' ).id,
sender_id: Ticket::Article::Sender.lookup( name: 'Customer' ).id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false
},
online_notification: {
seen_only_exists: false,
},
},
update: {
ticket: {
title: 'Unit Test 3 (äöüß) - update!',
state_id: Ticket::State.lookup( name: 'open' ).id,
priority_id: Ticket::Priority.lookup( name: '1 low' ).id,
updated_by_id: customer_user.id,
},
online_notification: {
seen_only_exists: false,
},
},
check: [
{
type: 'create',
object: 'Ticket',
created_by_id: agent_user1.id,
},
{
type: 'update',
object: 'Ticket',
created_by_id: customer_user.id,
},
],
},
# test 4
{
create: {
ticket: {
group_id: Group.lookup( name: 'Users' ).id,
customer_id: customer_user.id,
owner_id: User.lookup( login: '-' ).id,
title: 'Unit Test 4 (äöüß)!',
state_id: Ticket::State.lookup( name: 'new' ).id,
priority_id: Ticket::Priority.lookup( name: '2 normal' ).id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
},
article: {
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
type_id: Ticket::Article::Type.lookup( name: 'phone' ).id,
sender_id: Ticket::Article::Sender.lookup( name: 'Customer' ).id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false
},
online_notification: {
seen_only_exists: false,
},
},
update: {
ticket: {
title: 'Unit Test 4 (äöüß) - update!',
state_id: Ticket::State.lookup( name: 'open' ).id,
priority_id: Ticket::Priority.lookup( name: '1 low' ).id,
updated_by_id: customer_user.id,
},
online_notification: {
seen_only_exists: false,
},
},
check: [
{
type: 'create',
object: 'Ticket',
created_by_id: agent_user1.id,
},
{
type: 'update',
object: 'Ticket',
created_by_id: customer_user.id,
},
],
},
]
# remember ticket
tickets = []
tests.each { |test|
tickets.push ticket1
ticket = Ticket.create( test[:create][:ticket] )
test[:check][0][:o_id] = ticket.id
test[:check][1][:o_id] = ticket.id
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
test[:create][:article][:ticket_id] = ticket.id
article = Ticket::Article.create( test[:create][:article] )
# because it's already closed
assert(OnlineNotification.all_seen?('Ticket', ticket1.id))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket1.id, 'create', agent_user1, false))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket1.id, 'create', agent_user1, true))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket1.id, 'create', agent_user1, false))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket1.id, 'create', agent_user1, true))
assert_equal( ticket.class.to_s, 'Ticket' )
ticket1.update_attributes(
title: 'Unit Test 1 (äöüß) - update!',
state_id: Ticket::State.lookup(name: 'open').id,
priority_id: Ticket::Priority.lookup(name: '1 low').id,
updated_by_id: customer_user.id,
)
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# check online notifications
if test[:create][:online_notification]
if test[:create][:online_notification][:seen_only_exists]
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( notification_seen_only_exists_exists( notifications ), 'not seen notifications for ticket available')
else
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( !notification_seen_only_exists_exists( notifications ), 'seen notifications for ticket available')
end
end
# because it's already open
assert(!OnlineNotification.all_seen?('Ticket', ticket1.id))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket1.id, 'update', customer_user, true))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket1.id, 'update', customer_user, false))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket1.id, 'update', customer_user, true))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket1.id, 'update', customer_user, false))
# update ticket
if test[:update][:ticket]
ticket.update_attributes( test[:update][:ticket] )
end
# case #2
ticket2 = Ticket.create(
group_id: Group.lookup(name: 'Users').id,
customer_id: customer_user.id,
owner_id: agent_user1.id,
title: 'Unit Test 1 (äöüß)!',
state_id: Ticket::State.lookup(name: 'closed').id,
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
updated_by_id: customer_user.id,
created_by_id: customer_user.id,
)
article2 = Ticket::Article.create(
ticket_id: ticket2.id,
updated_by_id: customer_user.id,
created_by_id: customer_user.id,
type_id: Ticket::Article::Type.lookup(name: 'phone').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false
)
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# remember ticket
tickets = []
tickets.push ticket2
# remember ticket
tickets.push ticket
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# check online notifications
notification_check( OnlineNotification.list(agent_user2, 10), test[:check] )
# because it's already closed
assert(!OnlineNotification.all_seen?('Ticket', ticket2.id))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket2.id, 'create', customer_user, false))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket2.id, 'create', customer_user, true))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket2.id, 'create', customer_user, false))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket2.id, 'create', customer_user, true))
# check online notifications
next if !test[:update][:online_notification]
ticket2.update_attributes(
title: 'Unit Test 1 (äöüß) - update!',
state_id: Ticket::State.lookup(name: 'open').id,
priority_id: Ticket::Priority.lookup(name: '1 low').id,
updated_by_id: customer_user.id,
)
if test[:update][:online_notification][:seen_only_exists]
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( notification_seen_only_exists_exists( notifications ), 'not seen notifications for ticket available')
else
notifications = OnlineNotification.list_by_object( 'Ticket', ticket.id )
assert( !notification_seen_only_exists_exists( notifications ), 'seen notifications for ticket available')
end
}
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already open
assert(!OnlineNotification.all_seen?('Ticket', ticket2.id))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket2.id, 'update', customer_user, false))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket2.id, 'update', customer_user, true))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket2.id, 'update', customer_user, true))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket2.id, 'update', customer_user, false))
# case #3
ticket3 = Ticket.create(
group_id: Group.lookup(name: 'Users').id,
customer_id: customer_user.id,
owner_id: User.lookup(login: '-').id,
title: 'Unit Test 2 (äöüß)!',
state_id: Ticket::State.lookup(name: 'new').id,
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
)
article3 = Ticket::Article.create(
ticket_id: ticket3.id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
type_id: Ticket::Article::Type.lookup(name: 'phone').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false,
)
# remember ticket
tickets.push ticket3
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already new
assert(!OnlineNotification.all_seen?('Ticket', ticket3.id))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket3.id, 'create', agent_user1, false))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket3.id, 'create', agent_user1, true))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket3.id, 'create', agent_user1, false))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket3.id, 'create', agent_user1, true))
ticket3.update_attributes(
title: 'Unit Test 2 (äöüß) - update!',
state_id: Ticket::State.lookup(name: 'closed').id,
priority_id: Ticket::Priority.lookup(name: '1 low').id,
updated_by_id: customer_user.id,
)
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already closed
assert(OnlineNotification.all_seen?('Ticket', ticket3.id))
assert_equal(1, NotificationFactory.already_sent?(ticket3, agent_user1, 'update'))
assert_equal(1, NotificationFactory.already_sent?(ticket3, agent_user2, 'update'))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket3.id, 'update', customer_user, false))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket3.id, 'update', customer_user, true))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket3.id, 'update', customer_user, false))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket3.id, 'update', customer_user, true))
article3 = Ticket::Article.create(
ticket_id: ticket3.id,
updated_by_id: customer_user.id,
created_by_id: customer_user.id,
type_id: Ticket::Article::Type.lookup(name: 'phone').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123 # 2',
internal: false
)
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already closed but an follow up arrived later
assert(!OnlineNotification.all_seen?('Ticket', ticket3.id))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket3.id, 'update', customer_user, false))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket3.id, 'update', customer_user, true))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket3.id, 'update', customer_user, false))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket3.id, 'update', customer_user, true))
assert_equal(2, NotificationFactory.already_sent?(ticket3, agent_user1, 'update'))
assert_equal(2, NotificationFactory.already_sent?(ticket3, agent_user2, 'update'))
# case #4
ticket4 = Ticket.create(
group_id: Group.lookup(name: 'Users').id,
customer_id: customer_user.id,
owner_id: agent_user1.id,
title: 'Unit Test 3 (äöüß)!',
state_id: Ticket::State.lookup(name: 'new').id,
priority_id: Ticket::Priority.lookup(name: '2 normal').id,
updated_by_id: customer_user.id,
created_by_id: customer_user.id,
)
article4 = Ticket::Article.create(
ticket_id: ticket4.id,
updated_by_id: customer_user.id,
created_by_id: customer_user.id,
type_id: Ticket::Article::Type.lookup(name: 'phone').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false,
)
# remember ticket
tickets.push ticket4
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already new
assert(!OnlineNotification.all_seen?('Ticket', ticket4.id))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket4.id, 'create', customer_user, false))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket4.id, 'create', customer_user, true))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket4.id, 'create', customer_user, false))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket4.id, 'create', customer_user, true))
ticket4.update_attributes(
title: 'Unit Test 3 (äöüß) - update!',
state_id: Ticket::State.lookup(name: 'open').id,
priority_id: Ticket::Priority.lookup(name: '1 low').id,
updated_by_id: customer_user.id,
)
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already open
assert(!OnlineNotification.all_seen?('Ticket', ticket4.id))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket4.id, 'update', customer_user, false))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket4.id, 'update', customer_user, true))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket4.id, 'update', customer_user, false))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket4.id, 'update', customer_user, true))
# case #5
ticket5 = Ticket.create(
group_id: Group.lookup(name: 'Users').id,
customer_id: customer_user.id,
owner_id: User.lookup(login: '-').id,
title: 'Unit Test 4 (äöüß)!',
state_id: Ticket::State.lookup(name: 'new').id,
priority_id: Ticket::Priority.lookup( name: '2 normal').id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
)
article5 = Ticket::Article.create(
ticket_id: ticket5.id,
updated_by_id: agent_user1.id,
created_by_id: agent_user1.id,
type_id: Ticket::Article::Type.lookup(name: 'phone').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id,
from: 'Unit Test <unittest@example.com>',
body: 'Unit Test 123',
internal: false,
)
# remember ticket
tickets.push ticket5
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already new
assert(!OnlineNotification.all_seen?('Ticket', ticket5.id))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket5.id, 'create', agent_user1, true))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket5.id, 'create', agent_user1, false))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket5.id, 'create', agent_user1, false))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket5.id, 'create', agent_user1, true))
ticket5.update_attributes(
title: 'Unit Test 4 (äöüß) - update!',
state_id: Ticket::State.lookup(name: 'open').id,
priority_id: Ticket::Priority.lookup(name: '1 low').id,
updated_by_id: customer_user.id,
)
# execute ticket events
Observer::Ticket::Notification.transaction
#puts Delayed::Job.all.inspect
Delayed::Worker.new.work_off
# because it's already open
assert(!OnlineNotification.all_seen?('Ticket', ticket5.id))
assert(OnlineNotification.exists?(agent_user1, 'Ticket', ticket5.id, 'update', customer_user, false))
assert(!OnlineNotification.exists?(agent_user1, 'Ticket', ticket5.id, 'update', customer_user, true))
assert(OnlineNotification.exists?(agent_user2, 'Ticket', ticket5.id, 'update', customer_user, false))
assert(!OnlineNotification.exists?(agent_user2, 'Ticket', ticket5.id, 'update', customer_user, true))
# merge tickets - also remove notifications of merged tickets
tickets[2].merge_to(
ticket_id: tickets[3].id,
tickets[0].merge_to(
ticket_id: tickets[1].id,
user_id: 1,
)
Delayed::Worker.new.work_off
notifications = OnlineNotification.list_by_object( 'Ticket', tickets[2].id )
assert( !notifications.empty?, 'should have notifications')
assert( notification_seen_only_exists_exists(notifications), 'still not seen notifications for merged ticket available')
notifications = OnlineNotification.list_by_object( 'Ticket', tickets[3].id )
assert( !notifications.empty?, 'should have notifications')
assert( !notification_seen_only_exists_exists(notifications), 'no notifications for master ticket available')
notifications = OnlineNotification.list_by_object('Ticket', tickets[0].id)
assert(!notifications.empty?, 'should have notifications')
assert(OnlineNotification.all_seen?('Ticket', tickets[0].id), 'still not seen notifications for merged ticket available')
notifications = OnlineNotification.list_by_object('Ticket', tickets[1].id)
assert(!notifications.empty?, 'should have notifications')
assert(!OnlineNotification.all_seen?('Ticket', tickets[1].id), 'no notifications for master ticket available')
# delete tickets
tickets.each { |ticket|
ticket_id = ticket.id
ticket.destroy
found = Ticket.where( id: ticket_id ).first
assert( !found, 'Ticket destroyed')
found = Ticket.find_by(id: ticket_id)
assert(!found, 'Ticket destroyed')
# check if notifications for ticket still exist
Delayed::Worker.new.work_off
notifications = OnlineNotification.list_by_object( 'Ticket', ticket_id )
assert( notifications.empty?, 'still notifications for destroyed ticket available')
notifications = OnlineNotification.list_by_object('Ticket', ticket_id)
assert(notifications.empty?, 'still notifications for destroyed ticket available')
}
end
@ -325,7 +376,7 @@ class OnlineNotificationTest < ActiveSupport::TestCase
ticket1 = Ticket.create(
title: 'some title',
group: Group.lookup(name: 'Users'),
customer_id: 2,
customer_id: customer_user.id,
state: Ticket::State.lookup(name: 'new'),
priority: Ticket::Priority.lookup(name: '2 normal'),
updated_by_id: 1,
@ -531,29 +582,4 @@ class OnlineNotificationTest < ActiveSupport::TestCase
OnlineNotification.destroy_all
end
def notification_check(online_notifications, checks)
checks.each { |check_item|
hit = false
online_notifications.each {|onine_notification|
next if onine_notification['o_id'] != check_item[:o_id]
next if onine_notification['object'] != check_item[:object]
next if onine_notification['type'] != check_item[:type]
next if onine_notification['created_by_id'] != check_item[:created_by_id]
hit = true
break
}
#puts "--- #{online_notifications.inspect}"
assert( hit, "online notification exists not #{check_item.inspect}" )
}
end
def notification_seen_only_exists_exists(online_notifications)
online_notifications.each {|onine_notification|
return false if !onine_notification['seen']
}
true
end
end

View file

@ -92,8 +92,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(1, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(1, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
# create ticket in group
ticket1 = Ticket.create(
@ -127,8 +127,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(0, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(0, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
end
test 'ticket notification - simple' do
@ -165,8 +165,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(1, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(1, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
# update ticket attributes
ticket1.title = "#{ticket1.title} - #2"
@ -179,8 +179,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(2, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(2, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(2, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(2, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
# add article to ticket
Ticket::Article.create(
@ -201,8 +201,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to not to agent1 but to agent2
assert_equal(2, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(3, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(2, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(3, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
# update ticket by user
ticket1.owner_id = agent1.id
@ -226,8 +226,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to not to agent1 but to agent2
assert_equal(2, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(3, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(2, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(3, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
# create ticket with agent1 as owner
ticket2 = Ticket.create(
@ -261,8 +261,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
assert(ticket2, 'ticket created')
# verify notifications to no one
assert_equal(0, notification_check(ticket2, agent1, 'email'), ticket2.id)
assert_equal(0, notification_check(ticket2, agent2, 'email'), ticket2.id)
assert_equal(0, NotificationFactory.already_sent?(ticket2, agent1, 'email'), ticket2.id)
assert_equal(0, NotificationFactory.already_sent?(ticket2, agent2, 'email'), ticket2.id)
# update ticket
ticket2.title = "#{ticket2.title} - #2"
@ -276,8 +276,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to no one
assert_equal(0, notification_check(ticket2, agent1, 'email'), ticket2.id)
assert_equal(0, notification_check(ticket2, agent2, 'email'), ticket2.id)
assert_equal(0, NotificationFactory.already_sent?(ticket2, agent1, 'email'), ticket2.id)
assert_equal(0, NotificationFactory.already_sent?(ticket2, agent2, 'email'), ticket2.id)
# update ticket
ticket2.title = "#{ticket2.title} - #3"
@ -291,8 +291,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 and not to agent2
assert_equal(1, notification_check(ticket2, agent1, 'email'), ticket2.id)
assert_equal(0, notification_check(ticket2, agent2, 'email'), ticket2.id)
assert_equal(1, NotificationFactory.already_sent?(ticket2, agent1, 'email'), ticket2.id)
assert_equal(0, NotificationFactory.already_sent?(ticket2, agent2, 'email'), ticket2.id)
# create ticket with agent2 and agent1 as owner
ticket3 = Ticket.create(
@ -326,8 +326,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
assert(ticket3, 'ticket created')
# verify notifications to agent1 and not to agent2
assert_equal(1, notification_check(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, notification_check(ticket3, agent2, 'email'), ticket3.id)
assert_equal(1, NotificationFactory.already_sent?(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, NotificationFactory.already_sent?(ticket3, agent2, 'email'), ticket3.id)
# update ticket
ticket3.title = "#{ticket3.title} - #2"
@ -341,8 +341,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to no one
assert_equal(1, notification_check(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, notification_check(ticket3, agent2, 'email'), ticket3.id)
assert_equal(1, NotificationFactory.already_sent?(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, NotificationFactory.already_sent?(ticket3, agent2, 'email'), ticket3.id)
# update ticket
ticket3.title = "#{ticket3.title} - #3"
@ -356,8 +356,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 and not to agent2
assert_equal(2, notification_check(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, notification_check(ticket3, agent2, 'email'), ticket3.id)
assert_equal(2, NotificationFactory.already_sent?(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, NotificationFactory.already_sent?(ticket3, agent2, 'email'), ticket3.id)
# update article / not notification should be sent
article_inbound.internal = true
@ -369,8 +369,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications not to agent1 and not to agent2
assert_equal(2, notification_check(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, notification_check(ticket3, agent2, 'email'), ticket3.id)
assert_equal(2, NotificationFactory.already_sent?(ticket3, agent1, 'email'), ticket3.id)
assert_equal(0, NotificationFactory.already_sent?(ticket3, agent2, 'email'), ticket3.id)
delete = ticket1.destroy
assert(delete, 'ticket1 destroy')
@ -432,8 +432,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(0, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(0, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(1, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
# update ticket attributes
ticket1.title = "#{ticket1.title} - #2"
@ -446,8 +446,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(0, notification_check(ticket1, agent1, 'email'), ticket1.id)
assert_equal(2, notification_check(ticket1, agent2, 'email'), ticket1.id)
assert_equal(0, NotificationFactory.already_sent?(ticket1, agent1, 'email'), ticket1.id)
assert_equal(2, NotificationFactory.already_sent?(ticket1, agent2, 'email'), ticket1.id)
# create ticket in group
ticket2 = Ticket.create(
@ -480,8 +480,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(1, notification_check(ticket2, agent1, 'email'), ticket2.id)
assert_equal(1, notification_check(ticket2, agent2, 'email'), ticket2.id)
assert_equal(1, NotificationFactory.already_sent?(ticket2, agent1, 'email'), ticket2.id)
assert_equal(1, NotificationFactory.already_sent?(ticket2, agent2, 'email'), ticket2.id)
# update ticket attributes
ticket2.title = "#{ticket2.title} - #2"
@ -494,8 +494,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(2, notification_check(ticket2, agent1, 'email'), ticket2.id)
assert_equal(2, notification_check(ticket2, agent2, 'email'), ticket2.id)
assert_equal(2, NotificationFactory.already_sent?(ticket2, agent1, 'email'), ticket2.id)
assert_equal(2, NotificationFactory.already_sent?(ticket2, agent2, 'email'), ticket2.id)
# create ticket in group
ticket3 = Ticket.create(
@ -528,8 +528,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(0, notification_check(ticket3, agent1, 'email'), ticket3.id)
assert_equal(1, notification_check(ticket3, agent2, 'email'), ticket3.id)
assert_equal(0, NotificationFactory.already_sent?(ticket3, agent1, 'email'), ticket3.id)
assert_equal(1, NotificationFactory.already_sent?(ticket3, agent2, 'email'), ticket3.id)
# update ticket attributes
ticket3.title = "#{ticket3.title} - #2"
@ -542,8 +542,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(0, notification_check(ticket3, agent1, 'email'), ticket3.id)
assert_equal(2, notification_check(ticket3, agent2, 'email'), ticket3.id)
assert_equal(0, NotificationFactory.already_sent?(ticket3, agent1, 'email'), ticket3.id)
assert_equal(2, NotificationFactory.already_sent?(ticket3, agent2, 'email'), ticket3.id)
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_me'] = true
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_nobody'] = false
@ -594,8 +594,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(1, notification_check(ticket4, agent1, 'email'), ticket4.id)
assert_equal(1, notification_check(ticket4, agent2, 'email'), ticket4.id)
assert_equal(1, NotificationFactory.already_sent?(ticket4, agent1, 'email'), ticket4.id)
assert_equal(1, NotificationFactory.already_sent?(ticket4, agent2, 'email'), ticket4.id)
# update ticket attributes
ticket4.title = "#{ticket4.title} - #2"
@ -608,8 +608,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(2, notification_check(ticket4, agent1, 'email'), ticket4.id)
assert_equal(2, notification_check(ticket4, agent2, 'email'), ticket4.id)
assert_equal(2, NotificationFactory.already_sent?(ticket4, agent1, 'email'), ticket4.id)
assert_equal(2, NotificationFactory.already_sent?(ticket4, agent2, 'email'), ticket4.id)
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_me'] = true
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_nobody'] = false
@ -660,8 +660,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(1, notification_check(ticket5, agent1, 'email'), ticket5.id)
assert_equal(0, notification_check(ticket5, agent2, 'email'), ticket5.id)
assert_equal(1, NotificationFactory.already_sent?(ticket5, agent1, 'email'), ticket5.id)
assert_equal(0, NotificationFactory.already_sent?(ticket5, agent2, 'email'), ticket5.id)
# update ticket attributes
ticket5.title = "#{ticket5.title} - #2"
@ -674,8 +674,8 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(2, notification_check(ticket5, agent1, 'email'), ticket5.id)
assert_equal(0, notification_check(ticket5, agent2, 'email'), ticket5.id)
assert_equal(2, NotificationFactory.already_sent?(ticket5, agent1, 'email'), ticket5.id)
assert_equal(0, NotificationFactory.already_sent?(ticket5, agent2, 'email'), ticket5.id)
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_me'] = true
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_nobody'] = false
@ -727,10 +727,10 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(1, notification_check(ticket6, agent1, 'email'), ticket6.id)
assert_equal(1, notification_check(ticket6, agent1, 'online'), ticket6.id)
assert_equal(0, notification_check(ticket6, agent2, 'email'), ticket6.id)
assert_equal(0, notification_check(ticket6, agent2, 'online'), ticket6.id)
assert_equal(1, NotificationFactory.already_sent?(ticket6, agent1, 'email'), ticket6.id)
assert_equal(1, NotificationFactory.already_sent?(ticket6, agent1, 'online'), ticket6.id)
assert_equal(0, NotificationFactory.already_sent?(ticket6, agent2, 'email'), ticket6.id)
assert_equal(0, NotificationFactory.already_sent?(ticket6, agent2, 'online'), ticket6.id)
# update ticket attributes
ticket6.title = "#{ticket6.title} - #2"
@ -743,10 +743,10 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(2, notification_check(ticket6, agent1, 'email'), ticket6.id)
assert_equal(2, notification_check(ticket6, agent1, 'online'), ticket6.id)
assert_equal(0, notification_check(ticket6, agent2, 'email'), ticket6.id)
assert_equal(0, notification_check(ticket6, agent2, 'online'), ticket6.id)
assert_equal(2, NotificationFactory.already_sent?(ticket6, agent1, 'email'), ticket6.id)
assert_equal(2, NotificationFactory.already_sent?(ticket6, agent1, 'online'), ticket6.id)
assert_equal(0, NotificationFactory.already_sent?(ticket6, agent2, 'email'), ticket6.id)
assert_equal(0, NotificationFactory.already_sent?(ticket6, agent2, 'online'), ticket6.id)
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_me'] = true
agent1.preferences['notification_config']['matrix']['create']['criteria']['owned_by_nobody'] = false
@ -806,10 +806,10 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(0, notification_check(ticket7, agent1, 'email'), ticket7.id)
assert_equal(1, notification_check(ticket7, agent1, 'online'), ticket7.id)
assert_equal(0, notification_check(ticket7, agent2, 'email'), ticket7.id)
assert_equal(0, notification_check(ticket7, agent2, 'online'), ticket7.id)
assert_equal(0, NotificationFactory.already_sent?(ticket7, agent1, 'email'), ticket7.id)
assert_equal(1, NotificationFactory.already_sent?(ticket7, agent1, 'online'), ticket7.id)
assert_equal(0, NotificationFactory.already_sent?(ticket7, agent2, 'email'), ticket7.id)
assert_equal(0, NotificationFactory.already_sent?(ticket7, agent2, 'online'), ticket7.id)
# update ticket attributes
ticket7.title = "#{ticket7.title} - #2"
@ -822,10 +822,10 @@ class TicketNotificationTest < ActiveSupport::TestCase
Delayed::Worker.new.work_off
# verify notifications to agent1 + agent2
assert_equal(0, notification_check(ticket7, agent1, 'email'), ticket7.id)
assert_equal(2, notification_check(ticket7, agent1, 'online'), ticket7.id)
assert_equal(0, notification_check(ticket7, agent2, 'email'), ticket7.id)
assert_equal(0, notification_check(ticket7, agent2, 'online'), ticket7.id)
assert_equal(0, NotificationFactory.already_sent?(ticket7, agent1, 'email'), ticket7.id)
assert_equal(2, NotificationFactory.already_sent?(ticket7, agent1, 'online'), ticket7.id)
assert_equal(0, NotificationFactory.already_sent?(ticket7, agent2, 'email'), ticket7.id)
assert_equal(0, NotificationFactory.already_sent?(ticket7, agent2, 'online'), ticket7.id)
end
@ -1066,16 +1066,4 @@ class TicketNotificationTest < ActiveSupport::TestCase
end
def notification_check(ticket, recipient, type)
result = ticket.history_get()
count = 0
result.each {|item|
next if item['type'] != 'notification'
next if item['object'] != 'Ticket'
next if item['value_to'] !~ /#{recipient.email}/i
next if item['value_to'] !~ /#{type}/i
count += 1
}
count
end
end