From 74ebb10d2c2b3a39a94e90596b5d725e53ef321c Mon Sep 17 00:00:00 2001 From: Rolf Schmidt Date: Thu, 6 Jul 2017 15:58:10 +0200 Subject: [PATCH] Fixed issue #1149 - Trigger: Wrong behaviour for condition "is not" "not set". --- app/models/ticket.rb | 6 +- test/unit/ticket_trigger_test.rb | 222 +++++++++++++++++++++++++++++++ 2 files changed, 225 insertions(+), 3 deletions(-) diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 6c5537b74..01c8a502e 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -504,7 +504,7 @@ condition example query += "#{attribute} IN (?)" bind_params.push 1 else - query += "#{attribute} IS NOT NULL" + query += "#{attribute} IS NULL" 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 @@ -518,7 +518,7 @@ condition example else # rubocop:disable Style/IfInsideElse if selector['value'].nil? - query += "#{attribute} IS NOT NULL" + query += "#{attribute} IS NULL" else query += "#{attribute} IN (?)" bind_params.push selector['value'] @@ -531,7 +531,7 @@ condition example query += "#{attribute} NOT IN (?)" bind_params.push 1 else - query += "#{attribute} IS NULL" + query += "#{attribute} IS NOT NULL" end elsif selector['pre_condition'] == 'current_user.id' query += "#{attribute} NOT IN (?)" diff --git a/test/unit/ticket_trigger_test.rb b/test/unit/ticket_trigger_test.rb index 7a7d6f628..306630c8a 100644 --- a/test/unit/ticket_trigger_test.rb +++ b/test/unit/ticket_trigger_test.rb @@ -1414,6 +1414,228 @@ class TicketTriggerTest < ActiveSupport::TestCase end + test '6.1 owner auto assignment based on organization' do + trigger1 = Trigger.create_or_update( + name: 'aaa auto assignment', + condition: { + 'ticket.organization_id' => { + 'operator' => 'is not', + 'pre_condition' => 'not_set', + 'value' => '', + 'value_completion' => '', + }, + 'ticket.action' => { + 'operator' => 'is', + 'value' => 'update', + }, + }, + perform: { + 'ticket.owner_id' => { + 'pre_condition' => 'current_user.id', + 'value' => '', + 'value_completion' => '', + }, + }, + disable_notification: true, + active: true, + created_by_id: 1, + updated_by_id: 1, + ) + roles = Role.where(name: 'Agent') + agent = User.create_or_update( + login: 'agent@example.com', + firstname: 'Trigger', + lastname: 'Agent1', + email: 'agent@example.com', + password: 'agentpw', + active: true, + roles: roles, + updated_by_id: 1, + created_by_id: 1, + ) + roles = Role.where(name: 'Customer') + customer = User.create_or_update( + login: 'customer@example.com', + firstname: 'Trigger', + lastname: 'Customer1', + email: 'customer@example.com', + password: 'customerpw', + vip: true, + active: true, + roles: roles, + updated_by_id: 1, + created_by_id: 1, + ) + + ticket1 = Ticket.create( + title: 'test 123', + group: Group.lookup(name: 'Users'), + customer: customer, + updated_by_id: 1, + created_by_id: 1, + ) + 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 note\nnew line", + internal: false, + sender: Ticket::Article::Sender.find_by(name: 'Agent'), + type: Ticket::Article::Type.find_by(name: 'note'), + updated_by_id: 1, + created_by_id: 1, + ) + Observer::Transaction.commit + + assert_equal('test 123', ticket1.title, 'ticket1.title verify') + assert_equal('Users', ticket1.group.name, 'ticket1.group verify') + assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify') + assert_equal('new', ticket1.state.name, 'ticket1.state verify') + assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify') + assert_equal(1, ticket1.articles.count, 'ticket1.articles verify') + assert_equal([], ticket1.tag_list) + + ticket1.update_attribute(:customer, User.lookup(email: 'nicole.braun@zammad.org') ) + + UserInfo.current_user_id = agent.id + Ticket::Article.create( + ticket_id: ticket1.id, + from: 'some_sender@example.com', + to: 'some_recipient@example.com', + subject: 'update', + message_id: 'some@id', + content_type: 'text/html', + body: 'update', + internal: false, + sender: Ticket::Article::Sender.find_by(name: 'Agent'), + type: Ticket::Article::Type.find_by(name: 'note'), + ) + Observer::Transaction.commit + UserInfo.current_user_id = nil + + ticket1.reload + assert_equal('test 123', ticket1.title, 'ticket1.title verify') + assert_equal('Users', ticket1.group.name, 'ticket1.group verify') + assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify') + assert_equal('new', ticket1.state.name, 'ticket1.state verify') + assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify') + assert_equal(2, ticket1.articles.count, 'ticket1.articles verify') + assert_equal([], ticket1.tag_list) + end + + test '6.2 owner auto assignment based on organization' do + trigger1 = Trigger.create_or_update( + name: 'aaa auto assignment', + condition: { + 'ticket.organization_id' => { + 'operator' => 'is', + 'pre_condition' => 'not_set', + 'value' => '', + 'value_completion' => '', + }, + 'ticket.action' => { + 'operator' => 'is', + 'value' => 'update', + }, + }, + perform: { + 'ticket.owner_id' => { + 'pre_condition' => 'current_user.id', + 'value' => '', + 'value_completion' => '', + }, + }, + disable_notification: true, + active: true, + created_by_id: 1, + updated_by_id: 1, + ) + roles = Role.where(name: 'Agent') + agent = User.create_or_update( + login: 'agent@example.com', + firstname: 'Trigger', + lastname: 'Agent1', + email: 'agent@example.com', + password: 'agentpw', + active: true, + roles: roles, + updated_by_id: 1, + created_by_id: 1, + ) + roles = Role.where(name: 'Customer') + customer = User.create_or_update( + login: 'customer@example.com', + firstname: 'Trigger', + lastname: 'Customer1', + email: 'customer@example.com', + password: 'customerpw', + vip: true, + active: true, + roles: roles, + updated_by_id: 1, + created_by_id: 1, + ) + + ticket1 = Ticket.create( + title: 'test 123', + group: Group.lookup(name: 'Users'), + customer: User.lookup(email: 'nicole.braun@zammad.org'), + updated_by_id: 1, + created_by_id: 1, + ) + 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 note\nnew line", + internal: false, + sender: Ticket::Article::Sender.find_by(name: 'Agent'), + type: Ticket::Article::Type.find_by(name: 'note'), + updated_by_id: 1, + created_by_id: 1, + ) + Observer::Transaction.commit + + assert_equal('test 123', ticket1.title, 'ticket1.title verify') + assert_equal('Users', ticket1.group.name, 'ticket1.group verify') + assert_equal(1, ticket1.owner_id, 'ticket1.owner_id verify') + assert_equal('new', ticket1.state.name, 'ticket1.state verify') + assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify') + assert_equal(1, ticket1.articles.count, 'ticket1.articles verify') + assert_equal([], ticket1.tag_list) + + ticket1.update_attribute(:customer, customer ) + + UserInfo.current_user_id = agent.id + Ticket::Article.create( + ticket_id: ticket1.id, + from: 'some_sender@example.com', + to: 'some_recipient@example.com', + subject: 'update', + message_id: 'some@id', + content_type: 'text/html', + body: 'update', + internal: false, + sender: Ticket::Article::Sender.find_by(name: 'Agent'), + type: Ticket::Article::Type.find_by(name: 'note'), + ) + Observer::Transaction.commit + UserInfo.current_user_id = nil + + ticket1.reload + assert_equal('test 123', ticket1.title, 'ticket1.title verify') + assert_equal('Users', ticket1.group.name, 'ticket1.group verify') + assert_equal(agent.id, ticket1.owner_id, 'ticket1.owner_id verify') + assert_equal('new', ticket1.state.name, 'ticket1.state verify') + assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify') + assert_equal(2, ticket1.articles.count, 'ticket1.articles verify') + assert_equal([], ticket1.tag_list) + end + test '7 owner auto assignment' do trigger1 = Trigger.create_or_update( name: 'aaa auto assignment',