ticket_trigger_test.rb 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011
  1. # encoding: utf-8
  2. require 'test_helper'
  3. class TicketTriggerTest < ActiveSupport::TestCase
  4. test '1 basic' do
  5. trigger1 = Trigger.create_or_update(
  6. name: 'auto reply',
  7. condition: {
  8. 'ticket.state_id' => {
  9. 'operator' => 'is',
  10. 'value' => Ticket::State.lookup(name: 'new').id.to_s,
  11. }
  12. },
  13. perform: {
  14. 'notification.email' => {
  15. 'body' => 'some text<br>#{ticket.customer.lastname}<br>#{ticket.title}<br>#{article.body}',
  16. 'recipient' => 'ticket_customer',
  17. 'subject' => 'Thanks for your inquiry (#{ticket.title})!',
  18. },
  19. 'ticket.priority_id' => {
  20. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  21. },
  22. 'ticket.tags' => {
  23. 'operator' => 'add',
  24. 'value' => 'aa, kk',
  25. },
  26. },
  27. disable_notification: true,
  28. active: true,
  29. created_by_id: 1,
  30. updated_by_id: 1,
  31. )
  32. trigger2 = Trigger.create_or_update(
  33. name: 'not matching',
  34. condition: {
  35. 'ticket.state_id' => {
  36. 'operator' => 'is',
  37. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  38. }
  39. },
  40. perform: {
  41. 'ticket.priority_id' => {
  42. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  43. },
  44. },
  45. disable_notification: true,
  46. active: true,
  47. created_by_id: 1,
  48. updated_by_id: 1,
  49. )
  50. ticket1 = Ticket.create(
  51. title: "some <b>title</b>\n äöüß",
  52. group: Group.lookup(name: 'Users'),
  53. customer: User.lookup(email: 'nicole.braun@zammad.org'),
  54. state: Ticket::State.lookup(name: 'new'),
  55. priority: Ticket::Priority.lookup(name: '2 normal'),
  56. updated_by_id: 1,
  57. created_by_id: 1,
  58. )
  59. assert(ticket1, 'ticket1 created')
  60. Ticket::Article.create(
  61. ticket_id: ticket1.id,
  62. from: 'some_sender@example.com',
  63. to: 'some_recipient@example.com',
  64. subject: 'some subject',
  65. message_id: 'some@id',
  66. body: "some message <b>note</b>\nnew line",
  67. internal: false,
  68. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  69. type: Ticket::Article::Type.find_by(name: 'note'),
  70. updated_by_id: 1,
  71. created_by_id: 1,
  72. )
  73. assert_equal('some <b>title</b> äöüß', ticket1.title, 'ticket1.title verify')
  74. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  75. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  76. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  77. assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
  78. assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
  79. Observer::Transaction.commit
  80. ticket1 = Ticket.lookup(id: ticket1.id)
  81. assert_equal('some <b>title</b> äöüß', ticket1.title, 'ticket1.title verify')
  82. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  83. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  84. assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
  85. assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
  86. assert_equal(%w(aa kk), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
  87. article1 = ticket1.articles.last
  88. assert_match('Zammad <zammad@localhost>', article1.from)
  89. assert_match('nicole.braun@zammad.org', article1.to)
  90. assert_match('Thanks for your inquiry (some <b>title</b> äöüß)!', article1.subject)
  91. assert_match('Braun<br>some &lt;b&gt;title&lt;/b&gt;', article1.body)
  92. assert_match('&gt; some message &lt;b&gt;note&lt;/b&gt;<br>&gt; new line', article1.body)
  93. assert_equal('text/html', article1.content_type)
  94. ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
  95. ticket1.save
  96. Observer::Transaction.commit
  97. assert_equal('some <b>title</b> äöüß', ticket1.title, 'ticket1.title verify')
  98. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  99. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  100. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  101. assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
  102. assert_equal(%w(aa kk), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
  103. ticket1.state = Ticket::State.lookup(name: 'open')
  104. ticket1.save
  105. Observer::Transaction.commit
  106. assert_equal('some <b>title</b> äöüß', ticket1.title, 'ticket1.title verify')
  107. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  108. assert_equal('open', ticket1.state.name, 'ticket1.state verify')
  109. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  110. assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
  111. assert_equal(%w(aa kk), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
  112. ticket1.state = Ticket::State.lookup(name: 'new')
  113. ticket1.save
  114. Observer::Transaction.commit
  115. ticket1 = Ticket.lookup(id: ticket1.id)
  116. assert_equal('some <b>title</b> äöüß', ticket1.title, 'ticket1.title verify')
  117. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  118. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  119. assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
  120. assert_equal(3, ticket1.articles.count, 'ticket1.articles verify')
  121. assert_equal(%w(aa kk), Tag.tag_list(object: 'Ticket', o_id: ticket1.id))
  122. article1 = ticket1.articles.last
  123. assert_match('Zammad <zammad@localhost>', article1.from)
  124. assert_match('nicole.braun@zammad.org', article1.to)
  125. assert_match('Thanks for your inquiry (some <b>title</b> äöüß)!', article1.subject)
  126. assert_match('Braun<br>some &lt;b&gt;title&lt;/b&gt;', article1.body)
  127. assert_equal('text/html', article1.content_type)
  128. ticket2 = Ticket.create(
  129. title: "some title\n äöüß",
  130. group: Group.lookup(name: 'Users'),
  131. customer: User.lookup(email: 'nicole.braun@zammad.org'),
  132. state: Ticket::State.lookup(name: 'open'),
  133. priority: Ticket::Priority.lookup(name: '2 normal'),
  134. updated_by_id: 1,
  135. created_by_id: 1,
  136. )
  137. assert(ticket2, 'ticket2 created')
  138. assert_equal('some title äöüß', ticket2.title, 'ticket2.title verify')
  139. assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
  140. assert_equal('open', ticket2.state.name, 'ticket2.state verify')
  141. assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
  142. assert_equal(0, ticket2.articles.count, 'ticket2.articles verify')
  143. assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket2.id))
  144. Observer::Transaction.commit
  145. ticket2 = Ticket.lookup(id: ticket2.id)
  146. assert_equal('some title äöüß', ticket2.title, 'ticket2.title verify')
  147. assert_equal('Users', ticket2.group.name, 'ticket2.group verify')
  148. assert_equal('open', ticket2.state.name, 'ticket2.state verify')
  149. assert_equal('2 normal', ticket2.priority.name, 'ticket2.priority verify')
  150. assert_equal(0, ticket2.articles.count, 'ticket2.articles verify')
  151. assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket2.id))
  152. ticket3 = Ticket.create(
  153. title: "some <b>title</b>\n äöüß3",
  154. group: Group.lookup(name: 'Users'),
  155. customer: User.lookup(email: 'nicole.braun@zammad.org'),
  156. state: Ticket::State.lookup(name: 'new'),
  157. priority: Ticket::Priority.lookup(name: '2 normal'),
  158. updated_by_id: 1,
  159. created_by_id: 1,
  160. )
  161. assert(ticket3, 'ticket3 created')
  162. Ticket::Article.create(
  163. ticket_id: ticket3.id,
  164. from: 'some_sender@example.com',
  165. to: 'some_recipient@example.com',
  166. subject: 'some subject',
  167. message_id: 'some@id',
  168. content_type: 'text/html',
  169. body: 'some message <b>note</b><br>new line',
  170. internal: false,
  171. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  172. type: Ticket::Article::Type.find_by(name: 'note'),
  173. updated_by_id: 1,
  174. created_by_id: 1,
  175. )
  176. assert_equal('some <b>title</b> äöüß3', ticket3.title, 'ticket3.title verify')
  177. assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
  178. assert_equal('new', ticket3.state.name, 'ticket3.state verify')
  179. assert_equal('2 normal', ticket3.priority.name, 'ticket3.priority verify')
  180. assert_equal(1, ticket3.articles.count, 'ticket3.articles verify')
  181. assert_equal([], Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
  182. Observer::Transaction.commit
  183. ticket3 = Ticket.lookup(id: ticket3.id)
  184. assert_equal('some <b>title</b> äöüß3', ticket3.title, 'ticket3.title verify')
  185. assert_equal('Users', ticket3.group.name, 'ticket3.group verify')
  186. assert_equal('new', ticket3.state.name, 'ticket3.state verify')
  187. assert_equal('3 high', ticket3.priority.name, 'ticket3.priority verify')
  188. assert_equal(2, ticket3.articles.count, 'ticket3.articles verify')
  189. assert_equal(%w(aa kk), Tag.tag_list(object: 'Ticket', o_id: ticket3.id))
  190. article3 = ticket3.articles.last
  191. assert_match('Zammad <zammad@localhost>', article3.from)
  192. assert_match('nicole.braun@zammad.org', article3.to)
  193. assert_match('Thanks for your inquiry (some <b>title</b> äöüß3)!', article3.subject)
  194. assert_match('Braun<br>some &lt;b&gt;title&lt;/b&gt;', article3.body)
  195. assert_match('&gt; some message note<br>&gt; new line', article3.body)
  196. assert_no_match('&gt; some message &lt;b&gt;note&lt;/b&gt;<br>&gt; new line', article3.body)
  197. assert_equal('text/html', article3.content_type)
  198. Trigger.destroy_all
  199. end
  200. test '2 actions - create' do
  201. trigger1 = Trigger.create_or_update(
  202. name: 'auto reply',
  203. condition: {
  204. 'ticket.action' => {
  205. 'operator' => 'is',
  206. 'value' => 'create',
  207. },
  208. 'ticket.state_id' => {
  209. 'operator' => 'is',
  210. 'value' => Ticket::State.lookup(name: 'new').id.to_s,
  211. }
  212. },
  213. perform: {
  214. 'notification.email' => {
  215. 'body' => 'dasdasdasd',
  216. 'recipient' => 'ticket_customer',
  217. 'subject' => 'asdasdas',
  218. },
  219. 'ticket.priority_id' => {
  220. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  221. },
  222. },
  223. disable_notification: true,
  224. active: true,
  225. created_by_id: 1,
  226. updated_by_id: 1,
  227. )
  228. ticket1 = Ticket.create(
  229. title: "some title\n äöüß",
  230. group: Group.lookup(name: 'Users'),
  231. customer: User.lookup(email: 'nicole.braun@zammad.org'),
  232. state: Ticket::State.lookup(name: 'new'),
  233. priority: Ticket::Priority.lookup(name: '2 normal'),
  234. updated_by_id: 1,
  235. created_by_id: 1,
  236. )
  237. assert(ticket1, 'ticket1 created')
  238. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  239. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  240. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  241. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  242. assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
  243. Observer::Transaction.commit
  244. ticket1 = Ticket.lookup(id: ticket1.id)
  245. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  246. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  247. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  248. assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
  249. assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
  250. article1 = ticket1.articles.last
  251. assert_match('Zammad <zammad@localhost>', article1.from)
  252. assert_match('nicole.braun@zammad.org', article1.to)
  253. assert_match('asdasdas', article1.subject)
  254. assert_match('dasdasdasd', article1.body)
  255. assert_equal('text/html', article1.content_type)
  256. ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
  257. ticket1.save
  258. Observer::Transaction.commit
  259. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  260. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  261. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  262. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  263. assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
  264. ticket1.state = Ticket::State.lookup(name: 'open')
  265. ticket1.save
  266. Observer::Transaction.commit
  267. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  268. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  269. assert_equal('open', ticket1.state.name, 'ticket1.state verify')
  270. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  271. assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
  272. ticket1.state = Ticket::State.lookup(name: 'new')
  273. ticket1.save
  274. Observer::Transaction.commit
  275. ticket1 = Ticket.lookup(id: ticket1.id)
  276. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  277. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  278. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  279. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  280. assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
  281. Trigger.destroy_all
  282. end
  283. test '2 actions - update' do
  284. trigger1 = Trigger.create_or_update(
  285. name: 'auto reply',
  286. condition: {
  287. 'ticket.action' => {
  288. 'operator' => 'is',
  289. 'value' => 'update',
  290. },
  291. 'ticket.state_id' => {
  292. 'operator' => 'is',
  293. 'value' => Ticket::State.lookup(name: 'new').id.to_s,
  294. }
  295. },
  296. perform: {
  297. 'notification.email' => {
  298. 'body' => 'dasdasdasd',
  299. 'recipient' => 'ticket_customer',
  300. 'subject' => 'asdasdas',
  301. },
  302. 'ticket.priority_id' => {
  303. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  304. },
  305. },
  306. disable_notification: true,
  307. active: true,
  308. created_by_id: 1,
  309. updated_by_id: 1,
  310. )
  311. ticket1 = Ticket.create(
  312. title: "some title\n äöüß",
  313. group: Group.lookup(name: 'Users'),
  314. customer: User.lookup(email: 'nicole.braun@zammad.org'),
  315. state: Ticket::State.lookup(name: 'new'),
  316. priority: Ticket::Priority.lookup(name: '2 normal'),
  317. updated_by_id: 1,
  318. created_by_id: 1,
  319. )
  320. assert(ticket1, 'ticket1 created')
  321. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  322. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  323. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  324. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  325. assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
  326. Observer::Transaction.commit
  327. ticket1 = Ticket.lookup(id: ticket1.id)
  328. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  329. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  330. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  331. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  332. assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
  333. ticket1.priority = Ticket::Priority.lookup(name: '2 normal')
  334. ticket1.save
  335. Observer::Transaction.commit
  336. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  337. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  338. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  339. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  340. assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
  341. ticket1.state = Ticket::State.lookup(name: 'open')
  342. ticket1.save
  343. Observer::Transaction.commit
  344. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  345. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  346. assert_equal('open', ticket1.state.name, 'ticket1.state verify')
  347. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  348. assert_equal(0, ticket1.articles.count, 'ticket1.articles verify')
  349. ticket1.state = Ticket::State.lookup(name: 'new')
  350. ticket1.save
  351. Observer::Transaction.commit
  352. ticket1 = Ticket.lookup(id: ticket1.id)
  353. assert_equal('some title äöüß', ticket1.title, 'ticket1.title verify')
  354. assert_equal('Users', ticket1.group.name, 'ticket1.group verify')
  355. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  356. assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
  357. assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
  358. Trigger.destroy_all
  359. end
  360. test '3 auto replys' do
  361. roles = Role.where(name: 'Customer')
  362. customer1 = User.create_or_update(
  363. login: 'postmaster@example.com',
  364. firstname: 'Notification',
  365. lastname: 'Customer1',
  366. email: 'postmaster@example.com',
  367. password: 'customerpw',
  368. active: true,
  369. roles: roles,
  370. updated_at: '2015-02-05 16:37:00',
  371. updated_by_id: 1,
  372. created_by_id: 1,
  373. )
  374. customer2 = User.create_or_update(
  375. login: 'ticket-auto-reply-customer2@example.com',
  376. firstname: 'Notification',
  377. lastname: 'Customer2',
  378. email: 'ticket-auto-reply-customer2@example.com',
  379. password: 'customerpw',
  380. active: true,
  381. organization_id: nil,
  382. roles: roles,
  383. updated_at: '2015-02-05 16:37:00',
  384. updated_by_id: 1,
  385. created_by_id: 1,
  386. )
  387. trigger1 = Trigger.create_or_update(
  388. name: 'auto reply - new ticket',
  389. condition: {
  390. 'ticket.action' => {
  391. 'operator' => 'is',
  392. 'value' => 'create',
  393. },
  394. 'ticket.state_id' => {
  395. 'operator' => 'is not',
  396. 'value' => Ticket::State.lookup(name: 'closed').id,
  397. },
  398. 'article.type_id' => {
  399. 'operator' => 'is',
  400. 'value' => [
  401. Ticket::Article::Type.lookup(name: 'email').id,
  402. Ticket::Article::Type.lookup(name: 'phone').id,
  403. Ticket::Article::Type.lookup(name: 'web').id,
  404. ],
  405. },
  406. },
  407. perform: {
  408. 'notification.email' => {
  409. 'body' => '<p>Your request (Ticket##{ticket.number}) has been received and will be reviewed by our support staff.<p>
  410. <br/>
  411. <p>To provide additional information, please reply to this email or click on the following link:
  412. <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
  413. </p>
  414. <br/>
  415. <p><i><a href="http://zammad.com">Zammad</a>, your customer support system</i></p>',
  416. 'recipient' => 'ticket_customer',
  417. 'subject' => 'Thanks for your inquiry (#{ticket.title})',
  418. },
  419. },
  420. disable_notification: true,
  421. active: true,
  422. created_by_id: 1,
  423. updated_by_id: 1,
  424. )
  425. trigger2 = Trigger.create_or_update(
  426. name: 'auto reply (on follow up of tickets)',
  427. condition: {
  428. 'ticket.action' => {
  429. 'operator' => 'is',
  430. 'value' => 'update',
  431. },
  432. 'article.sender_id' => {
  433. 'operator' => 'is',
  434. 'value' => Ticket::Article::Sender.lookup(name: 'Customer').id,
  435. },
  436. 'article.type_id' => {
  437. 'operator' => 'is',
  438. 'value' => [
  439. Ticket::Article::Type.lookup(name: 'email').id,
  440. Ticket::Article::Type.lookup(name: 'phone').id,
  441. Ticket::Article::Type.lookup(name: 'web').id,
  442. ],
  443. },
  444. },
  445. perform: {
  446. 'notification.email' => {
  447. 'body' => '<p>Your follow up for (#{config.ticket_hook}##{ticket.number}) has been received and will be reviewed by our support staff.<p>
  448. <br/>
  449. <p>To provide additional information, please reply to this email or click on the following link:
  450. <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
  451. </p>
  452. <br/>
  453. <p><i><a href="http://zammad.com">Zammad</a>, your customer support system</i></p>',
  454. 'recipient' => 'ticket_customer',
  455. 'subject' => 'Thanks for your follow up (#{ticket.title})',
  456. },
  457. },
  458. active: true,
  459. created_by_id: 1,
  460. updated_by_id: 1,
  461. )
  462. trigger3 = Trigger.create_or_update(
  463. name: 'not matching',
  464. condition: {
  465. 'ticket.action' => {
  466. 'operator' => 'is',
  467. 'value' => 'create',
  468. },
  469. 'ticket.state_id' => {
  470. 'operator' => 'is',
  471. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  472. }
  473. },
  474. perform: {
  475. 'notification.email' => {
  476. 'body' => '2some text<br>#{ticket.customer.lastname}<br>#{ticket.title}',
  477. 'recipient' => 'ticket_customer',
  478. 'subject' => '2Thanks for your inquiry (#{ticket.title})!',
  479. },
  480. },
  481. disable_notification: true,
  482. active: true,
  483. created_by_id: 1,
  484. updated_by_id: 1,
  485. )
  486. # process mail without Precedence header
  487. content = IO.binread('test/fixtures/ticket_trigger/mail1.box')
  488. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  489. assert_equal('aaäöüßad asd', ticket_p.title)
  490. assert_equal('Users', ticket_p.group.name)
  491. assert_equal('new', ticket_p.state.name)
  492. assert_equal(2, ticket_p.articles.count)
  493. article_p = ticket_p.articles.last
  494. assert_match('Thanks for your inquiry (aaäöüßad asd)', article_p.subject)
  495. assert_match('Zammad <zammad@localhost>', article_p.from)
  496. assert_no_match('config\.', article_p.body)
  497. assert_match('http://zammad.example.com', article_p.body)
  498. assert_no_match('ticket.', article_p.body)
  499. assert_match(ticket_p.number, article_p.body)
  500. assert_equal('text/html', article_p.content_type)
  501. ticket_p.priority = Ticket::Priority.lookup(name: '2 normal')
  502. ticket_p.save
  503. Observer::Transaction.commit
  504. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  505. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  506. assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
  507. assert_equal('2 normal', ticket_p.priority.name, 'ticket_p.priority verify')
  508. assert_equal(2, ticket_p.articles.count, 'ticket_p.articles verify')
  509. article_p = Ticket::Article.create(
  510. ticket_id: ticket_p.id,
  511. from: 'some_sender@example.com',
  512. to: 'some_recipient@example.com',
  513. subject: 'some subject',
  514. message_id: 'some@id',
  515. body: 'some message note',
  516. internal: false,
  517. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  518. type: Ticket::Article::Type.find_by(name: 'note'),
  519. updated_by_id: 1,
  520. created_by_id: 1,
  521. )
  522. Observer::Transaction.commit
  523. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  524. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  525. assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
  526. assert_equal('2 normal', ticket_p.priority.name, 'ticket_p.priority verify')
  527. assert_equal(3, ticket_p.articles.count, 'ticket_p.articles verify')
  528. article_p = Ticket::Article.create(
  529. ticket_id: ticket_p.id,
  530. from: 'some_sender@example.com',
  531. to: 'some_recipient@example.com',
  532. subject: 'some subject',
  533. message_id: 'some@id',
  534. body: 'some message note',
  535. internal: false,
  536. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  537. type: Ticket::Article::Type.find_by(name: 'email'),
  538. updated_by_id: 1,
  539. created_by_id: 1,
  540. )
  541. Observer::Transaction.commit
  542. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  543. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  544. assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
  545. assert_equal('2 normal', ticket_p.priority.name, 'ticket_p.priority verify')
  546. assert_equal(4, ticket_p.articles.count, 'ticket_p.articles verify')
  547. article_p = Ticket::Article.create(
  548. ticket_id: ticket_p.id,
  549. from: 'some_sender@example.com',
  550. to: 'some_recipient@example.com',
  551. subject: 'some subject',
  552. message_id: 'some@id',
  553. body: 'some message note',
  554. internal: false,
  555. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  556. type: Ticket::Article::Type.find_by(name: 'email'),
  557. updated_by_id: 1,
  558. created_by_id: 1,
  559. )
  560. Observer::Transaction.commit
  561. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  562. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  563. assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
  564. assert_equal('2 normal', ticket_p.priority.name, 'ticket_p.priority verify')
  565. assert_equal(6, ticket_p.articles.count, 'ticket_p.articles verify')
  566. article_p = ticket_p.articles.last
  567. assert_match('Thanks for your follow up (aaäöüßad asd)', article_p.subject)
  568. assert_match('Zammad <zammad@localhost>', article_p.from)
  569. assert_no_match('config\.', article_p.body)
  570. assert_match('http://zammad.example.com', article_p.body)
  571. assert_no_match('ticket.', article_p.body)
  572. assert_match(ticket_p.number, article_p.body)
  573. assert_equal('text/html', article_p.content_type)
  574. ticket_p.state = Ticket::State.lookup(name: 'open')
  575. ticket_p.save
  576. article_p = Ticket::Article.create(
  577. ticket_id: ticket_p.id,
  578. from: 'some_sender@example.com',
  579. to: 'some_recipient@example.com',
  580. subject: 'some subject',
  581. message_id: 'some@id',
  582. body: 'some message note',
  583. internal: false,
  584. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  585. type: Ticket::Article::Type.find_by(name: 'email'),
  586. updated_by_id: 1,
  587. created_by_id: 1,
  588. )
  589. Observer::Transaction.commit
  590. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  591. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  592. assert_equal('open', ticket_p.state.name, 'ticket_p.state verify')
  593. assert_equal('2 normal', ticket_p.priority.name, 'ticket_p.priority verify')
  594. assert_equal(8, ticket_p.articles.count, 'ticket_p.articles verify')
  595. article_p = ticket_p.articles.last
  596. assert_match('Thanks for your follow up (aaäöüßad asd)', article_p.subject)
  597. assert_match('Zammad <zammad@localhost>', article_p.from)
  598. assert_no_match('config\.', article_p.body)
  599. assert_match('http://zammad.example.com', article_p.body)
  600. assert_no_match('ticket.', article_p.body)
  601. assert_match(ticket_p.number, article_p.body)
  602. assert_equal('text/html', article_p.content_type)
  603. # process mail without Precedence header
  604. content = IO.binread('test/fixtures/ticket_trigger/mail1.box')
  605. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  606. assert_equal('new', ticket_p.state.name)
  607. assert_equal(2, ticket_p.articles.count)
  608. # process mail with Precedence header (no auto response)
  609. content = IO.binread('test/fixtures/ticket_trigger/mail2.box')
  610. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  611. assert_equal('new', ticket_p.state.name)
  612. assert_equal(1, ticket_p.articles.count)
  613. # process mail with abuse@ (no auto response)
  614. content = IO.binread('test/fixtures/ticket_trigger/mail3.box')
  615. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  616. assert_equal('new', ticket_p.state.name)
  617. assert_equal(1, ticket_p.articles.count)
  618. Trigger.destroy_all
  619. end
  620. test '4 has changed' do
  621. roles = Role.where(name: 'Customer')
  622. customer1 = User.create_or_update(
  623. login: 'postmaster@example.com',
  624. firstname: 'Notification',
  625. lastname: 'Customer1',
  626. email: 'postmaster@example.com',
  627. password: 'customerpw',
  628. active: true,
  629. roles: roles,
  630. updated_at: '2015-02-05 16:37:00',
  631. updated_by_id: 1,
  632. created_by_id: 1,
  633. )
  634. customer2 = User.create_or_update(
  635. login: 'ticket-has-changed-customer2@example.com',
  636. firstname: 'Notification',
  637. lastname: 'Customer2',
  638. email: 'ticket-has-changed-customer2@example.com',
  639. password: 'customerpw',
  640. active: true,
  641. organization_id: nil,
  642. roles: roles,
  643. updated_at: '2015-02-05 16:37:00',
  644. updated_by_id: 1,
  645. created_by_id: 1,
  646. )
  647. roles = Role.where(name: 'Agent')
  648. agent1 = User.create_or_update(
  649. login: 'agent-has-changed@example.com',
  650. firstname: 'Has Changed',
  651. lastname: 'Agent1',
  652. email: 'agent-has-changed@example.com',
  653. password: 'agentpw',
  654. active: true,
  655. roles: roles,
  656. updated_at: '2015-02-05 16:37:00',
  657. updated_by_id: 1,
  658. created_by_id: 1,
  659. )
  660. trigger1 = Trigger.create_or_update(
  661. name: 'owner update - to customer',
  662. condition: {
  663. 'ticket.owner_id' => {
  664. 'operator' => 'has changed',
  665. 'pre_condition' => 'current_user.id',
  666. 'value' => '',
  667. 'value_completion' => '',
  668. }
  669. },
  670. perform: {
  671. 'notification.email' => {
  672. 'body' => '<p>The owner of ticket (Ticket##{ticket.number}) has changed.<p>
  673. <br/>
  674. <p>To provide additional information, please reply to this email or click on the following link:
  675. <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
  676. </p>
  677. <br/>
  678. <p><i><a href="http://zammad.com">Zammad</a>, your customer support system</i></p>',
  679. 'recipient' => 'ticket_customer',
  680. 'subject' => 'Owner has changed (#{ticket.title})',
  681. },
  682. },
  683. disable_notification: true,
  684. active: true,
  685. created_by_id: 1,
  686. updated_by_id: 1,
  687. )
  688. # process mail without Precedence header
  689. content = IO.binread('test/fixtures/ticket_trigger/mail1.box')
  690. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  691. assert_equal('aaäöüßad asd', ticket_p.title)
  692. assert_equal('Users', ticket_p.group.name)
  693. assert_equal('new', ticket_p.state.name)
  694. assert_equal(1, ticket_p.articles.count)
  695. article_p = ticket_p.articles.last
  696. Observer::Transaction.commit
  697. ticket_p.owner = agent1
  698. ticket_p.save
  699. Observer::Transaction.commit
  700. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  701. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  702. assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
  703. assert_equal('2 normal', ticket_p.priority.name, 'ticket_p.priority verify')
  704. assert_equal(2, ticket_p.articles.count, 'ticket_p.articles verify')
  705. #p ticket_p.articles.last.inspect
  706. article_p = ticket_p.articles.last
  707. assert_match('Owner has changed', article_p.subject)
  708. assert_match('Zammad <zammad@localhost>', article_p.from)
  709. assert_match('martin@example.com', article_p.to)
  710. assert_no_match('config\.', article_p.body)
  711. assert_match('http://zammad.example.com', article_p.body)
  712. assert_no_match('ticket.', article_p.body)
  713. assert_match(ticket_p.number, article_p.body)
  714. assert_equal('text/html', article_p.content_type)
  715. trigger1 = Trigger.create_or_update(
  716. name: 'owner update - to customer',
  717. condition: {
  718. 'ticket.owner_id' => {
  719. 'operator' => 'has changed',
  720. 'pre_condition' => 'current_user.id',
  721. 'value' => '',
  722. 'value_completion' => '',
  723. },
  724. 'ticket.priority_id' => {
  725. 'operator' => 'is',
  726. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  727. },
  728. },
  729. perform: {
  730. 'notification.email' => {
  731. 'body' => '<p>The owner of ticket (Ticket##{ticket.number}) has changed.<p>
  732. <br/>
  733. <p>To provide additional information, please reply to this email or click on the following link:
  734. <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
  735. </p>
  736. <br/>
  737. <p><i><a href="http://zammad.com">Zammad</a>, your customer support system</i></p>',
  738. 'recipient' => 'ticket_customer',
  739. 'subject' => 'Owner has changed (#{ticket.title})',
  740. },
  741. },
  742. disable_notification: true,
  743. active: true,
  744. created_by_id: 1,
  745. updated_by_id: 1,
  746. )
  747. # process mail without Precedence header
  748. content = IO.binread('test/fixtures/ticket_trigger/mail1.box')
  749. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  750. assert_equal('aaäöüßad asd', ticket_p.title)
  751. assert_equal('Users', ticket_p.group.name)
  752. assert_equal('new', ticket_p.state.name)
  753. assert_equal(1, ticket_p.articles.count)
  754. article_p = ticket_p.articles.last
  755. Observer::Transaction.commit
  756. assert_equal(1, ticket_p.articles.count)
  757. ticket_p.priority = Ticket::Priority.lookup(name: '1 low')
  758. ticket_p.save
  759. Observer::Transaction.commit
  760. assert_equal(1, ticket_p.articles.count)
  761. ticket_p.priority = Ticket::Priority.lookup(name: '3 high')
  762. ticket_p.save
  763. Observer::Transaction.commit
  764. assert_equal(1, ticket_p.articles.count)
  765. ticket_p.owner = agent1
  766. ticket_p.save
  767. Observer::Transaction.commit
  768. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  769. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  770. assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
  771. assert_equal('3 high', ticket_p.priority.name, 'ticket_p.priority verify')
  772. assert_equal(2, ticket_p.articles.count, 'ticket_p.articles verify')
  773. #p ticket_p.articles.last.inspect
  774. article_p = ticket_p.articles.last
  775. assert_match('Owner has changed', article_p.subject)
  776. assert_match('Zammad <zammad@localhost>', article_p.from)
  777. assert_match('martin@example.com', article_p.to)
  778. assert_no_match('config\.', article_p.body)
  779. assert_match('http://zammad.example.com', article_p.body)
  780. assert_no_match('ticket.', article_p.body)
  781. assert_match(ticket_p.number, article_p.body)
  782. assert_equal('text/html', article_p.content_type)
  783. # should trigger
  784. trigger1 = Trigger.create_or_update(
  785. name: 'owner update - to customer',
  786. condition: {
  787. 'ticket.owner_id' => {
  788. 'operator' => 'has changed',
  789. 'pre_condition' => 'current_user.id',
  790. 'value' => '',
  791. 'value_completion' => '',
  792. },
  793. 'ticket.priority_id' => {
  794. 'operator' => 'is',
  795. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  796. },
  797. 'ticket.action' => {
  798. 'operator' => 'is not',
  799. 'value' => 'create',
  800. },
  801. },
  802. perform: {
  803. 'notification.email' => {
  804. 'body' => '<p>The owner of ticket (Ticket##{ticket.number}) has changed.<p>
  805. <br/>
  806. <p>To provide additional information, please reply to this email or click on the following link:
  807. <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
  808. </p>
  809. <br/>
  810. <p><i><a href="http://zammad.com">Zammad</a>, your customer support system</i></p>',
  811. 'recipient' => 'ticket_customer',
  812. 'subject' => 'Owner has changed (#{ticket.title})',
  813. },
  814. },
  815. disable_notification: true,
  816. active: true,
  817. created_by_id: 1,
  818. updated_by_id: 1,
  819. )
  820. # process mail without Precedence header
  821. content = IO.binread('test/fixtures/ticket_trigger/mail1.box')
  822. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  823. assert_equal('aaäöüßad asd', ticket_p.title)
  824. assert_equal('Users', ticket_p.group.name)
  825. assert_equal('new', ticket_p.state.name)
  826. assert_equal(1, ticket_p.articles.count)
  827. article_p = ticket_p.articles.last
  828. Observer::Transaction.commit
  829. assert_equal(1, ticket_p.articles.count)
  830. ticket_p.priority = Ticket::Priority.lookup(name: '1 low')
  831. ticket_p.save
  832. Observer::Transaction.commit
  833. assert_equal(1, ticket_p.articles.count)
  834. ticket_p.priority = Ticket::Priority.lookup(name: '3 high')
  835. ticket_p.save
  836. Observer::Transaction.commit
  837. assert_equal(1, ticket_p.articles.count)
  838. ticket_p.owner = agent1
  839. ticket_p.save
  840. Observer::Transaction.commit
  841. assert_equal('aaäöüßad asd', ticket_p.title, 'ticket_p.title verify')
  842. assert_equal('Users', ticket_p.group.name, 'ticket_p.group verify')
  843. assert_equal('new', ticket_p.state.name, 'ticket_p.state verify')
  844. assert_equal('3 high', ticket_p.priority.name, 'ticket_p.priority verify')
  845. assert_equal(2, ticket_p.articles.count, 'ticket_p.articles verify')
  846. #p ticket_p.articles.last.inspect
  847. article_p = ticket_p.articles.last
  848. assert_match('Owner has changed', article_p.subject)
  849. assert_match('Zammad <zammad@localhost>', article_p.from)
  850. assert_match('martin@example.com', article_p.to)
  851. assert_no_match('config\.', article_p.body)
  852. assert_match('http://zammad.example.com', article_p.body)
  853. assert_no_match('ticket.', article_p.body)
  854. assert_match(ticket_p.number, article_p.body)
  855. assert_equal('text/html', article_p.content_type)
  856. # should not trigger
  857. trigger1 = Trigger.create_or_update(
  858. name: 'owner update - to customer',
  859. condition: {
  860. 'ticket.owner_id' => {
  861. 'operator' => 'has changed',
  862. 'pre_condition' => 'current_user.id',
  863. 'value' => '',
  864. 'value_completion' => '',
  865. },
  866. 'ticket.action' => {
  867. 'operator' => 'is',
  868. 'value' => 'create',
  869. },
  870. },
  871. perform: {
  872. 'notification.email' => {
  873. 'body' => '<p>The owner of ticket (Ticket##{ticket.number}) has changed.<p>
  874. <br/>
  875. <p>To provide additional information, please reply to this email or click on the following link:
  876. <a href="#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}">#{config.http_type}://#{config.fqdn}/#ticket/zoom/#{ticket.id}</a>
  877. </p>
  878. <br/>
  879. <p><i><a href="http://zammad.com">Zammad</a>, your customer support system</i></p>',
  880. 'recipient' => 'ticket_customer',
  881. 'subject' => 'Owner has changed (#{ticket.title})',
  882. },
  883. },
  884. disable_notification: true,
  885. active: true,
  886. created_by_id: 1,
  887. updated_by_id: 1,
  888. )
  889. # process mail without Precedence header
  890. content = IO.binread('test/fixtures/ticket_trigger/mail1.box')
  891. ticket_p, article_p, user_p, mail = Channel::EmailParser.new.process({}, content)
  892. assert_equal(1, ticket_p.articles.count)
  893. Observer::Transaction.commit
  894. assert_equal(1, ticket_p.articles.count)
  895. ticket_p.owner = agent1
  896. ticket_p.save
  897. Observer::Transaction.commit
  898. assert_equal(1, ticket_p.articles.count)
  899. Trigger.destroy_all
  900. end
  901. end