#1683 fix trigger with "contains one not" not ignoring the tag(s) set

This commit is contained in:
Muhammad Nuzaihan 2018-01-16 00:49:46 +08:00
parent c2a5c3d9e2
commit 62b3d7ddcb
2 changed files with 197 additions and 3 deletions

View file

@ -711,10 +711,8 @@ condition example
tag_objects.name = 'Ticket' AND
tag_items.id = tags.tag_item_id AND
tag_items.name IN (?)
) BETWEEN ? AND ?"
) BETWEEN 0 AND 0"
bind_params.push selector['value']
bind_params.push selector['value'].count - 1
bind_params.push selector['value'].count
elsif selector['operator'] == 'before (absolute)'
query += "#{attribute} <= ?"
bind_params.push selector['value']

View file

@ -3905,4 +3905,200 @@ class TicketTriggerTest < ActiveSupport::TestCase
end
test 'change owner' do
roles = Role.where(name: 'Agent')
agent1 = User.create_or_update(
login: 'agent-has-changed@example.com',
firstname: 'Has Changed',
lastname: 'Agent1',
email: 'agent-has-changed@example.com',
password: 'agentpw',
active: true,
roles: roles,
updated_at: '2015-02-05 16:37:00',
updated_by_id: 1,
created_by_id: 1,
)
agent2 = User.create_or_update(
login: 'agent-has-changed2@example.com',
firstname: 'Has Changed',
lastname: 'Agent2',
email: 'agent-has-changed2@example.com',
password: 'agentpw',
active: true,
roles: roles,
updated_at: '2015-02-05 16:37:00',
updated_by_id: 1,
created_by_id: 1,
)
# multi tag trigger with changed owner
trigger1 = Trigger.create_or_update(
name: 'change owner',
condition: {
'ticket.owner_id' => {
'operator' => 'has changed',
},
'ticket.tags' => {
'operator' => 'contains one not',
'value' => 'nosendmail test123'
}
},
perform: {
'ticket.tags' => {
'operator' => 'add',
'value' => '123'
},
'notification.email' => {
'body' => 'some lala',
'recipient' => 'ticket_customer',
'subject' => 'Thanks for your inquiry - 1234 check (#{ticket.title})!',
},
},
disable_notification: true,
active: true,
created_by_id: 1,
updated_by_id: 1,
)
# single tag trigger with changed owner
trigger2 = Trigger.create_or_update(
name: 'change owner',
condition: {
'ticket.owner_id' => {
'operator' => 'has changed',
},
'ticket.tags' => {
'operator' => 'contains one not',
'value' => 'nosendmail2',
}
},
perform: {
'ticket.tags' => {
'operator' => 'add',
'value' => '123'
},
'notification.email' => {
'body' => 'some lala',
'recipient' => 'ticket_customer',
'subject' => 'Thanks for your inquiry - 1234 check (#{ticket.title})!',
},
},
disable_notification: true,
active: true,
created_by_id: 1,
updated_by_id: 1,
)
ticket1 = Ticket.create!(
title: "some title\n äöüß",
group: Group.lookup(name: 'Users'),
customer: User.lookup(email: 'nicole.braun@zammad.org'),
updated_by_id: 1,
created_by_id: 1,
)
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(0, ticket1.articles.count, 'ticket1.articles verify')
assert_equal('agent-has-changed@example.com', agent1.login, 'verify agent')
assert_equal([], ticket1.tag_list, 'ticket1.tag_list')
ticket2 = Ticket.create!(
title: "some title\n äöüß",
group: Group.lookup(name: 'Users'),
customer: User.lookup(email: 'nicole.braun@zammad.org'),
updated_by_id: 1,
created_by_id: 1,
)
assert_equal('some title äöüß', ticket2.title, 'ticket1.title verify')
assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
assert_equal('new', ticket2.state.name, 'ticket2.state verify')
assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
assert_equal(0, ticket2.articles.count, 'ticket2.articles verify')
assert_equal('agent-has-changed@example.com', agent1.login, 'verify agent')
assert_equal([], ticket1.tag_list, 'ticket2.tag_list')
# control test - should pass
# create common object tag
tag_object = Tag::Object.create_or_update(name: 'Ticket')
# add tag
ticket1.tag_add('thisisthebestjob', agent1.id)
# change owner
ticket1.owner_id = agent1.id
ticket1.save!
Observer::Transaction.commit
# this will add a tag by trigger
ticket1.reload
assert_equal('some title äöüß', ticket1.title, 'ticket2.title verify')
assert_equal('Users', ticket1.group.name, 'ticket2.group verify')
assert_equal('new', ticket1.state.name, 'ticket2.state verify')
assert_equal('2 normal', ticket1.priority.name, 'ticket2.priority verify')
assert_equal(1, ticket1.articles.count, 'ticket2.articles verify') # articles.count must be 1 if the tag is added
assert_equal('agent-has-changed@example.com', agent1.login, 'verify agent')
assert_equal(%w[thisisthebestjob 123], ticket1.tag_list, 'ticket2.tag_list')
# add tag nosendmail (to test the bug)
ticket1.tag_add('nosendmail', agent2.id)
# change owner
ticket1.owner_id = agent2.id
ticket1.save!
Observer::Transaction.commit
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(2, ticket1.articles.count, 'ticket1.articles verify') # articles.count must be 0 if adding tag is skipped
assert_equal('agent-has-changed2@example.com', agent2.login, 'verify agent')
assert_equal(%w[thisisthebestjob 123 nosendmail], ticket1.tag_list, 'ticket1.tag_list')
# add tag (to test the bug)
ticket1.tag_add('test123', agent2.id)
# change owner
ticket1.owner_id = agent1.id
ticket1.save!
Observer::Transaction.commit
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(3, ticket1.articles.count, 'ticket1.articles verify') # articles.count must be 0 if adding tag is skipped
assert_equal('agent-has-changed@example.com', agent1.login, 'verify agent')
assert_equal(%w[thisisthebestjob 123 nosendmail test123], ticket1.tag_list, 'ticket1.tag_list')
# add tag single tag 'nosendmail2' (to test the bug)
ticket2.tag_add('nosendmail2', agent1.id)
# change owner
ticket2.owner_id = agent1.id
ticket2.save!
Observer::Transaction.commit
ticket2.reload
assert_equal('some title äöüß', ticket2.title, 'ticket2.title verify')
assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
assert_equal('new', ticket2.state.name, 'ticket2.state verify')
assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
assert_equal(0, ticket2.articles.count, 'ticket2.articles verify') # articles.count must be 0 if adding tag is skipped
assert_equal('agent-has-changed@example.com', agent1.login, 'verify agent')
assert_equal(['nosendmail2'], ticket2.tag_list, 'ticket2.tag_list')
end
end