Просмотр исходного кода

Fixed issue #779 - Simple triggers resulting in error condition. Fixed issue #395 - Auto-assign ticket owner on first reply. Fixed issue #389 - Trigger action "Owner" -> "not changed" needed. Fixed issue #298 - trigger "set to public" requested.

Martin Edenhofer 8 лет назад
Родитель
Сommit
5a63106958

+ 1 - 0
app/models/observer/transaction.rb

@@ -58,6 +58,7 @@ class Observer::Transaction < ActiveRecord::Observer
     rescue => e
       Rails.logger.error 'ERROR: ' + backend.inspect
       Rails.logger.error 'ERROR: ' + e.inspect
+      Rails.logger.error e.backtrace.inspect
     end
   end
 

+ 12 - 2
app/models/ticket.rb

@@ -652,11 +652,11 @@ condition example
 
 perform changes on ticket
 
-  ticket.perform_changes({}, 'trigger', item)
+  ticket.perform_changes({}, 'trigger', item, current_user_id)
 
 =end
 
-  def perform_changes(perform, perform_origin, item = nil)
+  def perform_changes(perform, perform_origin, item = nil, current_user_id = nil)
     logger.debug "Perform #{perform_origin} #{perform.inspect} on Ticket.find(#{id})"
     changed = false
     perform.each do |key, value|
@@ -785,6 +785,16 @@ perform changes on ticket
         next
       end
 
+      # lookup pre_condition
+      if value['pre_condition']
+        if value['pre_condition'] =~ /^not_set/
+          value['value'] = 1
+        elsif value['pre_condition'] =~ /^current_user\./
+          raise 'Unable to use current_user, got no current_user_id for ticket.perform_changes' if !current_user_id
+          value['value'] = current_user_id
+        end
+      end
+
       # update ticket
       next if self[attribute].to_s == value['value'].to_s
       changed = true

+ 64 - 52
app/models/transaction/trigger.rb

@@ -29,7 +29,11 @@ class Transaction::Trigger
 
     return if @item[:object] != 'Ticket'
 
-    triggers = Trigger.where(active: true).order('LOWER(name)')
+    triggers = if Rails.configuration.db_case_sensitive
+                 Trigger.where(active: true).order('LOWER(name)')
+               else
+                 Trigger.where(active: true).order(:name)
+               end
     return if triggers.empty?
 
     ticket = Ticket.lookup(id: @item[:object_id])
@@ -44,58 +48,79 @@ class Transaction::Trigger
       triggers.each { |trigger|
         condition = trigger.condition
 
-        # check action
-        if condition['ticket.action']
-          next if condition['ticket.action']['operator'] == 'is' && condition['ticket.action']['value'] != @item[:type]
-          next if condition['ticket.action']['operator'] != 'is' && condition['ticket.action']['value'] == @item[:type]
-          condition.delete('ticket.action')
+        # check if one article attribute is used
+        one_has_changed_done = false
+        article_selector = false
+        trigger.condition.each do |key, _value|
+          (object_name, attribute) = key.split('.', 2)
+          next if object_name != 'article'
+          next if attribute == 'id'
+          article_selector = true
         end
-
-        # check action
-        if condition['article.action']
-          next if !article
-          condition.delete('article.action')
+        if article && article_selector
+          one_has_changed_done = true
+        end
+        if article && @item[:type] == 'update'
+          one_has_changed_done = true
         end
 
-        # check "has changed" options
-        has_changed_condition_exists = false
-        has_changed = false
+        # check ticket "has changed" options
+        has_changed_done = true
         condition.each do |key, value|
           next if !value
           next if !value['operator']
           next if !value['operator']['has changed']
-          has_changed_condition_exists = true
 
-          # next if has changed? && !@item[:changes][attribute]
+          # remove condition item, because it has changed
           (object_name, attribute) = key.split('.', 2)
+          next if object_name != 'ticket'
+          next if !@item[:changes]
+          next if !@item[:changes].key?(attribute)
+          condition.delete(key)
+          one_has_changed_done = true
+        end
 
-          # remove condition item, because it has changed
-          if @item[:changes][attribute]
-            has_changed = true
-            condition.delete(key)
-            next
-          end
+        # check if we have not matching "has changed" attributes
+        condition.each do |_key, value|
+          next if !value
+          next if !value['operator']
+          next if !value['operator']['has changed']
+          has_changed_done = false
           break
         end
 
-        next if has_changed_condition_exists && !has_changed
+        # check ticket action
+        if condition['ticket.action']
+          next if condition['ticket.action']['operator'] == 'is' && condition['ticket.action']['value'] != @item[:type]
+          next if condition['ticket.action']['operator'] != 'is' && condition['ticket.action']['value'] == @item[:type]
+          condition.delete('ticket.action')
+        end
+        next if !has_changed_done
+
+        # check in min one attribute of condition has changed on update
+        one_has_changed_condition = false
+        if @item[:type] == 'update'
+
+          # verify if ticket condition exists
+          condition.each do |key, _value|
+            (object_name, attribute) = key.split('.', 2)
+            next if object_name != 'ticket'
+            one_has_changed_condition = true
+            next if !@item[:changes] || !@item[:changes].key?(attribute)
+            one_has_changed_done = true
+            break
+          end
+          next if one_has_changed_condition && !one_has_changed_done
+        end
 
-        # check if selector is matching
+        # check if ticket selector is matching
         condition['ticket.id'] = {
           operator: 'is',
           value: ticket.id,
         }
-
-        # check if min one article attribute is used
-        article_selector = false
-        trigger.condition.each do |key, _value|
-          (object_name, attribute) = key.split('.', 2)
-          next if object_name != 'article'
-          next if attribute == 'id'
-          article_selector = true
-        end
-
         next if article_selector && !article
+
+        # check if article selector is matching
         if article_selector
           condition['article.id'] = {
             operator: 'is',
@@ -103,28 +128,15 @@ class Transaction::Trigger
           }
         end
 
+        # verify is condition is matching
         ticket_count, tickets = Ticket.selectors(condition, 1)
         next if ticket_count.zero?
         next if tickets.first.id != ticket.id
-
-        # check in min one attribute has changed
-        if @item[:type] == 'update' && !article_selector
-          match = false
-          if has_changed_condition_exists && has_changed
-            match = true
-          else
-            trigger.condition.each do |key, _value|
-              (object_name, attribute) = key.split('.', 2)
-              next if object_name != 'ticket'
-              next if !@item[:changes][attribute]
-              match = true
-              break
-            end
-          end
-          next if !match
+        user_id = ticket.updated_by_id
+        if article
+          user_id = article.updated_by_id
         end
-
-        ticket.perform_changes(trigger.perform, 'trigger', @item)
+        ticket.perform_changes(trigger.perform, 'trigger', @item, user_id)
       }
     end
     UserInfo.current_user_id = original_user_id

+ 1 - 0
test/test_helper.rb

@@ -44,6 +44,7 @@ class ActiveSupport::TestCase
 
     # remove background jobs
     Delayed::Job.destroy_all
+    Trigger.destroy_all
     ActivityStream.destroy_all
     PostmasterFilter.destroy_all
     Ticket.destroy_all

+ 1340 - 53
test/unit/ticket_trigger_test.rb

@@ -155,8 +155,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
       title: "some <b>title</b>\n äöüß",
       group: Group.lookup(name: 'Users'),
       customer: User.lookup(email: 'nicole.braun@zammad.org'),
-      state: Ticket::State.lookup(name: 'new'),
-      priority: Ticket::Priority.lookup(name: '2 normal'),
       updated_by_id: 1,
       created_by_id: 1,
     )
@@ -175,6 +173,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
       created_by_id: 1,
     )
 
+    ticket1.reload
     assert_equal('some <b>title</b>  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -184,7 +183,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     Observer::Transaction.commit
 
-    ticket1 = Ticket.lookup(id: ticket1.id)
+    ticket1.reload
     assert_equal('some <b>title</b>  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -200,10 +199,10 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal('text/html', article1.content_type)
 
     ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
-    ticket1.save
-
+    ticket1.save!
     Observer::Transaction.commit
 
+    ticket1.reload
     assert_equal('some <b>title</b>  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -212,10 +211,11 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(%w(aa kk abc), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
 
     ticket1.state = Ticket::State.lookup(name: 'open')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
+    ticket1.reload
     assert_equal('some <b>title</b>  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('open', ticket1.state.name, 'ticket1.state verify')
@@ -224,11 +224,11 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(%w(aa kk abc), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
 
     ticket1.state = Ticket::State.lookup(name: 'new')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
-    ticket1 = Ticket.lookup(id: ticket1.id)
+    ticket1.reload
     assert_equal('some <b>title</b>  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -256,7 +256,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     Observer::Transaction.commit
 
-    ticket2 = Ticket.lookup(id: ticket2.id)
+    ticket2.reload
     assert_equal('some title  äöüß', ticket2.title, 'ticket2.title verify')
     assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
     assert_equal('open', ticket2.state.name, 'ticket2.state verify')
@@ -268,8 +268,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
       title: "some <b>title</b>\n äöüß3",
       group: Group.lookup(name: 'Users'),
       customer: User.lookup(email: 'nicole.braun@zammad.org'),
-      state: Ticket::State.lookup(name: 'new'),
-      priority: Ticket::Priority.lookup(name: '2 normal'),
       updated_by_id: 1,
       created_by_id: 1,
     )
@@ -299,7 +297,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     Observer::Transaction.commit
 
-    ticket3 = Ticket.lookup(id: ticket3.id)
+    ticket3.reload
     assert_equal('some <b>title</b>  äöüß3', ticket3.title, 'ticket3.title verify')
     assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
     assert_equal('new', ticket3.state.name, 'ticket3.state verify')
@@ -337,19 +335,19 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     Observer::Transaction.commit
 
-    ticket3 = Ticket.lookup(id: ticket3.id)
+    ticket3.reload
     assert_equal('some <b>title</b>  äöüß3', ticket3.title, 'ticket3.title verify')
     assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
     assert_equal('new', ticket3.state.name, 'ticket3.state verify')
     assert_equal('3 high', ticket3.priority.name, 'ticket3.priority verify')
     assert_equal(4, ticket3.articles.count, 'ticket3.articles verify')
-    assert_equal(%w(aa kk abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
+    assert_equal(%w(aa abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
 
     Ticket::Article.create(
       ticket_id: ticket3.id,
       from: 'some_sender@example.com',
       to: 'some_recipient@example.com',
-      subject: 'some subject 1234',
+      subject: 'some subject NOT 1234',
       message_id: 'some@id',
       content_type: 'text/html',
       body: 'some message <b>note</b><br>new line',
@@ -362,15 +360,38 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     Observer::Transaction.commit
 
-    ticket3 = Ticket.lookup(id: ticket3.id)
+    ticket3.reload
     assert_equal('some <b>title</b>  äöüß3', ticket3.title, 'ticket3.title verify')
     assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
     assert_equal('new', ticket3.state.name, 'ticket3.state verify')
     assert_equal('3 high', ticket3.priority.name, 'ticket3.priority verify')
     assert_equal(5, ticket3.articles.count, 'ticket3.articles verify')
-    assert_equal(%w(aa kk abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
+    assert_equal(%w(aa abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
+
+    Ticket::Article.create(
+      ticket_id: ticket3.id,
+      from: 'some_sender@example.com',
+      to: 'some_recipient@example.com',
+      subject: 'some subject 1234',
+      message_id: 'some@id',
+      content_type: 'text/html',
+      body: 'some message <b>note</b><br>new 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
 
-    Trigger.destroy_all
+    ticket3.reload
+    assert_equal('some <b>title</b>  äöüß3', ticket3.title, 'ticket3.title verify')
+    assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
+    assert_equal('new', ticket3.state.name, 'ticket3.state verify')
+    assert_equal('3 high', ticket3.priority.name, 'ticket3.priority verify')
+    assert_equal(7, ticket3.articles.count, 'ticket3.articles verify')
+    assert_equal(%w(aa abc article_create_trigger), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
   end
 
   test '2 actions - create' do
@@ -406,8 +427,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
       title: "some title\n äöüß",
       group: Group.lookup(name: 'Users'),
       customer: User.lookup(email: 'nicole.braun@zammad.org'),
-      state: Ticket::State.lookup(name: 'new'),
-      priority: Ticket::Priority.lookup(name: '2 normal'),
       updated_by_id: 1,
       created_by_id: 1,
     )
@@ -421,7 +440,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     Observer::Transaction.commit
 
-    ticket1 = Ticket.lookup(id: ticket1.id)
+    ticket1.reload
     assert_equal('some title  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -435,7 +454,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal('text/html', article1.content_type)
 
     ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
@@ -446,7 +465,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
 
     ticket1.state = Ticket::State.lookup(name: 'open')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
@@ -457,18 +476,16 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
 
     ticket1.state = Ticket::State.lookup(name: 'new')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
-    ticket1 = Ticket.lookup(id: ticket1.id)
+    ticket1.reload
     assert_equal('some title  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group 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')
-
-    Trigger.destroy_all
   end
 
   test '2 actions - update' do
@@ -504,8 +521,6 @@ class TicketTriggerTest < ActiveSupport::TestCase
       title: "some title\n äöüß",
       group: Group.lookup(name: 'Users'),
       customer: User.lookup(email: 'nicole.braun@zammad.org'),
-      state: Ticket::State.lookup(name: 'new'),
-      priority: Ticket::Priority.lookup(name: '2 normal'),
       updated_by_id: 1,
       created_by_id: 1,
     )
@@ -519,7 +534,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     Observer::Transaction.commit
 
-    ticket1 = Ticket.lookup(id: ticket1.id)
+    ticket1.reload
     assert_equal('some title  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('new', ticket1.state.name, 'ticket1.state verify')
@@ -527,7 +542,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
 
     ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
@@ -538,7 +553,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
 
     ticket1.state = Ticket::State.lookup(name: 'open')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
@@ -549,25 +564,23 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
 
     ticket1.state = Ticket::State.lookup(name: 'new')
-    ticket1.save
+    ticket1.save!
 
     Observer::Transaction.commit
 
-    ticket1 = Ticket.lookup(id: ticket1.id)
+    ticket1.reload
     assert_equal('some title  äöüß', ticket1.title, 'ticket1.title verify')
     assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
     assert_equal('new', ticket1.state.name, 'ticket1.state verify')
     assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
     assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
-
-    Trigger.destroy_all
   end
 
   test '3 auto replys' do
     roles = Role.where(name: 'Customer')
     customer1 = User.create_or_update(
       login: 'postmaster@example.com',
-      firstname: 'Notification',
+      firstname: 'Trigger',
       lastname: 'Customer1',
       email: 'postmaster@example.com',
       password: 'customerpw',
@@ -579,7 +592,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     )
     customer2 = User.create_or_update(
       login: 'ticket-auto-reply-customer2@example.com',
-      firstname: 'Notification',
+      firstname: 'Trigger',
       lastname: 'Customer2',
       email: 'ticket-auto-reply-customer2@example.com',
       password: 'customerpw',
@@ -711,7 +724,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal('text/html', article_p.content_type)
 
     ticket_p.priority = Ticket::Priority.lookup(name: '2 normal')
-    ticket_p.save
+    ticket_p.save!
     Observer::Transaction.commit
     assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
     assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
@@ -789,7 +802,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal('text/html', article_p.content_type)
 
     ticket_p.state = Ticket::State.lookup(name: 'open')
-    ticket_p.save
+    ticket_p.save!
     article_p = Ticket::Article.create(
       ticket_id: ticket_p.id,
       from: 'some_sender@example.com',
@@ -839,15 +852,13 @@ class TicketTriggerTest < ActiveSupport::TestCase
 
     assert_equal('new', ticket_p.state.name)
     assert_equal(1, ticket_p.articles.count)
-
-    Trigger.destroy_all
   end
 
   test '4 has changed' do
     roles = Role.where(name: 'Customer')
     customer1 = User.create_or_update(
       login: 'postmaster@example.com',
-      firstname: 'Notification',
+      firstname: 'Trigger',
       lastname: 'Customer1',
       email: 'postmaster@example.com',
       password: 'customerpw',
@@ -859,7 +870,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     )
     customer2 = User.create_or_update(
       login: 'ticket-has-changed-customer2@example.com',
-      firstname: 'Notification',
+      firstname: 'Trigger',
       lastname: 'Customer2',
       email: 'ticket-has-changed-customer2@example.com',
       password: 'customerpw',
@@ -925,7 +936,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
     Observer::Transaction.commit
 
     ticket_p.owner = agent1
-    ticket_p.save
+    ticket_p.save!
     Observer::Transaction.commit
     assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
     assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
@@ -991,21 +1002,22 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(1, ticket_p.articles.count)
 
     ticket_p.priority = Ticket::Priority.lookup(name: '1 low')
-    ticket_p.save
+    ticket_p.save!
 
     Observer::Transaction.commit
     assert_equal(1, ticket_p.articles.count)
 
     ticket_p.priority = Ticket::Priority.lookup(name: '3 high')
-    ticket_p.save
+    ticket_p.save!
 
     Observer::Transaction.commit
     assert_equal(1, ticket_p.articles.count)
 
     ticket_p.owner = agent1
-    ticket_p.save
+    ticket_p.save!
 
     Observer::Transaction.commit
+
     assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
     assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
     assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
@@ -1075,19 +1087,19 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(1, ticket_p.articles.count)
 
     ticket_p.priority = Ticket::Priority.lookup(name: '1 low')
-    ticket_p.save
+    ticket_p.save!
 
     Observer::Transaction.commit
     assert_equal(1, ticket_p.articles.count)
 
     ticket_p.priority = Ticket::Priority.lookup(name: '3 high')
-    ticket_p.save
+    ticket_p.save!
 
     Observer::Transaction.commit
     assert_equal(1, ticket_p.articles.count)
 
     ticket_p.owner = agent1
-    ticket_p.save
+    ticket_p.save!
 
     Observer::Transaction.commit
     assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
@@ -1151,12 +1163,1287 @@ class TicketTriggerTest < ActiveSupport::TestCase
     assert_equal(1, ticket_p.articles.count)
 
     ticket_p.owner = agent1
-    ticket_p.save
+    ticket_p.save!
 
     Observer::Transaction.commit
     assert_equal(1, ticket_p.articles.count)
+  end
+
+  test '5 notify owner' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa notify mail',
+      condition: {
+        'ticket.state_id' => {
+          'operator' => 'is',
+          'value' => Ticket::State.all.pluck(:id),
+        },
+        'ticket.action' => {
+          'operator' => 'is',
+          'value' => 'update',
+        },
+      },
+      perform: {
+        'notification.email' => {
+          'body' => 'some lala',
+          'recipient' => 'ticket_owner',
+          'subject' => 'CC NOTE (#{ticket.title})!',
+        },
+      },
+      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,
+    )
+
+    ticket1 = Ticket.create(
+      title: 'test 123',
+      owner: agent,
+      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,
+    )
+
+    assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+    assert_equal('Users', ticket1.group.name, 'ticket1.group 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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    Observer::Transaction.commit
+
+    assert_equal(1, ticket1.articles.count)
+
+    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'),
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+    Observer::Transaction.commit
+
+    assert_equal(3, ticket1.articles.count)
+
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa notify mail 2',
+      condition: {
+        'ticket.state_id' => {
+          'operator' => 'is',
+          'value' => Ticket::State.all.pluck(:id),
+        },
+        'ticket.action' => {
+          'operator' => 'is',
+          'value' => 'update',
+        },
+      },
+      perform: {
+        'notification.email' => {
+          'body' => 'some lala',
+          'recipient' => 'ticket_owner',
+          'subject' => 'CC NOTE (#{ticket.title})!',
+        },
+      },
+      disable_notification: true,
+      active: true,
+      created_by_id: 1,
+      updated_by_id: 1,
+    )
+
+    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'),
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+    Observer::Transaction.commit
+
+    assert_equal(6, ticket1.articles.count)
+  end
+
+  test '6 owner auto assignment' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa auto assignment',
+      condition: {
+        'ticket.owner_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,
+    )
+
+    ticket1 = Ticket.create(
+      title: 'test 123',
+      #owner: agent,
+      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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent.id
+    ticket1.owner_id = 1
+    ticket1.save!
+    Observer::Transaction.commit
+    UserInfo.current_user_id = nil
+
+    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(2, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+  end
+
+  test '7 owner auto assignment' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa auto assignment',
+      condition: {
+        'ticket.owner_id' => {
+          'operator' => 'is',
+          'pre_condition' => 'not_set',
+          'value' => '',
+          'value_completion' => '',
+        },
+        'article.type_id' => {
+          'operator' => 'is',
+          'value' => Ticket::Article::Type.find_by(name: 'note'),
+        },
+        'article.sender_id' => {
+          'operator' => 'is',
+          'value' => Ticket::Article::Sender.find_by(name: 'Agent'),
+        },
+      },
+      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')
+    agent1 = 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,
+    )
+    agent2 = User.create_or_update(
+      login: 'agent@example.com',
+      firstname: 'Trigger',
+      lastname: 'Agent2',
+      email: 'agent@example.com',
+      password: 'agentpw',
+      active: true,
+      roles: roles,
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+
+    ticket1 = Ticket.create(
+      title: 'test 123',
+      #owner: agent,
+      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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent1.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(agent1.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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent1.id
+    ticket1.owner_id = 1
+    ticket1.save!
+    Observer::Transaction.commit
+    UserInfo.current_user_id = nil
+
+    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(2, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent1.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: 'Customer'),
+      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(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(3, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent2.id
+    ticket1.owner_id = agent2.id
+    ticket1.save!
+    Observer::Transaction.commit
+    UserInfo.current_user_id = nil
+
+    assert_equal('test 123', ticket1.title, 'ticket1.title verify')
+    assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
+    assert_equal(agent2.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(3, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent1.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(agent1.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(4, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+  end
+
+  test '8 owner auto assignment' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa auto assignment',
+      condition: {
+        'ticket.owner_id' => {
+          'operator' => 'is',
+          'pre_condition' => 'not_set',
+          'value' => '',
+          'value_completion' => '',
+        },
+        'ticket.priority_id' => {
+          'operator' => 'has changed',
+          'pre_condition' => '',
+          'value' => '2',
+          '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,
+    )
+
+    ticket1 = Ticket.create(
+      title: 'test 123',
+      #owner: agent,
+      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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    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(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(2, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent.id
+    ticket1.priority = Ticket::Priority.find_by(name: '1 low')
+    ticket1.save!
+    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('1 low', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent.id
+    ticket1.owner_id = 1
+    ticket1.save!
+    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(1, ticket1.owner_id, 'ticket1.owner_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('1 low', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent.id
+    ticket1.owner_id = agent.id
+    ticket1.save!
+    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('1 low', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+  end
+
+  test '9 vip priority set' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa vip priority',
+      condition: {
+        'customer.vip' => {
+          'operator' => 'is',
+          'value' => true,
+        },
+      },
+      perform: {
+        'ticket.priority_id' => {
+          'value' => Ticket::Priority.find_by(name: '3 high').id,
+        },
+      },
+      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',
+      owner: agent,
+      customer: customer,
+      group: Group.lookup(name: 'Users'),
+      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,
+    )
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    Observer::Transaction.commit
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    customer.vip = false
+    customer.save!
+
+    ticket2 = Ticket.create(
+      title: 'test 123',
+      owner: agent,
+      customer: customer,
+      group: Group.lookup(name: 'Users'),
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+    Ticket::Article.create(
+      ticket_id: ticket2.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,
+    )
+
+    assert_equal('test 123', ticket2.title, 'ticket2.title verify')
+    assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
+    assert_equal(agent.id, ticket2.owner_id, 'ticket2.owner_id verify')
+    assert_equal(customer.id, ticket2.customer_id, 'ticket2.customer_id verify')
+    assert_equal('new', ticket2.state.name, 'ticket2.state verify')
+    assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
+    assert_equal(1, ticket2.articles.count, 'ticket2.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket2.id))
+
+    Observer::Transaction.commit
+
+    ticket2.reload
+    assert_equal('test 123', ticket2.title, 'ticket2.title verify')
+    assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
+    assert_equal(agent.id, ticket2.owner_id, 'ticket2.owner_id verify')
+    assert_equal(customer.id, ticket2.customer_id, 'ticket2.customer_id verify')
+    assert_equal('new', ticket2.state.name, 'ticket2.state verify')
+    assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
+    assert_equal(1, ticket2.articles.count, 'ticket2.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket2.id))
+
+  end
+
+  test '10 owner auto assignment notify to customer' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa auto assignment',
+      condition: {
+        'ticket.owner_id' => {
+          'operator' => 'has changed',
+          'pre_condition' => '',
+          'value' => '2',
+          'value_completion' => '',
+        },
+      },
+      perform: {
+        'notification.email' => {
+          'body' => 'some lala',
+          'recipient' => 'ticket_customer',
+          'subject' => 'NEW OWNER (#{ticket.title})!',
+        },
+      },
+      disable_notification: true,
+      active: true,
+      created_by_id: 1,
+      updated_by_id: 1,
+    )
+    roles = Role.where(name: 'Agent')
+    agent1 = User.create_or_update(
+      login: 'agent1@example.com',
+      firstname: 'Trigger',
+      lastname: 'Agent1',
+      email: 'agent1@example.com',
+      password: 'agentpw',
+      active: true,
+      roles: roles,
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+    agent2 = User.create_or_update(
+      login: 'agent2@example.com',
+      firstname: 'Trigger',
+      lastname: 'Agent2',
+      email: 'agent2@example.com',
+      password: 'agentpw',
+      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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent1.id
+    ticket1.owner_id = agent1.id
+    ticket1.save!
+    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(agent1.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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent1.id
+    ticket1.owner_id = agent1.id
+    ticket1.save!
+    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(agent1.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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent1.id
+    ticket1.owner_id = agent2.id
+    ticket1.save!
+    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(agent2.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(3, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+  end
+
+  test '11 notify to customer on public note' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa notify to customer on public note',
+      condition: {
+        'article.internal' => {
+          'operator' => 'is',
+          'value' => 'false',
+        },
+        'article.sender_id' => {
+          'operator' => 'is',
+          'value' => Ticket::Article::Sender.lookup(name: 'Agent').id,
+        },
+        'article.type_id' => {
+          'operator' => 'is',
+          'value' => [
+            Ticket::Article::Type.lookup(name: 'note').id,
+          ],
+        },
+      },
+      perform: {
+        'notification.email' => {
+          'body' => 'some lala',
+          'recipient' => 'ticket_customer',
+          'subject' => 'UPDATE (#{ticket.title})!',
+        },
+      },
+      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',
+      owner: agent,
+      customer: customer,
+      group: Group.lookup(name: 'Users'),
+      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
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    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: true,
+      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
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    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
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(5, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    ticket1.priority = Ticket::Priority.find_by(name: '3 high')
+    ticket1.save!
+    article = 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: true,
+      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
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(6, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    article.internal = false
+    article.save!
+    Observer::Transaction.commit
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(6, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    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: true,
+      sender: Ticket::Article::Sender.find_by(name: 'Customer'),
+      type: Ticket::Article::Type.find_by(name: 'note'),
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+    Observer::Transaction.commit
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(7, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+  end
+
+  test '12 notify on owner change' do
+    trigger1 = Trigger.create_or_update(
+      name: 'aaa notify to customer on public note',
+      condition: {
+        'ticket.owner_id' => {
+          'operator' => 'has changed',
+          'pre_condition' => 'current_user.id',
+          'value' => '',
+          'value_completion' => '',
+        }
+      },
+      perform: {
+        'notification.email' => {
+          'body' => 'some lala',
+          'recipient' => 'ticket_customer',
+          'subject' => 'UPDATE (#{ticket.title})!',
+        },
+      },
+      disable_notification: true,
+      active: true,
+      created_by_id: 1,
+      updated_by_id: 1,
+    )
+    Trigger.create_or_update(
+      name: 'auto reply (on new tickets)',
+      condition: {
+        'ticket.action' => {
+          'operator' => 'is',
+          'value' => 'create',
+        },
+        'ticket.state_id' => {
+          'operator' => 'is not',
+          'value' => Ticket::State.lookup(name: 'closed').id,
+        },
+        'article.type_id' => {
+          'operator' => 'is',
+          'value' => [
+            Ticket::Article::Type.lookup(name: 'email').id,
+            Ticket::Article::Type.lookup(name: 'phone').id,
+            Ticket::Article::Type.lookup(name: 'web').id,
+          ],
+        },
+        'article.sender_id' => {
+          'operator' => 'is',
+          'value' => Ticket::Article::Sender.lookup(name: 'Customer').id,
+        },
+      },
+      perform: {
+        'notification.email' => {
+          'body' => '<div>Your request <b>(#{config.ticket_hook}#{ticket.number})</b> has been received and will be reviewed by our support staff.</div>
+    <br/>
+    <div>To provide additional information, please reply to this email or click on the following link (for initial login, please request a new password):
+    <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
+    </div>
+    <br/>
+    <div>Your #{config.product_name} Team</div>
+    <br/>
+    <div><i><a href="https://zammad.com">Zammad</a>, your customer support system</i></div>',
+          'recipient' => 'ticket_customer',
+          'subject' => 'Thanks for your inquiry (#{ticket.title})',
+        },
+      },
+      active: true,
+      created_by_id: 1,
+      updated_by_id: 1,
+    )
+    Trigger.create_or_update(
+      name: 'auto reply (on follow up of tickets)',
+      condition: {
+        'ticket.action' => {
+          'operator' => 'is',
+          'value' => 'update',
+        },
+        'article.sender_id' => {
+          'operator' => 'is',
+          'value' => Ticket::Article::Sender.lookup(name: 'Customer').id,
+        },
+        'article.type_id' => {
+          'operator' => 'is',
+          'value' => [
+            Ticket::Article::Type.lookup(name: 'email').id,
+            Ticket::Article::Type.lookup(name: 'phone').id,
+            Ticket::Article::Type.lookup(name: 'web').id,
+          ],
+        },
+      },
+      perform: {
+        'notification.email' => {
+          'body' => '<div>Your follow up for <b>(#{config.ticket_hook}#{ticket.number})</b> has been received and will be reviewed by our support staff.</div>
+    <br/>
+    <div>To provide additional information, please reply to this email or click on the following link:
+    <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
+    </div>
+    <br/>
+    <div>Your #{config.product_name} Team</div>
+    <br/>
+    <div><i><a href="https://zammad.com">Zammad</a>, your customer support system</i></div>',
+          'recipient' => 'ticket_customer',
+          'subject' => 'Thanks for your follow up (#{ticket.title})',
+        },
+      },
+      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',
+      #owner: agent,
+      customer: customer,
+      group: Group.lookup(name: 'Users'),
+      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: 'Customer'),
+      type: Ticket::Article::Type.find_by(name: 'web'),
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+
+    Observer::Transaction.commit
+
+    ticket1.reload
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_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([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent.id
+    ticket1.owner_id = agent.id
+    ticket1.save!
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    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: 'Customer'),
+      type: Ticket::Article::Type.find_by(name: 'web'),
+      updated_by_id: 1,
+      created_by_id: 1,
+    )
+
+    Observer::Transaction.commit
+
+    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(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(5, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
+
+    UserInfo.current_user_id = agent.id
+    ticket1.owner_id = 1
+    ticket1.save!
+    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(1, ticket1.owner_id, 'ticket1.owner_id verify')
+    assert_equal(customer.id, ticket1.customer_id, 'ticket1.customer_id verify')
+    assert_equal('new', ticket1.state.name, 'ticket1.state verify')
+    assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
+    assert_equal(6, ticket1.articles.count, 'ticket1.articles verify')
+    assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
 
-    Trigger.destroy_all
   end
 
 end