Browse Source

Fixed issue #1149 - Trigger: Wrong behaviour for condition "is not" "not set".

Rolf Schmidt 7 years ago
parent
commit
74ebb10d2c
2 changed files with 225 additions and 3 deletions
  1. 3 3
      app/models/ticket.rb
  2. 222 0
      test/unit/ticket_trigger_test.rb

+ 3 - 3
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 (?)"

+ 222 - 0
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 <b>note</b>\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 <b>note</b>\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',