ticket_trigger_extended_test.rb 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. require 'test_helper'
  3. class TicketTriggerExtendedTest < ActiveSupport::TestCase
  4. setup do
  5. Setting.set('ticket_trigger_recursive', true)
  6. end
  7. test 'recursive trigger' do
  8. Trigger.create!(
  9. name: '1) set prio to 3 high',
  10. condition: {
  11. 'ticket.action' => {
  12. 'operator' => 'is',
  13. 'value' => 'create',
  14. },
  15. 'ticket.state_id' => {
  16. 'operator' => 'is',
  17. 'value' => Ticket::State.lookup(name: 'new').id.to_s,
  18. },
  19. },
  20. perform: {
  21. 'ticket.priority_id' => {
  22. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  23. },
  24. },
  25. disable_notification: true,
  26. active: true,
  27. created_by_id: 1,
  28. updated_by_id: 1,
  29. )
  30. Trigger.create!(
  31. name: '2) set state to closed',
  32. condition: {
  33. 'ticket.action' => {
  34. 'operator' => 'is',
  35. 'value' => 'create',
  36. },
  37. 'ticket.priority_id' => {
  38. 'operator' => 'is',
  39. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  40. },
  41. },
  42. perform: {
  43. 'ticket.state_id' => {
  44. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  45. },
  46. },
  47. disable_notification: true,
  48. active: true,
  49. created_by_id: 1,
  50. updated_by_id: 1,
  51. )
  52. email_raw_string = 'From: me@example.com
  53. To: customer@example.com
  54. Subject: some new subject
  55. Some Text'
  56. ticket_p, _article_p, _user_p, _mail = Channel::EmailParser.new.process({}, email_raw_string)
  57. assert_equal('some new subject', ticket_p.title)
  58. assert_equal('Users', ticket_p.group.name)
  59. assert_equal('3 high', ticket_p.priority.name)
  60. assert_equal('closed', ticket_p.state.name)
  61. assert_equal(1, ticket_p.articles.count, 'ticket1.articles verify')
  62. end
  63. test 'recursive trigger - loop test' do
  64. Trigger.create!(
  65. name: '1) set prio to 3 high',
  66. condition: {
  67. 'ticket.priority_id' => {
  68. 'operator' => 'is',
  69. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  70. },
  71. },
  72. perform: {
  73. 'ticket.priority_id' => {
  74. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  75. },
  76. 'ticket.state_id' => {
  77. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  78. },
  79. },
  80. disable_notification: true,
  81. active: true,
  82. created_by_id: 1,
  83. updated_by_id: 1,
  84. )
  85. Trigger.create!(
  86. name: '2) set prio to 1 low',
  87. condition: {
  88. 'ticket.priority_id' => {
  89. 'operator' => 'is',
  90. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  91. },
  92. },
  93. perform: {
  94. 'ticket.priority_id' => {
  95. 'value' => Ticket::Priority.lookup(name: '1 low').id.to_s,
  96. },
  97. 'ticket.state_id' => {
  98. 'value' => Ticket::State.lookup(name: 'open').id.to_s,
  99. },
  100. },
  101. disable_notification: true,
  102. active: true,
  103. created_by_id: 1,
  104. updated_by_id: 1,
  105. )
  106. Trigger.create!(
  107. name: '3) set prio to 3 high',
  108. condition: {
  109. 'ticket.priority_id' => {
  110. 'operator' => 'is',
  111. 'value' => Ticket::Priority.lookup(name: '1 low').id.to_s,
  112. },
  113. },
  114. perform: {
  115. 'ticket.priority_id' => {
  116. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  117. },
  118. },
  119. disable_notification: true,
  120. active: true,
  121. created_by_id: 1,
  122. updated_by_id: 1,
  123. )
  124. email_raw_string = 'From: me@example.com
  125. To: customer@example.com
  126. Subject: some new subject
  127. Some Text'
  128. ticket_p, _article_p, _user_p, _mail = Channel::EmailParser.new.process({}, email_raw_string)
  129. assert_equal('some new subject', ticket_p.title)
  130. assert_equal('Users', ticket_p.group.name)
  131. assert_equal('2 normal', ticket_p.priority.name)
  132. assert_equal('open', ticket_p.state.name)
  133. assert_equal(1, ticket_p.articles.count, 'ticket1.articles verify')
  134. end
  135. test 'recursive trigger - 2 trigger will not trigger next trigger' do
  136. Trigger.create!(
  137. name: '1) set prio to 3 high',
  138. condition: {
  139. 'ticket.action' => {
  140. 'operator' => 'is',
  141. 'value' => 'create',
  142. },
  143. 'ticket.priority_id' => {
  144. 'operator' => 'is',
  145. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  146. },
  147. },
  148. perform: {
  149. 'ticket.priority_id' => {
  150. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  151. },
  152. },
  153. disable_notification: true,
  154. active: true,
  155. created_by_id: 1,
  156. updated_by_id: 1,
  157. )
  158. Trigger.create!(
  159. name: '2) set state to open',
  160. condition: {
  161. 'ticket.action' => {
  162. 'operator' => 'is',
  163. 'value' => 'create',
  164. },
  165. 'ticket.priority_id' => {
  166. 'operator' => 'is',
  167. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  168. },
  169. },
  170. perform: {
  171. 'ticket.state_id' => {
  172. 'value' => Ticket::State.lookup(name: 'open').id.to_s,
  173. },
  174. },
  175. disable_notification: true,
  176. active: true,
  177. created_by_id: 1,
  178. updated_by_id: 1,
  179. )
  180. Trigger.create!(
  181. name: '3) set state to closed',
  182. condition: {
  183. 'ticket.action' => {
  184. 'operator' => 'is',
  185. 'value' => 'create',
  186. },
  187. 'ticket.priority_id' => {
  188. 'operator' => 'is',
  189. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  190. },
  191. 'ticket.state_id' => {
  192. 'operator' => 'is',
  193. 'value' => Ticket::State.lookup(name: 'open').id.to_s,
  194. },
  195. },
  196. perform: {
  197. 'ticket.state_id' => {
  198. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  199. },
  200. },
  201. disable_notification: true,
  202. active: true,
  203. created_by_id: 1,
  204. updated_by_id: 1,
  205. )
  206. email_raw_string = 'From: me@example.com
  207. To: customer@example.com
  208. Subject: some new subject
  209. Some Text'
  210. ticket_p, _article_p, _user_p, _mail = Channel::EmailParser.new.process({}, email_raw_string)
  211. assert_equal('some new subject', ticket_p.title)
  212. assert_equal('Users', ticket_p.group.name)
  213. assert_equal('3 high', ticket_p.priority.name)
  214. assert_equal('new', ticket_p.state.name)
  215. assert_equal(1, ticket_p.articles.count, 'ticket1.articles verify')
  216. end
  217. test 'recursive trigger - 2 trigger will trigger next trigger - case 1' do
  218. Trigger.create!(
  219. name: '1) set state to closed',
  220. condition: {
  221. 'ticket.action' => {
  222. 'operator' => 'is',
  223. 'value' => 'create',
  224. },
  225. 'ticket.priority_id' => {
  226. 'operator' => 'is',
  227. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  228. },
  229. 'ticket.state_id' => {
  230. 'operator' => 'is',
  231. 'value' => Ticket::State.lookup(name: 'open').id.to_s,
  232. },
  233. },
  234. perform: {
  235. 'ticket.state_id' => {
  236. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  237. },
  238. },
  239. disable_notification: true,
  240. active: true,
  241. created_by_id: 1,
  242. updated_by_id: 1,
  243. )
  244. Trigger.create!(
  245. name: '2) set prio to 3 high',
  246. condition: {
  247. 'ticket.action' => {
  248. 'operator' => 'is',
  249. 'value' => 'create',
  250. },
  251. 'ticket.priority_id' => {
  252. 'operator' => 'is',
  253. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  254. },
  255. },
  256. perform: {
  257. 'ticket.priority_id' => {
  258. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  259. },
  260. },
  261. disable_notification: true,
  262. active: true,
  263. created_by_id: 1,
  264. updated_by_id: 1,
  265. )
  266. Trigger.create!(
  267. name: '3) set state to open',
  268. condition: {
  269. 'ticket.action' => {
  270. 'operator' => 'is',
  271. 'value' => 'create',
  272. },
  273. },
  274. perform: {
  275. 'ticket.state_id' => {
  276. 'value' => Ticket::State.lookup(name: 'open').id.to_s,
  277. },
  278. },
  279. disable_notification: true,
  280. active: true,
  281. created_by_id: 1,
  282. updated_by_id: 1,
  283. )
  284. email_raw_string = 'From: me@example.com
  285. To: customer@example.com
  286. Subject: some new subject
  287. Some Text'
  288. ticket_p, _article_p, _user_p, _mail = Channel::EmailParser.new.process({}, email_raw_string)
  289. assert_equal('some new subject', ticket_p.title)
  290. assert_equal('Users', ticket_p.group.name)
  291. assert_equal('3 high', ticket_p.priority.name)
  292. assert_equal('closed', ticket_p.state.name)
  293. assert_equal(1, ticket_p.articles.count, 'ticket1.articles verify')
  294. end
  295. test 'recursive trigger - 2 trigger will trigger next trigger - case 2' do
  296. Trigger.create!(
  297. name: '1) set prio to 3 high',
  298. condition: {
  299. 'ticket.action' => {
  300. 'operator' => 'is',
  301. 'value' => 'create',
  302. },
  303. 'ticket.priority_id' => {
  304. 'operator' => 'is',
  305. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  306. },
  307. 'ticket.state_id' => {
  308. 'operator' => 'is',
  309. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  310. },
  311. },
  312. perform: {
  313. 'ticket.priority_id' => {
  314. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  315. },
  316. },
  317. disable_notification: true,
  318. active: true,
  319. created_by_id: 1,
  320. updated_by_id: 1,
  321. )
  322. Trigger.create!(
  323. name: '2) set state to closed',
  324. condition: {
  325. 'ticket.action' => {
  326. 'operator' => 'is',
  327. 'value' => 'create',
  328. },
  329. 'ticket.priority_id' => {
  330. 'operator' => 'is',
  331. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  332. },
  333. 'ticket.state_id' => {
  334. 'operator' => 'is',
  335. 'value' => Ticket::State.lookup(name: 'open').id.to_s,
  336. },
  337. },
  338. perform: {
  339. 'ticket.state_id' => {
  340. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  341. },
  342. },
  343. disable_notification: true,
  344. active: true,
  345. created_by_id: 1,
  346. updated_by_id: 1,
  347. )
  348. Trigger.create!(
  349. name: '3) set state to open',
  350. condition: {
  351. 'ticket.action' => {
  352. 'operator' => 'is',
  353. 'value' => 'create',
  354. },
  355. },
  356. perform: {
  357. 'ticket.state_id' => {
  358. 'value' => Ticket::State.lookup(name: 'open').id.to_s,
  359. },
  360. },
  361. disable_notification: true,
  362. active: true,
  363. created_by_id: 1,
  364. updated_by_id: 1,
  365. )
  366. email_raw_string = 'From: me@example.com
  367. To: customer@example.com
  368. Subject: some new subject
  369. Some Text'
  370. ticket_p, _article_p, _user_p, _mail = Channel::EmailParser.new.process({}, email_raw_string)
  371. assert_equal('some new subject', ticket_p.title)
  372. assert_equal('Users', ticket_p.group.name)
  373. assert_equal('3 high', ticket_p.priority.name)
  374. assert_equal('closed', ticket_p.state.name)
  375. assert_equal(1, ticket_p.articles.count, 'ticket1.articles verify')
  376. end
  377. test 'trigger based move and verify correct agent notifications' do
  378. group1 = Group.create!(
  379. name: 'Group 1',
  380. active: true,
  381. email_address: EmailAddress.first,
  382. created_by_id: 1,
  383. updated_by_id: 1,
  384. )
  385. group2 = Group.create!(
  386. name: 'Group 2',
  387. active: true,
  388. email_address: EmailAddress.first,
  389. created_by_id: 1,
  390. updated_by_id: 1,
  391. )
  392. group3 = Group.create!(
  393. name: 'Group 3',
  394. active: true,
  395. email_address: EmailAddress.first,
  396. created_by_id: 1,
  397. updated_by_id: 1,
  398. )
  399. roles = Role.where(name: 'Agent')
  400. user1 = User.create!(
  401. login: 'trigger1@example.org',
  402. firstname: 'trigger1',
  403. lastname: 'trigger1',
  404. email: 'trigger1@example.org',
  405. password: 'some_pass',
  406. active: true,
  407. groups: [group1],
  408. roles: roles,
  409. created_by_id: 1,
  410. updated_by_id: 1,
  411. )
  412. user2 = User.create!(
  413. login: 'trigger2@example.org',
  414. firstname: 'trigger2',
  415. lastname: 'trigger2',
  416. email: 'trigger2@example.org',
  417. password: 'some_pass',
  418. active: true,
  419. groups: [group2],
  420. roles: roles,
  421. created_by_id: 1,
  422. updated_by_id: 1,
  423. )
  424. # trigger, move ticket created in group1 into group3 and then into group2
  425. Trigger.create_or_update(
  426. name: '1 dispatch',
  427. condition: {
  428. 'ticket.action' => {
  429. 'operator' => 'is',
  430. 'value' => 'create',
  431. },
  432. 'ticket.group_id' => {
  433. 'operator' => 'is',
  434. 'value' => group3.id.to_s,
  435. },
  436. 'ticket.state_id' => {
  437. 'operator' => 'is',
  438. 'value' => Ticket::State.lookup(name: 'new').id.to_s,
  439. },
  440. },
  441. perform: {
  442. 'ticket.group_id' => {
  443. 'value' => group2.id.to_s,
  444. },
  445. },
  446. disable_notification: true,
  447. active: true,
  448. created_by_id: 1,
  449. updated_by_id: 1,
  450. )
  451. Trigger.create_or_update(
  452. name: '2 dispatch',
  453. condition: {
  454. 'ticket.action' => {
  455. 'operator' => 'is',
  456. 'value' => 'create',
  457. },
  458. 'ticket.state_id' => {
  459. 'operator' => 'is',
  460. 'value' => Ticket::State.lookup(name: 'new').id.to_s,
  461. },
  462. },
  463. perform: {
  464. 'ticket.group_id' => {
  465. 'value' => group3.id.to_s,
  466. },
  467. },
  468. disable_notification: true,
  469. active: true,
  470. created_by_id: 1,
  471. updated_by_id: 1,
  472. )
  473. ticket1 = Ticket.create!(
  474. title: '123',
  475. group: group1,
  476. customer_id: 2,
  477. state: Ticket::State.lookup(name: 'new'),
  478. priority: Ticket::Priority.lookup(name: '2 normal'),
  479. updated_by_id: 1,
  480. created_by_id: 1,
  481. )
  482. assert(ticket1)
  483. assert_equal(ticket1.title, '123')
  484. assert_equal(ticket1.group.name, group1.name)
  485. assert_equal(ticket1.state.name, 'new')
  486. Ticket::Article.create!(
  487. ticket_id: ticket1.id,
  488. from: 'some_sender@example.com',
  489. to: 'some_recipient@example.com',
  490. subject: 'some subject',
  491. message_id: 'some@id',
  492. body: 'some message',
  493. internal: false,
  494. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  495. type: Ticket::Article::Type.find_by(name: 'email'),
  496. updated_by_id: 1,
  497. created_by_id: 1,
  498. )
  499. # verfiy if agent1 got no notifcation
  500. assert_equal(0, NotificationFactory::Mailer.already_sent?(ticket1, user1, 'email'), ticket1.id)
  501. # verfiy if agent2 got no notifcation
  502. assert_equal(0, NotificationFactory::Mailer.already_sent?(ticket1, user2, 'email'), ticket1.id)
  503. TransactionDispatcher.commit
  504. Scheduler.worker(true)
  505. ticket1.reload
  506. assert_equal('123', ticket1.title)
  507. assert_equal(group2.name, ticket1.group.name)
  508. assert_equal('new', ticket1.state.name)
  509. assert_equal('2 normal', ticket1.priority.name)
  510. assert_equal(1, ticket1.articles.count)
  511. # verfiy if agent1 got no notifcation
  512. assert_equal(0, NotificationFactory::Mailer.already_sent?(ticket1, user1, 'email'), ticket1.id)
  513. # verfiy if agent2 got notifcation
  514. assert_equal(1, NotificationFactory::Mailer.already_sent?(ticket1, user2, 'email'), ticket1.id)
  515. end
  516. test 'recursive trigger loop check' do
  517. Setting.set('ticket_trigger_recursive_max_loop', 2)
  518. Trigger.create!(
  519. name: '000',
  520. condition: {
  521. 'ticket.action' => {
  522. 'operator' => 'is',
  523. 'value' => 'create',
  524. },
  525. 'ticket.priority_id' => {
  526. 'operator' => 'is',
  527. 'value' => Ticket::Priority.lookup(name: '1 low').id.to_s,
  528. },
  529. },
  530. perform: {
  531. 'ticket.state_id' => {
  532. 'value' => Ticket::State.lookup(name: 'closed').id.to_s,
  533. },
  534. },
  535. disable_notification: true,
  536. active: true,
  537. created_by_id: 1,
  538. updated_by_id: 1,
  539. )
  540. Trigger.create!(
  541. name: '001',
  542. condition: {
  543. 'ticket.action' => {
  544. 'operator' => 'is',
  545. 'value' => 'create',
  546. },
  547. 'ticket.priority_id' => {
  548. 'operator' => 'is',
  549. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  550. },
  551. },
  552. perform: {
  553. 'ticket.priority_id' => {
  554. 'value' => Ticket::Priority.lookup(name: '1 low').id.to_s,
  555. },
  556. },
  557. disable_notification: true,
  558. active: true,
  559. created_by_id: 1,
  560. updated_by_id: 1,
  561. )
  562. Trigger.create!(
  563. name: '002',
  564. condition: {
  565. 'ticket.action' => {
  566. 'operator' => 'is',
  567. 'value' => 'create',
  568. },
  569. 'ticket.priority_id' => {
  570. 'operator' => 'is',
  571. 'value' => Ticket::Priority.lookup(name: '2 normal').id.to_s,
  572. },
  573. },
  574. perform: {
  575. 'ticket.priority_id' => {
  576. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  577. },
  578. },
  579. disable_notification: true,
  580. active: true,
  581. created_by_id: 1,
  582. updated_by_id: 1,
  583. )
  584. group1 = Group.find_by(name: 'Users')
  585. ticket1 = Ticket.create!(
  586. title: '123',
  587. group: group1,
  588. customer_id: 2,
  589. state: Ticket::State.lookup(name: 'new'),
  590. priority: Ticket::Priority.lookup(name: '2 normal'),
  591. updated_by_id: 1,
  592. created_by_id: 1,
  593. )
  594. assert(ticket1)
  595. assert_equal(ticket1.title, '123')
  596. assert_equal(ticket1.group.name, group1.name)
  597. assert_equal(ticket1.state.name, 'new')
  598. Ticket::Article.create!(
  599. ticket_id: ticket1.id,
  600. from: 'some_sender@example.com',
  601. to: 'some_recipient@example.com',
  602. subject: 'some subject',
  603. message_id: 'some@id',
  604. body: 'some message',
  605. internal: false,
  606. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  607. type: Ticket::Article::Type.find_by(name: 'email'),
  608. updated_by_id: 1,
  609. created_by_id: 1,
  610. )
  611. TransactionDispatcher.commit
  612. Scheduler.worker(true)
  613. ticket1.reload
  614. assert_equal('123', ticket1.title)
  615. assert_equal('new', ticket1.state.name)
  616. assert_equal('1 low', ticket1.priority.name)
  617. assert_equal(1, ticket1.articles.count)
  618. Setting.set('ticket_trigger_recursive_max_loop', 3)
  619. ticket1 = Ticket.create!(
  620. title: '123',
  621. group: group1,
  622. customer_id: 2,
  623. state: Ticket::State.lookup(name: 'new'),
  624. priority: Ticket::Priority.lookup(name: '2 normal'),
  625. updated_by_id: 1,
  626. created_by_id: 1,
  627. )
  628. assert(ticket1)
  629. assert_equal(ticket1.title, '123')
  630. assert_equal(ticket1.group.name, group1.name)
  631. assert_equal(ticket1.state.name, 'new')
  632. Ticket::Article.create!(
  633. ticket_id: ticket1.id,
  634. from: 'some_sender@example.com',
  635. to: 'some_recipient@example.com',
  636. subject: 'some subject',
  637. message_id: 'some@id',
  638. body: 'some message',
  639. internal: false,
  640. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  641. type: Ticket::Article::Type.find_by(name: 'email'),
  642. updated_by_id: 1,
  643. created_by_id: 1,
  644. )
  645. TransactionDispatcher.commit
  646. Scheduler.worker(true)
  647. ticket1.reload
  648. assert_equal('123', ticket1.title)
  649. assert_equal('closed', ticket1.state.name)
  650. assert_equal('1 low', ticket1.priority.name)
  651. assert_equal(1, ticket1.articles.count)
  652. end
  653. test 'recursive trigger with auto responder' do
  654. group1 = Group.create!(
  655. name: 'Group dispatch',
  656. active: true,
  657. created_by_id: 1,
  658. updated_by_id: 1,
  659. )
  660. group2 = Group.create!(
  661. name: 'Group with auto responder',
  662. active: true,
  663. email_address: EmailAddress.first,
  664. created_by_id: 1,
  665. updated_by_id: 1,
  666. )
  667. Trigger.create!(
  668. name: "002 - move ticket to #{group2.name}",
  669. condition: {
  670. 'ticket.action' => {
  671. 'operator' => 'is',
  672. 'value' => 'create',
  673. },
  674. 'ticket.group_id' => {
  675. 'operator' => 'is',
  676. 'value' => group1.id.to_s,
  677. },
  678. 'ticket.organization_id' => {
  679. 'operator' => 'is',
  680. 'pre_condition' => 'specific',
  681. 'value' => User.lookup(email: 'nicole.braun@zammad.org').organization_id.to_s,
  682. }
  683. },
  684. perform: {
  685. 'ticket.group_id' => {
  686. 'value' => group2.id.to_s,
  687. },
  688. },
  689. disable_notification: true,
  690. active: true,
  691. created_by_id: 1,
  692. updated_by_id: 1,
  693. )
  694. Trigger.create_or_update(
  695. name: "001 auto reply for tickets in group #{group1.name}",
  696. condition: {
  697. 'ticket.action' => {
  698. 'operator' => 'is',
  699. 'value' => 'create',
  700. },
  701. 'ticket.state_id' => {
  702. 'operator' => 'is',
  703. 'value' => Ticket::State.lookup(name: 'new').id.to_s,
  704. },
  705. 'ticket.group_id' => {
  706. 'operator' => 'is not',
  707. 'value' => group1.id.to_s,
  708. },
  709. },
  710. perform: {
  711. 'notification.email' => {
  712. 'body' => "some text<br>\#{ticket.customer.lastname}<br>\#{ticket.title}<br>\#{article.body}",
  713. 'recipient' => 'ticket_customer',
  714. 'subject' => "Thanks for your inquiry (\#{ticket.title})!",
  715. },
  716. 'ticket.priority_id' => {
  717. 'value' => Ticket::Priority.lookup(name: '3 high').id.to_s,
  718. },
  719. 'ticket.tags' => {
  720. 'operator' => 'add',
  721. 'value' => 'aa, kk',
  722. },
  723. },
  724. disable_notification: true,
  725. active: true,
  726. created_by_id: 1,
  727. updated_by_id: 1,
  728. )
  729. ticket1 = Ticket.create!(
  730. title: "some <b>title</b>\n äöüß",
  731. group: group1,
  732. customer: User.lookup(email: 'nicole.braun@zammad.org'),
  733. updated_by_id: 1,
  734. created_by_id: 1,
  735. )
  736. Ticket::Article.create!(
  737. ticket_id: ticket1.id,
  738. from: 'some_sender@example.com',
  739. to: 'some_recipient@example.com',
  740. subject: 'some subject',
  741. message_id: 'some@id',
  742. body: "some message <b>note</b>\nnew line",
  743. internal: false,
  744. sender: Ticket::Article::Sender.find_by(name: 'Customer'),
  745. type: Ticket::Article::Type.find_by(name: 'web'),
  746. updated_by_id: 1,
  747. created_by_id: 1,
  748. )
  749. ticket1.reload
  750. assert_equal('some <b>title</b> äöüß', ticket1.title, 'ticket1.title verify')
  751. assert_equal('Group dispatch', ticket1.group.name, 'ticket1.group verify')
  752. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  753. assert_equal('2 normal', ticket1.priority.name, 'ticket1.priority verify')
  754. assert_equal(1, ticket1.articles.count, 'ticket1.articles verify')
  755. assert_equal([], ticket1.tag_list)
  756. TransactionDispatcher.commit
  757. ticket1.reload
  758. assert_equal('some <b>title</b> äöüß', ticket1.title, 'ticket1.title verify')
  759. assert_equal('Group with auto responder', ticket1.group.name, 'ticket1.group verify')
  760. assert_equal('new', ticket1.state.name, 'ticket1.state verify')
  761. assert_equal('3 high', ticket1.priority.name, 'ticket1.priority verify')
  762. assert_equal(2, ticket1.articles.count, 'ticket1.articles verify')
  763. assert_equal(%w[aa kk], ticket1.tag_list)
  764. email_raw = "From: nicole.braun@zammad.org
  765. To: zammad@example.com
  766. Subject: test 1
  767. X-Zammad-Ticket-Group: #{group1.name}
  768. test 1"
  769. ticket2, _article2, _user2 = Channel::EmailParser.new.process({ trusted: true }, email_raw)
  770. assert_equal('test 1', ticket2.title, 'ticket2.title verify')
  771. assert_equal('Group with auto responder', ticket2.group.name, 'ticket2.group verify')
  772. assert_equal('new', ticket2.state.name, 'ticket2.state verify')
  773. assert_equal('3 high', ticket2.priority.name, 'ticket2.priority verify')
  774. assert_equal(2, ticket2.articles.count, 'ticket2.articles verify')
  775. assert_equal(%w[aa kk], ticket2.tag_list)
  776. end
  777. end