Fixes #2454 - Missing validation for trigger.notification.* at Model/API/REST level.
This commit is contained in:
parent
37d4abc6dd
commit
295e67cb6f
12 changed files with 475 additions and 91 deletions
|
@ -7,6 +7,9 @@ class App.UiElement.ticket_perform_action
|
||||||
ticket:
|
ticket:
|
||||||
name: 'Ticket'
|
name: 'Ticket'
|
||||||
model: 'Ticket'
|
model: 'Ticket'
|
||||||
|
article:
|
||||||
|
name: 'Article'
|
||||||
|
model: 'Article'
|
||||||
|
|
||||||
if attribute.notification
|
if attribute.notification
|
||||||
groups.notification =
|
groups.notification =
|
||||||
|
@ -17,8 +20,11 @@ class App.UiElement.ticket_perform_action
|
||||||
elements = {}
|
elements = {}
|
||||||
for groupKey, groupMeta of groups
|
for groupKey, groupMeta of groups
|
||||||
if !groupMeta.model || !App[groupMeta.model]
|
if !groupMeta.model || !App[groupMeta.model]
|
||||||
|
if groupKey is 'notification'
|
||||||
elements["#{groupKey}.email"] = { name: 'email', display: 'Email' }
|
elements["#{groupKey}.email"] = { name: 'email', display: 'Email' }
|
||||||
elements["#{groupKey}.sms"] = { name: 'sms', display: 'SMS' }
|
elements["#{groupKey}.sms"] = { name: 'sms', display: 'SMS' }
|
||||||
|
else if groupKey is 'article'
|
||||||
|
elements["#{groupKey}.note"] = { name: 'note', display: 'Notiz' }
|
||||||
else
|
else
|
||||||
|
|
||||||
for row in App[groupMeta.model].configure_attributes
|
for row in App[groupMeta.model].configure_attributes
|
||||||
|
@ -163,19 +169,26 @@ class App.UiElement.ticket_perform_action
|
||||||
elementRow.find('.js-attributeSelector select').val(groupAndAttribute)
|
elementRow.find('.js-attributeSelector select').val(groupAndAttribute)
|
||||||
|
|
||||||
notificationTypeMatch = groupAndAttribute.match(/^notification.([\w]+)$/)
|
notificationTypeMatch = groupAndAttribute.match(/^notification.([\w]+)$/)
|
||||||
|
articleTypeMatch = groupAndAttribute.match(/^article.([\w]+)$/)
|
||||||
|
|
||||||
if _.isArray(notificationTypeMatch) && notificationType = notificationTypeMatch[1]
|
if _.isArray(notificationTypeMatch) && notificationType = notificationTypeMatch[1]
|
||||||
elementRow.find('.js-setAttribute').html('')
|
elementRow.find('.js-setAttribute').html('').addClass('hide')
|
||||||
@buildRecipientList(notificationType, elementFull, elementRow, groupAndAttribute, elements, meta, attribute)
|
elementRow.find('.js-setArticle').html('').addClass('hide')
|
||||||
|
@buildNotificationArea(notificationType, elementFull, elementRow, groupAndAttribute, elements, meta, attribute)
|
||||||
|
else if _.isArray(articleTypeMatch) && articleType = articleTypeMatch[1]
|
||||||
|
elementRow.find('.js-setAttribute').html('').addClass('hide')
|
||||||
|
elementRow.find('.js-setNotification').html('').addClass('hide')
|
||||||
|
@buildArticleArea(articleType, elementFull, elementRow, groupAndAttribute, elements, meta, attribute)
|
||||||
else
|
else
|
||||||
elementRow.find('.js-setNotification').html('')
|
elementRow.find('.js-setNotification').html('').addClass('hide')
|
||||||
|
elementRow.find('.js-setArticle').html('').addClass('hide')
|
||||||
if !elementRow.find('.js-setAttribute div').get(0)
|
if !elementRow.find('.js-setAttribute div').get(0)
|
||||||
attributeSelectorElement = $( App.view('generic/ticket_perform_action/attribute_selector')(
|
attributeSelectorElement = $( App.view('generic/ticket_perform_action/attribute_selector')(
|
||||||
attribute: attribute
|
attribute: attribute
|
||||||
name: name
|
name: name
|
||||||
meta: meta || {}
|
meta: meta || {}
|
||||||
))
|
))
|
||||||
elementRow.find('.js-setAttribute').html(attributeSelectorElement)
|
elementRow.find('.js-setAttribute').html(attributeSelectorElement).removeClass('hide')
|
||||||
@buildOperator(elementFull, elementRow, groupAndAttribute, elements, meta, attribute)
|
@buildOperator(elementFull, elementRow, groupAndAttribute, elements, meta, attribute)
|
||||||
|
|
||||||
@buildOperator: (elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
|
@buildOperator: (elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
|
||||||
|
@ -307,7 +320,7 @@ class App.UiElement.ticket_perform_action
|
||||||
|
|
||||||
elementRow.find('.js-value').removeClass('hide').html(item)
|
elementRow.find('.js-value').removeClass('hide').html(item)
|
||||||
|
|
||||||
@buildRecipientList: (notificationType, elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
|
@buildNotificationArea: (notificationType, elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
|
||||||
|
|
||||||
return if elementRow.find(".js-setNotification .js-body-#{notificationType}").get(0)
|
return if elementRow.find(".js-setNotification .js-body-#{notificationType}").get(0)
|
||||||
|
|
||||||
|
@ -344,7 +357,7 @@ class App.UiElement.ticket_perform_action
|
||||||
|
|
||||||
selection = column_select.element()
|
selection = column_select.element()
|
||||||
|
|
||||||
notificationElement = $( App.view('generic/ticket_perform_action/notification_email')(
|
notificationElement = $( App.view('generic/ticket_perform_action/notification')(
|
||||||
attribute: attribute
|
attribute: attribute
|
||||||
name: name
|
name: name
|
||||||
notificationType: notificationType
|
notificationType: notificationType
|
||||||
|
@ -377,7 +390,59 @@ class App.UiElement.ticket_perform_action
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
elementRow.find('.js-setNotification').html(notificationElement)
|
elementRow.find('.js-setNotification').html(notificationElement).removeClass('hide')
|
||||||
|
|
||||||
|
@buildArticleArea: (articleType, elementFull, elementRow, groupAndAttribute, elements, meta, attribute) ->
|
||||||
|
|
||||||
|
return if elementRow.find(".js-setArticle .js-body-#{articleType}").get(0)
|
||||||
|
|
||||||
|
elementRow.find('.js-setArticle').empty()
|
||||||
|
|
||||||
|
name = "#{attribute.name}::article.#{articleType}"
|
||||||
|
console.log('meta', meta)
|
||||||
|
selection = App.UiElement.select.render(
|
||||||
|
name: "#{name}::internal"
|
||||||
|
multiple: false
|
||||||
|
null: false
|
||||||
|
options: { true: 'internal', false: 'public' }
|
||||||
|
value: meta.internal
|
||||||
|
class: 'form-control--small'
|
||||||
|
translate: true
|
||||||
|
)
|
||||||
|
articleElement = $( App.view('generic/ticket_perform_action/article')(
|
||||||
|
attribute: attribute
|
||||||
|
name: name
|
||||||
|
articleType: articleType
|
||||||
|
meta: meta || {}
|
||||||
|
))
|
||||||
|
articleElement.find('.js-internal').html(selection)
|
||||||
|
articleElement.find('.js-body div[contenteditable="true"]').ce(
|
||||||
|
mode: 'richtext'
|
||||||
|
placeholder: 'message'
|
||||||
|
maxlength: 200000
|
||||||
|
)
|
||||||
|
new App.WidgetPlaceholder(
|
||||||
|
el: articleElement.find('.js-body div[contenteditable="true"]').parent()
|
||||||
|
objects: [
|
||||||
|
{
|
||||||
|
prefix: 'ticket'
|
||||||
|
object: 'Ticket'
|
||||||
|
display: 'Ticket'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prefix: 'article'
|
||||||
|
object: 'TicketArticle'
|
||||||
|
display: 'Article'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prefix: 'user'
|
||||||
|
object: 'User'
|
||||||
|
display: 'Current User'
|
||||||
|
},
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
elementRow.find('.js-setArticle').html(articleElement).removeClass('hide')
|
||||||
|
|
||||||
@humanText: (condition) ->
|
@humanText: (condition) ->
|
||||||
none = App.i18n.translateContent('No filter.')
|
none = App.i18n.translateContent('No filter.')
|
||||||
|
|
|
@ -180,7 +180,7 @@ class ArticleViewItem extends App.ObserverController
|
||||||
links: links
|
links: links
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
if article.sender.name is 'System'
|
if article.sender.name is 'System' && article.type.name isnt 'note'
|
||||||
#if article.sender.name is 'System' && article.preferences.perform_origin is 'trigger'
|
#if article.sender.name is 'System' && article.preferences.perform_origin is 'trigger'
|
||||||
@html App.view('ticket_zoom/article_view_system')(
|
@html App.view('ticket_zoom/article_view_system')(
|
||||||
ticket: @ticket
|
ticket: @ticket
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
<div class="flex">
|
||||||
|
<div class="js-internal"></div>
|
||||||
|
<div class="controls js-subject"><input type="text" name="<%= @name %>::subject" value="<%= @meta.subject %>" style="width: 100%;" placeholder="<%- @T('Subject') %>"></div>
|
||||||
|
<div class="controls js-body js-body-<%- @articleType %>"><div class="richtext form-control"><div contenteditable="true" data-name="<%= @name %>::body"><%- @meta.body %></div></div></div>
|
||||||
|
</div>
|
|
@ -7,6 +7,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="js-setAttribute"></div>
|
<div class="js-setAttribute"></div>
|
||||||
<div class="js-setNotification flex"></div>
|
<div class="js-setNotification flex"></div>
|
||||||
|
<div class="js-setArticle flex"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="filter-controls">
|
<div class="filter-controls">
|
||||||
<div class="filter-control filter-control-remove js-remove" title="<%- @Ti('Remote') %>">
|
<div class="filter-control filter-control-remove js-remove" title="<%- @Ti('Remote') %>">
|
||||||
|
|
30
app/models/concerns/checks_perform_validation.rb
Normal file
30
app/models/concerns/checks_perform_validation.rb
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
module ChecksPerformValidation
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
before_create :validate_perform
|
||||||
|
before_update :validate_perform
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_perform
|
||||||
|
# use Marshal to do a deep copy of the perform hash
|
||||||
|
validate_perform = Marshal.load(Marshal.dump(perform))
|
||||||
|
|
||||||
|
check_present = {
|
||||||
|
'article.note' => %w[body subject internal],
|
||||||
|
'notification.email' => %w[body recipient subject],
|
||||||
|
'notification.sms' => %w[body recipient],
|
||||||
|
}
|
||||||
|
|
||||||
|
check_present.each do |key, values|
|
||||||
|
next if validate_perform[key].blank?
|
||||||
|
|
||||||
|
values.each do |value|
|
||||||
|
raise Exceptions::UnprocessableEntity, "Invalid perform #{key}, #{value} is missing!" if validate_perform[key][value].blank?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
|
@ -3,6 +3,7 @@
|
||||||
class Job < ApplicationModel
|
class Job < ApplicationModel
|
||||||
include ChecksClientNotification
|
include ChecksClientNotification
|
||||||
include ChecksConditionValidation
|
include ChecksConditionValidation
|
||||||
|
include ChecksPerformValidation
|
||||||
|
|
||||||
include Job::Assets
|
include Job::Assets
|
||||||
|
|
||||||
|
|
|
@ -846,12 +846,17 @@ perform changes on ticket
|
||||||
end
|
end
|
||||||
|
|
||||||
perform_notification = {}
|
perform_notification = {}
|
||||||
|
perform_article = {}
|
||||||
changed = false
|
changed = false
|
||||||
perform.each do |key, value|
|
perform.each do |key, value|
|
||||||
(object_name, attribute) = key.split('.', 2)
|
(object_name, attribute) = key.split('.', 2)
|
||||||
raise "Unable to update object #{object_name}.#{attribute}, only can update tickets and send notifications!" if object_name != 'ticket' && object_name != 'notification'
|
raise "Unable to update object #{object_name}.#{attribute}, only can update tickets, send notifications and create articles!" if object_name != 'ticket' && object_name != 'article' && object_name != 'notification'
|
||||||
|
|
||||||
# send notification (after changes are done)
|
# send notification/create article (after changes are done)
|
||||||
|
if object_name == 'article'
|
||||||
|
perform_article[key] = value
|
||||||
|
next
|
||||||
|
end
|
||||||
if object_name == 'notification'
|
if object_name == 'notification'
|
||||||
perform_notification[key] = value
|
perform_notification[key] = value
|
||||||
next
|
next
|
||||||
|
@ -910,6 +915,25 @@ perform changes on ticket
|
||||||
save!
|
save!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
perform_article.each do |key, value|
|
||||||
|
raise 'Unable to create article, we only support article.note' if key != 'article.note'
|
||||||
|
|
||||||
|
Ticket::Article.create!(
|
||||||
|
ticket_id: id,
|
||||||
|
subject: value[:subject],
|
||||||
|
content_type: 'text/html',
|
||||||
|
body: value[:body],
|
||||||
|
internal: value[:internal],
|
||||||
|
sender: Ticket::Article::Sender.find_by(name: 'System'),
|
||||||
|
type: Ticket::Article::Type.find_by(name: 'note'),
|
||||||
|
preferences: {
|
||||||
|
perform_origin: perform_origin,
|
||||||
|
},
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
perform_notification.each do |key, value|
|
perform_notification.each do |key, value|
|
||||||
|
|
||||||
# send notification
|
# send notification
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
class Trigger < ApplicationModel
|
class Trigger < ApplicationModel
|
||||||
include ChecksConditionValidation
|
include ChecksConditionValidation
|
||||||
|
include ChecksPerformValidation
|
||||||
include CanSeed
|
include CanSeed
|
||||||
|
|
||||||
include Trigger::Assets
|
include Trigger::Assets
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe Issue2019FixDoubleDomainLinksInTriggerEmails, type: :db_migration do
|
RSpec.describe Issue2019FixDoubleDomainLinksInTriggerEmails, type: :db_migration do
|
||||||
subject { create(:trigger, perform: { 'notification.email' => { 'body' => faulty_link } }) }
|
subject { create(:trigger, perform: { 'notification.email' => { 'body' => faulty_link, 'recipient' => 'customer', 'subject' => 'some subject' } }) }
|
||||||
|
|
||||||
let(:faulty_link) do
|
let(:faulty_link) do
|
||||||
'<a href="https://example.com/#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">' \
|
'<a href="https://example.com/#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">' \
|
||||||
|
|
|
@ -1064,6 +1064,103 @@ class JobTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
assert_not(Ticket.find_by(id: ticket1.id))
|
assert_not(Ticket.find_by(id: ticket1.id))
|
||||||
assert(Ticket.find_by(id: ticket2.id))
|
assert(Ticket.find_by(id: ticket2.id))
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test 'validates perform with article.note - should fail because of missing body' do
|
||||||
|
assert_raises(Exception) do
|
||||||
|
Job.create!(
|
||||||
|
name: 'some job',
|
||||||
|
timeplan: {
|
||||||
|
days: {
|
||||||
|
Mon: true,
|
||||||
|
},
|
||||||
|
hours: {
|
||||||
|
'0' => false,
|
||||||
|
},
|
||||||
|
minutes: {
|
||||||
|
'0' => true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
condition: {
|
||||||
|
'ticket.state_id' => { 'operator' => 'is', 'value' => Ticket::State.find_by(name: 'closed').id }
|
||||||
|
},
|
||||||
|
perform: {
|
||||||
|
'article.note' => {
|
||||||
|
'subject' => 'some subject!',
|
||||||
|
'internal' => 'true',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disable_notification: true,
|
||||||
|
active: true,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'validates perform with notification.email - should fail because of missing recipient' do
|
||||||
|
assert_raises(Exception) do
|
||||||
|
Job.create!(
|
||||||
|
name: 'some job',
|
||||||
|
timeplan: {
|
||||||
|
days: {
|
||||||
|
Mon: true,
|
||||||
|
},
|
||||||
|
hours: {
|
||||||
|
'0' => false,
|
||||||
|
},
|
||||||
|
minutes: {
|
||||||
|
'0' => true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
condition: {
|
||||||
|
'ticket.state_id' => { 'operator' => 'is', 'value' => Ticket::State.find_by(name: 'closed').id }
|
||||||
|
},
|
||||||
|
perform: {
|
||||||
|
'notification.email' => {
|
||||||
|
'body' => 'some lala',
|
||||||
|
'recipient' => '',
|
||||||
|
'subject' => 'Thanks for your inquiry!',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disable_notification: true,
|
||||||
|
active: true,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'validates perform with notification.sms - should fail because of missing recipient' do
|
||||||
|
assert_raises(Exception) do
|
||||||
|
Job.create!(
|
||||||
|
name: 'some job',
|
||||||
|
timeplan: {
|
||||||
|
days: {
|
||||||
|
Mon: true,
|
||||||
|
},
|
||||||
|
hours: {
|
||||||
|
'0' => false,
|
||||||
|
},
|
||||||
|
minutes: {
|
||||||
|
'0' => true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
condition: {
|
||||||
|
'ticket.state_id' => { 'operator' => 'is', 'value' => Ticket::State.find_by(name: 'closed').id }
|
||||||
|
},
|
||||||
|
perform: {
|
||||||
|
'notification.sms' => {
|
||||||
|
'body' => 'some lala',
|
||||||
|
'recipient' => '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disable_notification: true,
|
||||||
|
active: true,
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '1 basic' do
|
test '1 basic' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa loop check',
|
name: 'aaa loop check',
|
||||||
condition: {
|
condition: {
|
||||||
'article.subject' => {
|
'article.subject' => {
|
||||||
|
@ -32,7 +32,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger2 = Trigger.create_or_update(
|
trigger2 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -64,7 +64,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger3 = Trigger.create_or_update(
|
trigger3 = Trigger.create!(
|
||||||
name: 'auto tag 1',
|
name: 'auto tag 1',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -91,7 +91,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger4 = Trigger.create_or_update(
|
trigger4 = Trigger.create!(
|
||||||
name: 'auto tag 2',
|
name: 'auto tag 2',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.state_id' => {
|
'ticket.state_id' => {
|
||||||
|
@ -111,7 +111,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger5 = Trigger.create_or_update(
|
trigger5 = Trigger.create!(
|
||||||
name: 'not matching',
|
name: 'not matching',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.state_id' => {
|
'ticket.state_id' => {
|
||||||
|
@ -130,7 +130,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger6 = Trigger.create_or_update(
|
trigger6 = Trigger.create!(
|
||||||
name: 'zzz last',
|
name: 'zzz last',
|
||||||
condition: {
|
condition: {
|
||||||
'article.subject' => {
|
'article.subject' => {
|
||||||
|
@ -411,7 +411,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '2 actions - create' do
|
test '2 actions - create' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -504,7 +504,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '2 actions - update' do
|
test '2 actions - update' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -592,7 +592,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
test '3 auto replys' do
|
test '3 auto replys' do
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer1 = User.create_or_update(
|
customer1 = User.create!(
|
||||||
login: 'postmaster@example.com',
|
login: 'postmaster@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -604,7 +604,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
customer2 = User.create_or_update(
|
customer2 = User.create!(
|
||||||
login: 'ticket-auto-reply-customer2@example.com',
|
login: 'ticket-auto-reply-customer2@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer2',
|
lastname: 'Customer2',
|
||||||
|
@ -618,7 +618,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'auto reply - new ticket',
|
name: 'auto reply - new ticket',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -657,7 +657,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger2 = Trigger.create_or_update(
|
trigger2 = Trigger.create!(
|
||||||
name: 'auto reply (on follow up of tickets)',
|
name: 'auto reply (on follow up of tickets)',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -695,7 +695,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger3 = Trigger.create_or_update(
|
trigger3 = Trigger.create!(
|
||||||
name: 'not matching',
|
name: 'not matching',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -881,7 +881,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
test '4 has changed' do
|
test '4 has changed' do
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer1 = User.create_or_update(
|
customer1 = User.create!(
|
||||||
login: 'postmaster@example.com',
|
login: 'postmaster@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -893,7 +893,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
customer2 = User.create_or_update(
|
customer2 = User.create!(
|
||||||
login: 'ticket-has-changed-customer2@example.com',
|
login: 'ticket-has-changed-customer2@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer2',
|
lastname: 'Customer2',
|
||||||
|
@ -908,7 +908,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent1 = User.create_or_update(
|
agent1 = User.create!(
|
||||||
login: 'agent-has-changed@example.com',
|
login: 'agent-has-changed@example.com',
|
||||||
firstname: 'Has Changed',
|
firstname: 'Has Changed',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -921,7 +921,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'owner update - to customer',
|
name: 'owner update - to customer',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.owner_id' => {
|
'ticket.owner_id' => {
|
||||||
|
@ -1197,7 +1197,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '5 notify owner' do
|
test '5 notify owner' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa notify mail',
|
name: 'aaa notify mail',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.state_id' => {
|
'ticket.state_id' => {
|
||||||
|
@ -1223,7 +1223,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -1287,7 +1287,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
assert_equal(3, ticket1.articles.count)
|
assert_equal(3, ticket1.articles.count)
|
||||||
|
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa notify mail 2',
|
name: 'aaa notify mail 2',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.state_id' => {
|
'ticket.state_id' => {
|
||||||
|
@ -1332,7 +1332,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '6 owner auto assignment' do
|
test '6 owner auto assignment' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa auto assignment',
|
name: 'aaa auto assignment',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.owner_id' => {
|
'ticket.owner_id' => {
|
||||||
|
@ -1360,7 +1360,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -1446,7 +1446,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '6.1 owner auto assignment based on organization' do
|
test '6.1 owner auto assignment based on organization' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa auto assignment',
|
name: 'aaa auto assignment',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.organization_id' => {
|
'ticket.organization_id' => {
|
||||||
|
@ -1474,7 +1474,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -1487,7 +1487,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer = User.create_or_update(
|
customer = User.create!(
|
||||||
login: 'customer@example.com',
|
login: 'customer@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -1559,7 +1559,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '6.2 owner auto assignment based on organization' do
|
test '6.2 owner auto assignment based on organization' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa auto assignment',
|
name: 'aaa auto assignment',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.organization_id' => {
|
'ticket.organization_id' => {
|
||||||
|
@ -1587,7 +1587,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -1600,7 +1600,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer = User.create_or_update(
|
customer = User.create!(
|
||||||
login: 'customer@example.com',
|
login: 'customer@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -1643,7 +1643,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
|
assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
|
||||||
assert_equal([], ticket1.tag_list)
|
assert_equal([], ticket1.tag_list)
|
||||||
|
|
||||||
ticket1.update!(customer: customer )
|
ticket1.update!(customer: customer)
|
||||||
|
|
||||||
UserInfo.current_user_id = agent.id
|
UserInfo.current_user_id = agent.id
|
||||||
Ticket::Article.create!(
|
Ticket::Article.create!(
|
||||||
|
@ -1672,7 +1672,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '7 owner auto assignment' do
|
test '7 owner auto assignment' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa auto assignment',
|
name: 'aaa auto assignment',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.owner_id' => {
|
'ticket.owner_id' => {
|
||||||
|
@ -1704,7 +1704,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent1 = User.create_or_update(
|
agent1 = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -1716,11 +1716,11 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
agent2 = User.create_or_update(
|
agent2 = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent2@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent2',
|
lastname: 'Agent2',
|
||||||
email: 'agent@example.com',
|
email: 'agent2@example.com',
|
||||||
password: 'agentpw',
|
password: 'agentpw',
|
||||||
active: true,
|
active: true,
|
||||||
roles: roles,
|
roles: roles,
|
||||||
|
@ -1857,7 +1857,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
ticket1.reload
|
ticket1.reload
|
||||||
assert_equal('test 123', ticket1.title, 'ticket1.title verify')
|
assert_equal('test 123', ticket1.title, 'ticket1.title verify')
|
||||||
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
|
assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
|
||||||
assert_equal(agent1.id, ticket1.owner_id, 'ticket1.owner_id verify')
|
assert_equal(agent2.id, ticket1.owner_id, 'ticket1.owner_id verify')
|
||||||
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
|
assert_equal('new', ticket1.state.name, 'ticket1.state verify')
|
||||||
assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
|
assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
|
||||||
assert_equal(4, ticket1.articles.count, 'ticket1.articles verify')
|
assert_equal(4, ticket1.articles.count, 'ticket1.articles verify')
|
||||||
|
@ -1865,7 +1865,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '8 owner auto assignment' do
|
test '8 owner auto assignment' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa auto assignment',
|
name: 'aaa auto assignment',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.owner_id' => {
|
'ticket.owner_id' => {
|
||||||
|
@ -1899,7 +1899,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -2015,7 +2015,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '9 vip priority set' do
|
test '9 vip priority set' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa vip priority',
|
name: 'aaa vip priority',
|
||||||
condition: {
|
condition: {
|
||||||
'customer.vip' => {
|
'customer.vip' => {
|
||||||
|
@ -2035,7 +2035,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -2048,7 +2048,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer = User.create_or_update(
|
customer = User.create!(
|
||||||
login: 'customer@example.com',
|
login: 'customer@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -2153,7 +2153,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '10 owner auto assignment notify to customer' do
|
test '10 owner auto assignment notify to customer' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa auto assignment',
|
name: 'aaa auto assignment',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.owner_id' => {
|
'ticket.owner_id' => {
|
||||||
|
@ -2177,7 +2177,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent1 = User.create_or_update(
|
agent1 = User.create!(
|
||||||
login: 'agent1@example.com',
|
login: 'agent1@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -2189,7 +2189,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
agent2 = User.create_or_update(
|
agent2 = User.create!(
|
||||||
login: 'agent2@example.com',
|
login: 'agent2@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent2',
|
lastname: 'Agent2',
|
||||||
|
@ -2280,7 +2280,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '11 notify to customer on public note' do
|
test '11 notify to customer on public note' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa notify to customer on public note',
|
name: 'aaa notify to customer on public note',
|
||||||
condition: {
|
condition: {
|
||||||
'article.internal' => {
|
'article.internal' => {
|
||||||
|
@ -2312,7 +2312,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -2325,7 +2325,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer = User.create_or_update(
|
customer = User.create!(
|
||||||
login: 'customer@example.com',
|
login: 'customer@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -2490,7 +2490,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '12 notify on owner change' do
|
test '12 notify on owner change' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa notify to customer on public note',
|
name: 'aaa notify to customer on public note',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.owner_id' => {
|
'ticket.owner_id' => {
|
||||||
|
@ -2512,7 +2512,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
Trigger.create_or_update(
|
Trigger.create!(
|
||||||
name: 'auto reply (on new tickets)',
|
name: 'auto reply (on new tickets)',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -2555,7 +2555,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
Trigger.create_or_update(
|
Trigger.create!(
|
||||||
name: 'auto reply (on follow up of tickets)',
|
name: 'auto reply (on follow up of tickets)',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -2597,7 +2597,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
agent = User.create_or_update(
|
agent = User.create!(
|
||||||
login: 'agent@example.com',
|
login: 'agent@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -2610,7 +2610,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer = User.create_or_update(
|
customer = User.create!(
|
||||||
login: 'customer@example.com',
|
login: 'customer@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -2719,7 +2719,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
test '1 empty condition should not create errors' do
|
test '1 empty condition should not create errors' do
|
||||||
assert_raises(Exception) do
|
assert_raises(Exception) do
|
||||||
trigger_empty = Trigger.create_or_update(
|
trigger_empty = Trigger.create!(
|
||||||
name: 'aaa loop check',
|
name: 'aaa loop check',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.number' => {
|
'ticket.number' => {
|
||||||
|
@ -2743,7 +2743,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'article_last_sender trigger -> reply_to' do
|
test 'article_last_sender trigger -> reply_to' do
|
||||||
trigger = Trigger.create_or_update(
|
trigger = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -2800,7 +2800,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'article_last_sender trigger -> from' do
|
test 'article_last_sender trigger -> from' do
|
||||||
trigger = Trigger.create_or_update(
|
trigger = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -2856,7 +2856,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'article_last_sender trigger -> origin_by_id' do
|
test 'article_last_sender trigger -> origin_by_id' do
|
||||||
trigger = Trigger.create_or_update(
|
trigger = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -2881,7 +2881,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer1 = User.create_or_update(
|
customer1 = User.create!(
|
||||||
login: 'customer+origin_by_id@example.com',
|
login: 'customer+origin_by_id@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -2925,7 +2925,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'article_last_sender trigger -> created_by_id' do
|
test 'article_last_sender trigger -> created_by_id' do
|
||||||
trigger = Trigger.create_or_update(
|
trigger = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -2950,7 +2950,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
roles = Role.where(name: 'Customer')
|
roles = Role.where(name: 'Customer')
|
||||||
customer1 = User.create_or_update(
|
customer1 = User.create!(
|
||||||
login: 'customer+created_by_id@example.com',
|
login: 'customer+created_by_id@example.com',
|
||||||
firstname: 'Trigger',
|
firstname: 'Trigger',
|
||||||
lastname: 'Customer1',
|
lastname: 'Customer1',
|
||||||
|
@ -2993,7 +2993,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'multiple recipients owner_id, article_last_sender(reply_to) trigger' do
|
test 'multiple recipients owner_id, article_last_sender(reply_to) trigger' do
|
||||||
trigger = Trigger.create_or_update(
|
trigger = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3017,7 +3017,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
admin = User.create_or_update(
|
admin = User.create!(
|
||||||
login: 'admin+owner_recipient@example.com',
|
login: 'admin+owner_recipient@example.com',
|
||||||
firstname: 'Role',
|
firstname: 'Role',
|
||||||
lastname: "Admin#{name}",
|
lastname: "Admin#{name}",
|
||||||
|
@ -3064,7 +3064,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'article_last_sender trigger -> invalid reply_to' do
|
test 'article_last_sender trigger -> invalid reply_to' do
|
||||||
trigger = Trigger.create_or_update(
|
trigger = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3118,7 +3118,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '2 loop check' do
|
test '2 loop check' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa loop check',
|
name: 'aaa loop check',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.state_id' => {
|
'ticket.state_id' => {
|
||||||
|
@ -3417,7 +3417,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '3 invalid condition' do
|
test '3 invalid condition' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'aaa loop check',
|
name: 'aaa loop check',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3448,7 +3448,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
})
|
})
|
||||||
assert_equal('invalid invalid 4', trigger1.condition['ticket.first_response_at']['value'])
|
assert_equal('invalid invalid 4', trigger1.condition['ticket.first_response_at']['value'])
|
||||||
|
|
||||||
trigger2 = Trigger.create_or_update(
|
trigger2 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3529,7 +3529,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test '4 tag based auto response' do
|
test '4 tag based auto response' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: '100 add tag if sender 1',
|
name: '100 add tag if sender 1',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3553,7 +3553,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger2 = Trigger.create_or_update(
|
trigger2 = Trigger.create!(
|
||||||
name: '200 add tag if sender 2',
|
name: '200 add tag if sender 2',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3577,7 +3577,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
trigger3 = Trigger.create_or_update(
|
trigger3 = Trigger.create!(
|
||||||
name: '300 auto reply',
|
name: '300 auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3725,7 +3725,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'article.body' do
|
test 'article.body' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -3962,7 +3962,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
test 'change owner' do
|
test 'change owner' do
|
||||||
roles = Role.where(name: 'Agent')
|
roles = Role.where(name: 'Agent')
|
||||||
groups = Group.where(name: 'Users')
|
groups = Group.where(name: 'Users')
|
||||||
agent1 = User.create_or_update(
|
agent1 = User.create!(
|
||||||
login: 'agent-has-changed@example.com',
|
login: 'agent-has-changed@example.com',
|
||||||
firstname: 'Has Changed',
|
firstname: 'Has Changed',
|
||||||
lastname: 'Agent1',
|
lastname: 'Agent1',
|
||||||
|
@ -3976,7 +3976,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
created_by_id: 1,
|
created_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
agent2 = User.create_or_update(
|
agent2 = User.create!(
|
||||||
login: 'agent-has-changed2@example.com',
|
login: 'agent-has-changed2@example.com',
|
||||||
firstname: 'Has Changed',
|
firstname: 'Has Changed',
|
||||||
lastname: 'Agent2',
|
lastname: 'Agent2',
|
||||||
|
@ -3991,7 +3991,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
)
|
)
|
||||||
|
|
||||||
# multi tag trigger with changed owner
|
# multi tag trigger with changed owner
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'change owner',
|
name: 'change owner',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.owner_id' => {
|
'ticket.owner_id' => {
|
||||||
|
@ -4160,7 +4160,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'trigger auto reply with umlaut in form' do
|
test 'trigger auto reply with umlaut in form' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -4234,7 +4234,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'trigger auto reply with 2 sender addresses in form' do
|
test 'trigger auto reply with 2 sender addresses in form' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -4275,7 +4275,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'make sure attachments should be attached with content id' do
|
test 'make sure attachments should be attached with content id' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'auto reply',
|
name: 'auto reply',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.action' => {
|
'ticket.action' => {
|
||||||
|
@ -4324,7 +4324,7 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
updated_by_id: 1,
|
updated_by_id: 1,
|
||||||
)
|
)
|
||||||
|
|
||||||
Trigger.create_or_update(
|
Trigger.create!(
|
||||||
name: 'auto reply (condition: organization-is-not)',
|
name: 'auto reply (condition: organization-is-not)',
|
||||||
condition: {
|
condition: {
|
||||||
'ticket.organization_id' => {
|
'ticket.organization_id' => {
|
||||||
|
@ -4367,8 +4367,8 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
assert_equal('text/html', autoreply.content_type)
|
assert_equal('text/html', autoreply.content_type)
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'trigger when there is an article body contains matched values' do
|
test 'trigger tags and auto responder when there is an article body contains matched values' do
|
||||||
trigger1 = Trigger.create_or_update(
|
trigger1 = Trigger.create!(
|
||||||
name: 'detect message body',
|
name: 'detect message body',
|
||||||
condition: {
|
condition: {
|
||||||
'article.body' => {
|
'article.body' => {
|
||||||
|
@ -4436,4 +4436,164 @@ class TicketTriggerTest < ActiveSupport::TestCase
|
||||||
assert_match("some message <b>note</b>\nnew line", article1.body)
|
assert_match("some message <b>note</b>\nnew line", article1.body)
|
||||||
assert_equal('text/plain', article1.content_type)
|
assert_equal('text/plain', article1.content_type)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test 'trigger note and auto responder (correct order) when there is an article body contains matched values' do
|
||||||
|
trigger1 = Trigger.create!(
|
||||||
|
name: 'detect message body',
|
||||||
|
condition: {
|
||||||
|
'article.body' => {
|
||||||
|
'operator' => 'contains',
|
||||||
|
'value' => 'some message',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
perform: {
|
||||||
|
'article.note' => {
|
||||||
|
'body' => 'some note',
|
||||||
|
'subject' => 'some subject!',
|
||||||
|
'internal' => 'true',
|
||||||
|
},
|
||||||
|
'notification.email' => {
|
||||||
|
'body' => 'some lala',
|
||||||
|
'recipient' => 'ticket_customer',
|
||||||
|
'subject' => 'Thanks for your inquiry - loop check (#{ticket.title})!',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disable_notification: true,
|
||||||
|
active: true,
|
||||||
|
created_by_id: 1,
|
||||||
|
updated_by_id: 1,
|
||||||
|
)
|
||||||
|
ticket1 = Ticket.create!(
|
||||||
|
title: "some <b>title</b>\n äöüß",
|
||||||
|
group: Group.lookup(name: 'Users'),
|
||||||
|
customer: User.lookup(email: 'nicole.braun@zammad.org'),
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
article1 = 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,
|
||||||
|
)
|
||||||
|
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')
|
||||||
|
assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
|
||||||
|
assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
|
||||||
|
assert_equal([], ticket1.tag_list)
|
||||||
|
|
||||||
|
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')
|
||||||
|
assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
|
||||||
|
assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
|
||||||
|
assert_equal([], ticket1.tag_list)
|
||||||
|
|
||||||
|
assert_match('- ', article1.from)
|
||||||
|
assert_match('some_recipient@example.com', article1.to)
|
||||||
|
assert_match('some subject', article1.subject)
|
||||||
|
assert_match("some message <b>note</b>\nnew line", article1.body)
|
||||||
|
assert_equal('text/plain', article1.content_type)
|
||||||
|
|
||||||
|
article_note1 = ticket1.articles[1]
|
||||||
|
assert_match('- ', article_note1.from)
|
||||||
|
assert_nil(article_note1.to)
|
||||||
|
assert_match('some subject!', article_note1.subject)
|
||||||
|
assert_match('some note', article_note1.body)
|
||||||
|
assert_equal('text/html', article_note1.content_type)
|
||||||
|
assert_equal(true, article_note1.internal)
|
||||||
|
|
||||||
|
article_auto_responder1 = ticket1.articles[2]
|
||||||
|
assert_match('Zammad <zammad@localhost>', article_auto_responder1.from)
|
||||||
|
assert_match('nicole.braun@zammad.org', article_auto_responder1.to)
|
||||||
|
assert_match('Thanks for your inquiry - loop check (some <b>title</b> äöüß)!', article_auto_responder1.subject)
|
||||||
|
assert_match('some lala', article_auto_responder1.body)
|
||||||
|
assert_equal('text/html', article_auto_responder1.content_type)
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'validates perform with article.note - should fail because of missing body' do
|
||||||
|
assert_raises(Exception) do
|
||||||
|
Trigger.create!(
|
||||||
|
name: 'some trigger',
|
||||||
|
condition: {
|
||||||
|
'article.body' => {
|
||||||
|
'operator' => 'contains',
|
||||||
|
'value' => 'some message',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
perform: {
|
||||||
|
'article.note' => {
|
||||||
|
'subject' => 'some subject!',
|
||||||
|
'internal' => 'true',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disable_notification: true,
|
||||||
|
active: true,
|
||||||
|
created_by_id: 1,
|
||||||
|
updated_by_id: 1,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'validates perform with notification.email - should fail because of missing recipient' do
|
||||||
|
assert_raises(Exception) do
|
||||||
|
Trigger.create!(
|
||||||
|
name: 'some trigger',
|
||||||
|
condition: {
|
||||||
|
'article.body' => {
|
||||||
|
'operator' => 'contains',
|
||||||
|
'value' => 'some message',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
perform: {
|
||||||
|
'notification.email' => {
|
||||||
|
'body' => 'some lala',
|
||||||
|
'recipient' => '',
|
||||||
|
'subject' => 'Thanks for your inquiry - loop check (#{ticket.title})!',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disable_notification: true,
|
||||||
|
active: true,
|
||||||
|
created_by_id: 1,
|
||||||
|
updated_by_id: 1,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test 'validates perform with notification.sms - should fail because of missing recipient' do
|
||||||
|
assert_raises(Exception) do
|
||||||
|
Trigger.create!(
|
||||||
|
name: 'some trigger',
|
||||||
|
condition: {
|
||||||
|
'article.body' => {
|
||||||
|
'operator' => 'contains',
|
||||||
|
'value' => 'some message',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
perform: {
|
||||||
|
'notification.sms' => {
|
||||||
|
'body' => 'some lala',
|
||||||
|
'recipient' => '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
disable_notification: true,
|
||||||
|
active: true,
|
||||||
|
created_by_id: 1,
|
||||||
|
updated_by_id: 1,
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue