conditions_spec.rb 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922
  1. # Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. require 'models/core_workflow/base'
  4. RSpec.describe 'CoreWorkflow > Conditions', mariadb: true, type: :model do
  5. include_context 'with core workflow base'
  6. describe '.perform - Condition - today' do
  7. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  8. let(:payload) do
  9. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  10. end
  11. context 'when match' do
  12. before do
  13. travel_to DateTime.new 2023, 7, 21, 7, 0
  14. end
  15. let!(:workflow) do
  16. create(:core_workflow,
  17. object: 'Ticket',
  18. condition_selected: {
  19. 'ticket.created_at': {
  20. operator: 'today',
  21. },
  22. })
  23. end
  24. it 'does match' do
  25. expect(result[:matched_workflows]).to include(workflow.id)
  26. end
  27. end
  28. context 'when mismatch' do
  29. before do
  30. travel_to DateTime.new 2023, 8, 21, 7, 0
  31. end
  32. let!(:workflow) do
  33. create(:core_workflow,
  34. object: 'Ticket',
  35. condition_selected: {
  36. 'ticket.created_at': {
  37. operator: 'today',
  38. },
  39. })
  40. end
  41. it 'does not match' do
  42. expect(result[:matched_workflows]).not_to include(workflow.id)
  43. end
  44. end
  45. end
  46. describe '.perform - Condition - after (absolute)' do
  47. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  48. let(:payload) do
  49. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  50. end
  51. context 'when match' do
  52. let!(:workflow) do
  53. create(:core_workflow,
  54. object: 'Ticket',
  55. condition_selected: {
  56. 'ticket.created_at': {
  57. operator: 'after (absolute)',
  58. value: DateTime.new(2023, 7, 21, 9, 0).to_s
  59. },
  60. })
  61. end
  62. it 'does match' do
  63. expect(result[:matched_workflows]).to include(workflow.id)
  64. end
  65. end
  66. context 'when mismatch' do
  67. let!(:workflow) do
  68. create(:core_workflow,
  69. object: 'Ticket',
  70. condition_selected: {
  71. 'ticket.created_at': {
  72. operator: 'after (absolute)',
  73. value: DateTime.new(2023, 7, 21, 11, 0).to_s
  74. },
  75. })
  76. end
  77. it 'does not match' do
  78. expect(result[:matched_workflows]).not_to include(workflow.id)
  79. end
  80. end
  81. end
  82. describe '.perform - Condition - after (relative)' do
  83. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  84. let(:payload) do
  85. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  86. end
  87. before do
  88. travel_to DateTime.new 2023, 7, 21, 7, 0
  89. end
  90. context 'when match' do
  91. let!(:workflow) do
  92. create(:core_workflow,
  93. object: 'Ticket',
  94. condition_selected: {
  95. 'ticket.created_at': {
  96. operator: 'after (relative)',
  97. range: 'hour',
  98. value: '1',
  99. },
  100. })
  101. end
  102. it 'does match' do
  103. expect(result[:matched_workflows]).to include(workflow.id)
  104. end
  105. end
  106. context 'when mismatch' do
  107. let!(:workflow) do
  108. create(:core_workflow,
  109. object: 'Ticket',
  110. condition_selected: {
  111. 'ticket.created_at': {
  112. operator: 'after (relative)',
  113. range: 'hour',
  114. value: '4',
  115. },
  116. })
  117. end
  118. it 'does not match' do
  119. expect(result[:matched_workflows]).not_to include(workflow.id)
  120. end
  121. end
  122. end
  123. describe '.perform - Condition - before (absolute)' do
  124. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  125. let(:payload) do
  126. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  127. end
  128. context 'when match' do
  129. let!(:workflow) do
  130. create(:core_workflow,
  131. object: 'Ticket',
  132. condition_selected: {
  133. 'ticket.created_at': {
  134. operator: 'before (absolute)',
  135. value: DateTime.new(2023, 7, 21, 11, 0).to_s
  136. },
  137. })
  138. end
  139. it 'does match' do
  140. expect(result[:matched_workflows]).to include(workflow.id)
  141. end
  142. end
  143. context 'when mismatch' do
  144. let!(:workflow) do
  145. create(:core_workflow,
  146. object: 'Ticket',
  147. condition_selected: {
  148. 'ticket.created_at': {
  149. operator: 'before (absolute)',
  150. value: DateTime.new(2023, 7, 21, 9, 0).to_s
  151. },
  152. })
  153. end
  154. it 'does not match' do
  155. expect(result[:matched_workflows]).not_to include(workflow.id)
  156. end
  157. end
  158. end
  159. describe '.perform - Condition - before (relative)' do
  160. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  161. let(:payload) do
  162. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  163. end
  164. before do
  165. travel_to DateTime.new 2023, 7, 21, 12, 0
  166. end
  167. context 'when match' do
  168. let!(:workflow) do
  169. create(:core_workflow,
  170. object: 'Ticket',
  171. condition_selected: {
  172. 'ticket.created_at': {
  173. operator: 'before (relative)',
  174. range: 'hour',
  175. value: '1',
  176. },
  177. })
  178. end
  179. it 'does match' do
  180. expect(result[:matched_workflows]).to include(workflow.id)
  181. end
  182. end
  183. context 'when mismatch' do
  184. let!(:workflow) do
  185. create(:core_workflow,
  186. object: 'Ticket',
  187. condition_selected: {
  188. 'ticket.created_at': {
  189. operator: 'before (relative)',
  190. range: 'hour',
  191. value: '4',
  192. },
  193. })
  194. end
  195. it 'does not match' do
  196. expect(result[:matched_workflows]).not_to include(workflow.id)
  197. end
  198. end
  199. context 'when empty' do
  200. let(:payload) do
  201. base_payload
  202. end
  203. let!(:workflow) do
  204. create(:core_workflow,
  205. object: 'Ticket',
  206. condition_selected: {
  207. 'ticket.created_at': {
  208. operator: 'before (relative)',
  209. range: 'month',
  210. value: '1',
  211. },
  212. })
  213. end
  214. it 'does not match' do
  215. expect(result[:matched_workflows]).not_to include(workflow.id)
  216. end
  217. end
  218. end
  219. describe '.perform - Condition - from (relative)' do
  220. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  221. let(:payload) do
  222. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  223. end
  224. before do
  225. travel_to DateTime.new 2023, 7, 21, 12, 0
  226. end
  227. context 'when match' do
  228. let!(:workflow) do
  229. create(:core_workflow,
  230. object: 'Ticket',
  231. condition_selected: {
  232. 'ticket.created_at': {
  233. operator: 'from (relative)',
  234. range: 'hour',
  235. value: '4',
  236. },
  237. })
  238. end
  239. it 'does match' do
  240. expect(result[:matched_workflows]).to include(workflow.id)
  241. end
  242. end
  243. context 'when mismatch' do
  244. let!(:workflow) do
  245. create(:core_workflow,
  246. object: 'Ticket',
  247. condition_selected: {
  248. 'ticket.created_at': {
  249. operator: 'from (relative)',
  250. range: 'hour',
  251. value: '1',
  252. },
  253. })
  254. end
  255. it 'does not match' do
  256. expect(result[:matched_workflows]).not_to include(workflow.id)
  257. end
  258. end
  259. end
  260. describe '.perform - Condition - till (relative)' do
  261. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  262. let(:payload) do
  263. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  264. end
  265. before do
  266. travel_to DateTime.new 2023, 7, 21, 8, 0
  267. end
  268. context 'when match' do
  269. let!(:workflow) do
  270. create(:core_workflow,
  271. object: 'Ticket',
  272. condition_selected: {
  273. 'ticket.created_at': {
  274. operator: 'till (relative)',
  275. range: 'hour',
  276. value: '4',
  277. },
  278. })
  279. end
  280. it 'does match' do
  281. expect(result[:matched_workflows]).to include(workflow.id)
  282. end
  283. end
  284. context 'when mismatch' do
  285. let!(:workflow) do
  286. create(:core_workflow,
  287. object: 'Ticket',
  288. condition_selected: {
  289. 'ticket.created_at': {
  290. operator: 'till (relative)',
  291. range: 'hour',
  292. value: '1',
  293. },
  294. })
  295. end
  296. it 'does not match' do
  297. expect(result[:matched_workflows]).not_to include(workflow.id)
  298. end
  299. end
  300. end
  301. describe '.perform - Condition - within last (relative)' do
  302. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  303. let(:payload) do
  304. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  305. end
  306. before do
  307. travel_to DateTime.new 2023, 7, 21, 12, 0
  308. end
  309. context 'when match' do
  310. let!(:workflow) do
  311. create(:core_workflow,
  312. object: 'Ticket',
  313. condition_selected: {
  314. 'ticket.created_at': {
  315. operator: 'within last (relative)',
  316. range: 'hour',
  317. value: '4',
  318. },
  319. })
  320. end
  321. it 'does match' do
  322. expect(result[:matched_workflows]).to include(workflow.id)
  323. end
  324. end
  325. context 'when mismatch' do
  326. let!(:workflow) do
  327. create(:core_workflow,
  328. object: 'Ticket',
  329. condition_selected: {
  330. 'ticket.created_at': {
  331. operator: 'within last (relative)',
  332. range: 'hour',
  333. value: '1',
  334. },
  335. })
  336. end
  337. it 'does not match' do
  338. expect(result[:matched_workflows]).not_to include(workflow.id)
  339. end
  340. end
  341. end
  342. describe '.perform - Condition - within next (relative)' do
  343. let(:ticket_created_at) { DateTime.new 2023, 7, 21, 10, 0 }
  344. let(:payload) do
  345. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  346. end
  347. before do
  348. travel_to DateTime.new 2023, 7, 21, 8, 0
  349. end
  350. context 'when match' do
  351. let!(:workflow) do
  352. create(:core_workflow,
  353. object: 'Ticket',
  354. condition_selected: {
  355. 'ticket.created_at': {
  356. operator: 'within next (relative)',
  357. range: 'hour',
  358. value: '4',
  359. },
  360. })
  361. end
  362. it 'does match' do
  363. expect(result[:matched_workflows]).to include(workflow.id)
  364. end
  365. end
  366. context 'when mismatch' do
  367. let!(:workflow) do
  368. create(:core_workflow,
  369. object: 'Ticket',
  370. condition_selected: {
  371. 'ticket.created_at': {
  372. operator: 'within next (relative)',
  373. range: 'hour',
  374. value: '1',
  375. },
  376. })
  377. end
  378. it 'does not match' do
  379. expect(result[:matched_workflows]).not_to include(workflow.id)
  380. end
  381. end
  382. end
  383. describe '.perform - Condition - Mention User IDs' do
  384. let(:payload) do
  385. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  386. end
  387. before do
  388. ticket.mentions.create!(user: action_user, created_by_id: 1, updated_by_id: 1)
  389. end
  390. context 'when pre_condtion specific' do
  391. context 'when match' do
  392. let!(:workflow) do
  393. create(:core_workflow,
  394. object: 'Ticket',
  395. condition_selected: {
  396. 'ticket.mention_user_ids': {
  397. pre_condition: 'specific',
  398. operator: 'is',
  399. value: [action_user.id.to_s],
  400. },
  401. })
  402. end
  403. it 'does match' do
  404. expect(result[:matched_workflows]).to include(workflow.id)
  405. end
  406. end
  407. context 'when mismatch' do
  408. let!(:workflow) do
  409. create(:core_workflow,
  410. object: 'Ticket',
  411. condition_selected: {
  412. 'ticket.mention_user_ids': {
  413. pre_condition: 'specific',
  414. operator: 'is',
  415. value: ['999'],
  416. },
  417. })
  418. end
  419. it 'does not match' do
  420. expect(result[:matched_workflows]).not_to include(workflow.id)
  421. end
  422. end
  423. end
  424. context 'when pre_condtion current_user.id' do
  425. context 'when match' do
  426. let!(:workflow) do
  427. create(:core_workflow,
  428. object: 'Ticket',
  429. condition_selected: {
  430. 'ticket.mention_user_ids': {
  431. pre_condition: 'current_user.id',
  432. operator: 'is',
  433. value: [],
  434. },
  435. })
  436. end
  437. it 'does match' do
  438. expect(result[:matched_workflows]).to include(workflow.id)
  439. end
  440. end
  441. context 'when mismatch' do
  442. let!(:workflow) do
  443. create(:core_workflow,
  444. object: 'Ticket',
  445. condition_selected: {
  446. 'ticket.mention_user_ids': {
  447. pre_condition: 'current_user.id',
  448. operator: 'is',
  449. value: [],
  450. },
  451. })
  452. end
  453. before do
  454. ticket.mentions.destroy_all
  455. end
  456. it 'does not match' do
  457. expect(result[:matched_workflows]).not_to include(workflow.id)
  458. end
  459. end
  460. end
  461. context 'when pre_condtion not_set' do
  462. context 'when match' do
  463. let!(:workflow) do
  464. create(:core_workflow,
  465. object: 'Ticket',
  466. condition_selected: {
  467. 'ticket.mention_user_ids': {
  468. pre_condition: 'not_set',
  469. operator: 'is',
  470. value: [],
  471. },
  472. })
  473. end
  474. before do
  475. ticket.mentions.destroy_all
  476. end
  477. it 'does match' do
  478. expect(result[:matched_workflows]).to include(workflow.id)
  479. end
  480. end
  481. context 'when mismatch' do
  482. let!(:workflow) do
  483. create(:core_workflow,
  484. object: 'Ticket',
  485. condition_selected: {
  486. 'ticket.mention_user_ids': {
  487. pre_condition: 'not_set',
  488. operator: 'is',
  489. value: [],
  490. },
  491. })
  492. end
  493. it 'does not match' do
  494. expect(result[:matched_workflows]).not_to include(workflow.id)
  495. end
  496. end
  497. end
  498. end
  499. describe '.perform - Condition - Tags' do
  500. context 'when create' do
  501. context 'when match' do
  502. let(:payload) do
  503. base_payload.merge('params' => { 'tags' => 'special, special2' })
  504. end
  505. let!(:workflow) do
  506. create(:core_workflow,
  507. object: 'Ticket',
  508. condition_selected: {
  509. 'ticket.tags': {
  510. operator: 'contains all',
  511. value: ['special'],
  512. },
  513. })
  514. end
  515. it 'does match' do
  516. expect(result[:matched_workflows]).to include(workflow.id)
  517. end
  518. end
  519. context 'when mismatch' do
  520. let(:payload) do
  521. base_payload.merge('params' => { 'tags' => 'special' }, 'screen' => 'create')
  522. end
  523. let!(:workflow) do
  524. create(:core_workflow,
  525. object: 'Ticket',
  526. condition_selected: {
  527. 'ticket.tags': {
  528. operator: 'contains all',
  529. value: ['NOPE'],
  530. },
  531. })
  532. end
  533. it 'does not match' do
  534. expect(result[:matched_workflows]).not_to include(workflow.id)
  535. end
  536. end
  537. end
  538. context 'when edit' do
  539. let(:payload) do
  540. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  541. end
  542. before do
  543. ticket.tag_add('special', 1)
  544. end
  545. context 'when match' do
  546. let!(:workflow) do
  547. create(:core_workflow,
  548. object: 'Ticket',
  549. condition_selected: {
  550. 'ticket.tags': {
  551. operator: 'contains all',
  552. value: ['special'],
  553. },
  554. })
  555. end
  556. it 'does match' do
  557. expect(result[:matched_workflows]).to include(workflow.id)
  558. end
  559. end
  560. context 'when mismatch' do
  561. let!(:workflow) do
  562. create(:core_workflow,
  563. object: 'Ticket',
  564. condition_selected: {
  565. 'ticket.tags': {
  566. operator: 'contains all',
  567. value: ['NOPE'],
  568. },
  569. })
  570. end
  571. it 'does not match' do
  572. expect(result[:matched_workflows]).not_to include(workflow.id)
  573. end
  574. end
  575. end
  576. context 'when mobile create' do
  577. context 'when match' do
  578. let(:payload) do
  579. base_payload.merge('params' => { 'tags' => %w[special special2] })
  580. end
  581. let!(:workflow) do
  582. create(:core_workflow,
  583. object: 'Ticket',
  584. condition_selected: {
  585. 'ticket.tags': {
  586. operator: 'contains all',
  587. value: ['special'],
  588. },
  589. })
  590. end
  591. it 'does match' do
  592. expect(result[:matched_workflows]).to include(workflow.id)
  593. end
  594. end
  595. context 'when mismatch' do
  596. let(:payload) do
  597. base_payload.merge('params' => { 'tags' => ['special'] }, 'screen' => 'create')
  598. end
  599. let!(:workflow) do
  600. create(:core_workflow,
  601. object: 'Ticket',
  602. condition_selected: {
  603. 'ticket.tags': {
  604. operator: 'contains all',
  605. value: ['NOPE'],
  606. },
  607. })
  608. end
  609. it 'does not match' do
  610. expect(result[:matched_workflows]).not_to include(workflow.id)
  611. end
  612. end
  613. end
  614. context 'when contains one' do
  615. context 'when match' do
  616. let(:payload) do
  617. base_payload.merge('params' => { 'tags' => 'special, special2' })
  618. end
  619. let!(:workflow) do
  620. create(:core_workflow,
  621. object: 'Ticket',
  622. condition_selected: {
  623. 'ticket.tags': {
  624. operator: 'contains one',
  625. value: ['special'],
  626. },
  627. })
  628. end
  629. it 'does match' do
  630. expect(result[:matched_workflows]).to include(workflow.id)
  631. end
  632. end
  633. context 'when mismatch' do
  634. let(:payload) do
  635. base_payload.merge('params' => { 'tags' => 'special' }, 'screen' => 'create')
  636. end
  637. let!(:workflow) do
  638. create(:core_workflow,
  639. object: 'Ticket',
  640. condition_selected: {
  641. 'ticket.tags': {
  642. operator: 'contains one',
  643. value: ['NOPE'],
  644. },
  645. })
  646. end
  647. it 'does not match' do
  648. expect(result[:matched_workflows]).not_to include(workflow.id)
  649. end
  650. end
  651. end
  652. end
  653. describe '.perform - Condition - Article' do
  654. let(:payload) do
  655. base_payload.merge('params' => { 'article' => {
  656. body: 'hello',
  657. type: 'note',
  658. internal: true,
  659. form_id: '210458899',
  660. shared_draft_id: '',
  661. subtype: '',
  662. in_reply_to: '',
  663. to: '',
  664. cc: '',
  665. subject: '',
  666. from: 'Test Admin Agent',
  667. ticket_id: 5,
  668. content_type: 'text/html',
  669. sender_id: 1,
  670. type_id: 10
  671. } })
  672. end
  673. context 'when match' do
  674. let!(:workflow) do
  675. create(:core_workflow,
  676. object: 'Ticket',
  677. condition_selected: {
  678. 'article.body': {
  679. operator: 'matches regex',
  680. value: 'hello',
  681. },
  682. })
  683. end
  684. it 'does match' do
  685. expect(result[:matched_workflows]).to include(workflow.id)
  686. end
  687. end
  688. context 'when mismatch' do
  689. let!(:workflow) do
  690. create(:core_workflow,
  691. object: 'Ticket',
  692. condition_selected: {
  693. 'article.body': {
  694. operator: 'matches regex',
  695. value: 'NOPE',
  696. },
  697. })
  698. end
  699. it 'does not match' do
  700. expect(result[:matched_workflows]).not_to include(workflow.id)
  701. end
  702. end
  703. end
  704. describe '.perform - Condition - owner_id not set' do
  705. let!(:workflow) do
  706. create(:core_workflow,
  707. object: 'Ticket',
  708. condition_selected: {
  709. 'ticket.owner_id': {
  710. operator: 'not_set',
  711. },
  712. })
  713. end
  714. it 'does match' do
  715. expect(result[:matched_workflows]).to include(workflow.id)
  716. end
  717. describe 'for owner id 1' do
  718. let(:payload) do
  719. base_payload.merge(
  720. 'params' => { 'owner_id' => '1' },
  721. )
  722. end
  723. it 'does match' do
  724. expect(result[:matched_workflows]).to include(workflow.id)
  725. end
  726. end
  727. end
  728. describe '.perform - Condition - session.role_ids' do
  729. let!(:workflow) do
  730. create(:core_workflow,
  731. object: 'Ticket',
  732. condition_selected: {
  733. 'session.role_ids': {
  734. operator: 'is',
  735. value: [ Role.find_by(name: 'Agent').id.to_s ],
  736. },
  737. })
  738. end
  739. it 'does match' do
  740. expect(result[:matched_workflows]).to include(workflow.id)
  741. end
  742. describe 'for customer' do
  743. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  744. it 'does not match' do
  745. expect(result[:matched_workflows]).not_to include(workflow.id)
  746. end
  747. end
  748. end
  749. describe '.perform - Condition - session.group_ids_full' do
  750. let!(:workflow) do
  751. create(:core_workflow,
  752. object: 'Ticket',
  753. condition_selected: {
  754. 'session.group_ids_full': {
  755. operator: 'is',
  756. value: [ ticket.group.id.to_s ],
  757. },
  758. })
  759. end
  760. it 'does match' do
  761. expect(result[:matched_workflows]).to include(workflow.id)
  762. end
  763. describe 'for customer' do
  764. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  765. it 'does not match' do
  766. expect(result[:matched_workflows]).not_to include(workflow.id)
  767. end
  768. end
  769. end
  770. describe '.perform - Condition - session.group_ids_change' do
  771. let!(:workflow) do
  772. create(:core_workflow,
  773. object: 'Ticket',
  774. condition_selected: {
  775. 'session.group_ids_change': {
  776. operator: 'is',
  777. value: [ ticket.group.id.to_s ],
  778. },
  779. })
  780. end
  781. it 'does match' do
  782. expect(result[:matched_workflows]).to include(workflow.id)
  783. end
  784. describe 'for customer' do
  785. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  786. it 'does not match' do
  787. expect(result[:matched_workflows]).not_to include(workflow.id)
  788. end
  789. end
  790. end
  791. describe '.perform - Condition - session.group_ids_read' do
  792. let!(:workflow) do
  793. create(:core_workflow,
  794. object: 'Ticket',
  795. condition_selected: {
  796. 'session.group_ids_read': {
  797. operator: 'is',
  798. value: [ ticket.group.id.to_s ],
  799. },
  800. })
  801. end
  802. it 'does match' do
  803. expect(result[:matched_workflows]).to include(workflow.id)
  804. end
  805. describe 'for customer' do
  806. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  807. it 'does not match' do
  808. expect(result[:matched_workflows]).not_to include(workflow.id)
  809. end
  810. end
  811. end
  812. describe '.perform - Condition - session.group_ids_overview' do
  813. let!(:workflow) do
  814. create(:core_workflow,
  815. object: 'Ticket',
  816. condition_selected: {
  817. 'session.group_ids_overview': {
  818. operator: 'is',
  819. value: [ ticket.group.id.to_s ],
  820. },
  821. })
  822. end
  823. it 'does match' do
  824. expect(result[:matched_workflows]).to include(workflow.id)
  825. end
  826. describe 'for customer' do
  827. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  828. it 'does not match' do
  829. expect(result[:matched_workflows]).not_to include(workflow.id)
  830. end
  831. end
  832. end
  833. describe '.perform - Condition - session.group_ids_create' do
  834. let!(:workflow) do
  835. create(:core_workflow,
  836. object: 'Ticket',
  837. condition_selected: {
  838. 'session.group_ids_create': {
  839. operator: 'is',
  840. value: [ ticket.group.id.to_s ],
  841. },
  842. })
  843. end
  844. it 'does match' do
  845. expect(result[:matched_workflows]).to include(workflow.id)
  846. end
  847. describe 'for customer' do
  848. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  849. it 'does not match' do
  850. expect(result[:matched_workflows]).not_to include(workflow.id)
  851. end
  852. end
  853. end
  854. describe '.perform - Condition - session.permission_ids' do
  855. let!(:workflow) do
  856. create(:core_workflow,
  857. object: 'Ticket',
  858. condition_selected: {
  859. 'session.permission_ids': {
  860. operator: 'is',
  861. value: [ Permission.find_by(name: 'ticket.agent').id.to_s ],
  862. },
  863. })
  864. end
  865. it 'does match' do
  866. expect(result[:matched_workflows]).to include(workflow.id)
  867. end
  868. describe 'for customer' do
  869. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  870. it 'does not match' do
  871. expect(result[:matched_workflows]).not_to include(workflow.id)
  872. end
  873. end
  874. end
  875. describe '.perform - Condition - Matches regex' do
  876. let(:payload) do
  877. base_payload.merge(
  878. 'params' => { 'title' => 'workflow ticket' },
  879. )
  880. end
  881. let!(:workflow) do
  882. create(:core_workflow,
  883. object: 'Ticket',
  884. condition_selected: {
  885. 'ticket.title': {
  886. operator: 'matches regex',
  887. value: [ '^workflow' ],
  888. },
  889. })
  890. end
  891. it 'does match' do
  892. expect(result[:matched_workflows]).to include(workflow.id)
  893. end
  894. describe 'for invalid regex' do
  895. let!(:workflow) do
  896. create(:core_workflow,
  897. object: 'Ticket',
  898. condition_selected: {
  899. 'ticket.title': {
  900. operator: 'matches regex',
  901. value: [ '^workfluw' ],
  902. },
  903. })
  904. end
  905. it 'does not match' do
  906. expect(result[:matched_workflows]).not_to include(workflow.id)
  907. end
  908. end
  909. end
  910. describe '.perform - Condition - Does not match regex' do
  911. let(:payload) do
  912. base_payload.merge(
  913. 'params' => { 'title' => 'workflow ticket' },
  914. )
  915. end
  916. let!(:workflow) do
  917. create(:core_workflow,
  918. object: 'Ticket',
  919. condition_selected: {
  920. 'ticket.title': {
  921. operator: 'does not match regex',
  922. value: [ '^workfluw' ],
  923. },
  924. })
  925. end
  926. it 'does match' do
  927. expect(result[:matched_workflows]).to include(workflow.id)
  928. end
  929. describe 'for invalid regex' do
  930. let!(:workflow) do
  931. create(:core_workflow,
  932. object: 'Ticket',
  933. condition_selected: {
  934. 'ticket.title': {
  935. operator: 'does not match regex',
  936. value: [ '^workflow' ],
  937. },
  938. })
  939. end
  940. it 'does not match' do
  941. expect(result[:matched_workflows]).not_to include(workflow.id)
  942. end
  943. end
  944. end
  945. describe '.perform - Condition - Contains', db_strategy: :reset do
  946. let(:field_name) { SecureRandom.uuid }
  947. let!(:workflow) do
  948. create(:core_workflow,
  949. object: 'Ticket',
  950. condition_selected: {
  951. "ticket.#{field_name}": {
  952. operator: 'contains',
  953. value: %w[key_1 key_2],
  954. },
  955. })
  956. end
  957. before do
  958. create(:object_manager_attribute_multiselect, name: field_name, display: field_name)
  959. ObjectManager::Attribute.migration_execute
  960. end
  961. context 'when empty' do
  962. let(:payload) do
  963. base_payload.merge(
  964. 'params' => { field_name => [] },
  965. )
  966. end
  967. it 'does not match' do
  968. expect(result[:matched_workflows]).not_to include(workflow.id)
  969. end
  970. end
  971. context 'when same value' do
  972. let(:payload) do
  973. base_payload.merge(
  974. 'params' => { field_name => %w[key_1 key_2] },
  975. )
  976. end
  977. it 'does match' do
  978. expect(result[:matched_workflows]).to include(workflow.id)
  979. end
  980. end
  981. context 'when 50% value' do
  982. let(:payload) do
  983. base_payload.merge(
  984. 'params' => { field_name => ['key_1'] },
  985. )
  986. end
  987. it 'does match' do
  988. expect(result[:matched_workflows]).to include(workflow.id)
  989. end
  990. end
  991. context 'when value differs' do
  992. let(:payload) do
  993. base_payload.merge(
  994. 'params' => { field_name => ['key_3'] },
  995. )
  996. end
  997. it 'does not match' do
  998. expect(result[:matched_workflows]).not_to include(workflow.id)
  999. end
  1000. end
  1001. end
  1002. describe '.perform - Condition - Contains not', db_strategy: :reset do
  1003. let(:field_name) { SecureRandom.uuid }
  1004. let!(:workflow) do
  1005. create(:core_workflow,
  1006. object: 'Ticket',
  1007. condition_selected: {
  1008. "ticket.#{field_name}": {
  1009. operator: 'contains not',
  1010. value: %w[key_1 key_2],
  1011. },
  1012. })
  1013. end
  1014. before do
  1015. create(:object_manager_attribute_multiselect, name: field_name, display: field_name)
  1016. ObjectManager::Attribute.migration_execute
  1017. end
  1018. context 'when empty' do
  1019. let(:payload) do
  1020. base_payload.merge(
  1021. 'params' => { field_name => [] },
  1022. )
  1023. end
  1024. it 'does match' do
  1025. expect(result[:matched_workflows]).to include(workflow.id)
  1026. end
  1027. end
  1028. context 'when same value' do
  1029. let(:payload) do
  1030. base_payload.merge(
  1031. 'params' => { field_name => %w[key_1 key_2] },
  1032. )
  1033. end
  1034. it 'does not match' do
  1035. expect(result[:matched_workflows]).not_to include(workflow.id)
  1036. end
  1037. end
  1038. context 'when 50% value' do
  1039. let(:payload) do
  1040. base_payload.merge(
  1041. 'params' => { field_name => ['key_1'] },
  1042. )
  1043. end
  1044. it 'does not match' do
  1045. expect(result[:matched_workflows]).not_to include(workflow.id)
  1046. end
  1047. end
  1048. context 'when value differs' do
  1049. let(:payload) do
  1050. base_payload.merge(
  1051. 'params' => { field_name => ['key_3'] },
  1052. )
  1053. end
  1054. it 'does match' do
  1055. expect(result[:matched_workflows]).to include(workflow.id)
  1056. end
  1057. end
  1058. end
  1059. describe '.perform - Condition - Contains all', db_strategy: :reset do
  1060. let(:field_name) { SecureRandom.uuid }
  1061. let!(:workflow) do
  1062. create(:core_workflow,
  1063. object: 'Ticket',
  1064. condition_selected: {
  1065. "ticket.#{field_name}": {
  1066. operator: 'contains all',
  1067. value: %w[key_1 key_2],
  1068. },
  1069. })
  1070. end
  1071. before do
  1072. create(:object_manager_attribute_multiselect, name: field_name, display: field_name)
  1073. ObjectManager::Attribute.migration_execute
  1074. end
  1075. context 'when empty' do
  1076. let(:payload) do
  1077. base_payload.merge(
  1078. 'params' => { field_name => [] },
  1079. )
  1080. end
  1081. it 'does not match' do
  1082. expect(result[:matched_workflows]).not_to include(workflow.id)
  1083. end
  1084. end
  1085. context 'when same value' do
  1086. let(:payload) do
  1087. base_payload.merge(
  1088. 'params' => { field_name => %w[key_1 key_2] },
  1089. )
  1090. end
  1091. it 'does match' do
  1092. expect(result[:matched_workflows]).to include(workflow.id)
  1093. end
  1094. end
  1095. context 'when 50% value' do
  1096. let(:payload) do
  1097. base_payload.merge(
  1098. 'params' => { field_name => ['key_1'] },
  1099. )
  1100. end
  1101. it 'does not match' do
  1102. expect(result[:matched_workflows]).not_to include(workflow.id)
  1103. end
  1104. end
  1105. context 'when value differs' do
  1106. let(:payload) do
  1107. base_payload.merge(
  1108. 'params' => { field_name => ['key_3'] },
  1109. )
  1110. end
  1111. it 'does not match' do
  1112. expect(result[:matched_workflows]).not_to include(workflow.id)
  1113. end
  1114. end
  1115. end
  1116. describe '.perform - Condition - Contains all not', db_strategy: :reset do
  1117. let(:field_name) { SecureRandom.uuid }
  1118. let!(:workflow) do
  1119. create(:core_workflow,
  1120. object: 'Ticket',
  1121. condition_selected: {
  1122. "ticket.#{field_name}": {
  1123. operator: 'contains all not',
  1124. value: %w[key_1 key_2],
  1125. },
  1126. })
  1127. end
  1128. before do
  1129. create(:object_manager_attribute_multiselect, name: field_name, display: field_name)
  1130. ObjectManager::Attribute.migration_execute
  1131. end
  1132. context 'when empty' do
  1133. let(:payload) do
  1134. base_payload.merge(
  1135. 'params' => { field_name => [] },
  1136. )
  1137. end
  1138. it 'does match' do
  1139. expect(result[:matched_workflows]).to include(workflow.id)
  1140. end
  1141. end
  1142. context 'when same value' do
  1143. let(:payload) do
  1144. base_payload.merge(
  1145. 'params' => { field_name => %w[key_1 key_2] },
  1146. )
  1147. end
  1148. it 'does not match' do
  1149. expect(result[:matched_workflows]).not_to include(workflow.id)
  1150. end
  1151. end
  1152. context 'when 50% value' do
  1153. let(:payload) do
  1154. base_payload.merge(
  1155. 'params' => { field_name => ['key_1'] },
  1156. )
  1157. end
  1158. it 'does not match' do
  1159. expect(result[:matched_workflows]).not_to include(workflow.id)
  1160. end
  1161. end
  1162. context 'when value differs' do
  1163. let(:payload) do
  1164. base_payload.merge(
  1165. 'params' => { field_name => ['key_3'] },
  1166. )
  1167. end
  1168. it 'does match' do
  1169. expect(result[:matched_workflows]).to include(workflow.id)
  1170. end
  1171. end
  1172. end
  1173. describe '.perform - Condition - group active is true' do
  1174. let(:payload) do
  1175. base_payload.merge('params' => {
  1176. 'group_id' => Group.first.id,
  1177. })
  1178. end
  1179. let!(:workflow) do
  1180. create(:core_workflow,
  1181. object: 'Ticket',
  1182. condition_selected: { 'group.active'=>{ 'operator' => 'is', 'value' => true } })
  1183. end
  1184. it 'does match' do
  1185. expect(result[:matched_workflows]).to include(workflow.id)
  1186. end
  1187. end
  1188. describe '.perform - Condition - group.assignment_timeout (Integer) matches' do
  1189. let(:group) { create(:group, assignment_timeout: 10) }
  1190. let(:payload) do
  1191. base_payload.merge('params' => {
  1192. 'group_id' => group.id,
  1193. })
  1194. end
  1195. before do
  1196. create(:core_workflow,
  1197. object: 'Ticket',
  1198. condition_selected: { 'group.assignment_timeout'=>{ 'operator' => 'is', 'value' => 10 } },
  1199. perform: { 'ticket.priority_id'=>{ 'operator' => 'hide', 'hide' => 'true' } },)
  1200. end
  1201. it 'does match' do
  1202. expect(result[:visibility]['priority_id']).to eq('hide')
  1203. end
  1204. end
  1205. describe '.perform - Condition - starts with' do
  1206. let(:payload) do
  1207. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  1208. end
  1209. context 'when match' do
  1210. before do
  1211. travel_to DateTime.new 2023, 7, 21, 7, 0
  1212. end
  1213. let!(:workflow) do
  1214. create(:core_workflow,
  1215. object: 'Ticket',
  1216. condition_selected: {
  1217. 'ticket.title': {
  1218. operator: 'starts with',
  1219. value: ticket_title[0..5]
  1220. },
  1221. })
  1222. end
  1223. it 'does match' do
  1224. expect(result[:matched_workflows]).to include(workflow.id)
  1225. end
  1226. end
  1227. context 'when mismatch' do
  1228. before do
  1229. travel_to DateTime.new 2023, 8, 21, 7, 0
  1230. end
  1231. let!(:workflow) do
  1232. create(:core_workflow,
  1233. object: 'Ticket',
  1234. condition_selected: {
  1235. 'ticket.title': {
  1236. operator: 'starts with',
  1237. value: 'xxx',
  1238. },
  1239. })
  1240. end
  1241. it 'does not match' do
  1242. expect(result[:matched_workflows]).not_to include(workflow.id)
  1243. end
  1244. end
  1245. context 'when empty' do
  1246. before do
  1247. travel_to DateTime.new 2023, 8, 21, 7, 0
  1248. ticket.customer.update(note: nil)
  1249. end
  1250. let!(:workflow) do
  1251. create(:core_workflow,
  1252. object: 'Ticket',
  1253. condition_selected: {
  1254. 'customer.note': {
  1255. operator: 'starts with',
  1256. value: 'xxx',
  1257. },
  1258. })
  1259. end
  1260. it 'does not match' do
  1261. expect(result[:matched_workflows]).not_to include(workflow.id)
  1262. end
  1263. end
  1264. end
  1265. describe '.perform - Condition - starts with one of' do
  1266. let(:payload) do
  1267. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  1268. end
  1269. context 'when match' do
  1270. before do
  1271. travel_to DateTime.new 2023, 7, 21, 7, 0
  1272. end
  1273. let!(:workflow) do
  1274. create(:core_workflow,
  1275. object: 'Ticket',
  1276. condition_selected: {
  1277. 'ticket.title': {
  1278. operator: 'starts with one of',
  1279. value: [ticket_title[0..5]]
  1280. },
  1281. })
  1282. end
  1283. it 'does match' do
  1284. expect(result[:matched_workflows]).to include(workflow.id)
  1285. end
  1286. end
  1287. context 'when mismatch' do
  1288. before do
  1289. travel_to DateTime.new 2023, 8, 21, 7, 0
  1290. end
  1291. let!(:workflow) do
  1292. create(:core_workflow,
  1293. object: 'Ticket',
  1294. condition_selected: {
  1295. 'ticket.title': {
  1296. operator: 'starts with one of',
  1297. value: ['xxx'],
  1298. },
  1299. })
  1300. end
  1301. it 'does not match' do
  1302. expect(result[:matched_workflows]).not_to include(workflow.id)
  1303. end
  1304. end
  1305. context 'when empty' do
  1306. before do
  1307. travel_to DateTime.new 2023, 8, 21, 7, 0
  1308. ticket.customer.update(note: nil)
  1309. end
  1310. let!(:workflow) do
  1311. create(:core_workflow,
  1312. object: 'Ticket',
  1313. condition_selected: {
  1314. 'customer.note': {
  1315. operator: 'starts with one of',
  1316. value: ['xxx'],
  1317. },
  1318. })
  1319. end
  1320. it 'does not match' do
  1321. expect(result[:matched_workflows]).not_to include(workflow.id)
  1322. end
  1323. end
  1324. end
  1325. describe '.perform - Condition - ends with' do
  1326. let(:payload) do
  1327. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  1328. end
  1329. context 'when match' do
  1330. before do
  1331. travel_to DateTime.new 2023, 7, 21, 7, 0
  1332. end
  1333. let!(:workflow) do
  1334. create(:core_workflow,
  1335. object: 'Ticket',
  1336. condition_selected: {
  1337. 'ticket.title': {
  1338. operator: 'ends with',
  1339. value: ticket_title[-5..]
  1340. },
  1341. })
  1342. end
  1343. it 'does match' do
  1344. expect(result[:matched_workflows]).to include(workflow.id)
  1345. end
  1346. end
  1347. context 'when mismatch' do
  1348. before do
  1349. travel_to DateTime.new 2023, 8, 21, 7, 0
  1350. end
  1351. let!(:workflow) do
  1352. create(:core_workflow,
  1353. object: 'Ticket',
  1354. condition_selected: {
  1355. 'ticket.title': {
  1356. operator: 'ends with',
  1357. value: 'xxx',
  1358. },
  1359. })
  1360. end
  1361. it 'does not match' do
  1362. expect(result[:matched_workflows]).not_to include(workflow.id)
  1363. end
  1364. end
  1365. context 'when empty' do
  1366. before do
  1367. travel_to DateTime.new 2023, 8, 21, 7, 0
  1368. ticket.customer.update(note: nil)
  1369. end
  1370. let!(:workflow) do
  1371. create(:core_workflow,
  1372. object: 'Ticket',
  1373. condition_selected: {
  1374. 'customer.note': {
  1375. operator: 'ends with',
  1376. value: 'xxx',
  1377. },
  1378. })
  1379. end
  1380. it 'does not match' do
  1381. expect(result[:matched_workflows]).not_to include(workflow.id)
  1382. end
  1383. end
  1384. end
  1385. describe '.perform - Condition - ends with one of' do
  1386. let(:payload) do
  1387. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  1388. end
  1389. context 'when match' do
  1390. before do
  1391. travel_to DateTime.new 2023, 7, 21, 7, 0
  1392. end
  1393. let!(:workflow) do
  1394. create(:core_workflow,
  1395. object: 'Ticket',
  1396. condition_selected: {
  1397. 'ticket.title': {
  1398. operator: 'ends with one of',
  1399. value: [ticket_title[-5..]]
  1400. },
  1401. })
  1402. end
  1403. it 'does match' do
  1404. expect(result[:matched_workflows]).to include(workflow.id)
  1405. end
  1406. end
  1407. context 'when mismatch' do
  1408. before do
  1409. travel_to DateTime.new 2023, 8, 21, 7, 0
  1410. end
  1411. let!(:workflow) do
  1412. create(:core_workflow,
  1413. object: 'Ticket',
  1414. condition_selected: {
  1415. 'ticket.title': {
  1416. operator: 'ends with one of',
  1417. value: ['xxx'],
  1418. },
  1419. })
  1420. end
  1421. it 'does not match' do
  1422. expect(result[:matched_workflows]).not_to include(workflow.id)
  1423. end
  1424. end
  1425. context 'when empty' do
  1426. before do
  1427. travel_to DateTime.new 2023, 8, 21, 7, 0
  1428. ticket.customer.update(note: nil)
  1429. end
  1430. let!(:workflow) do
  1431. create(:core_workflow,
  1432. object: 'Ticket',
  1433. condition_selected: {
  1434. 'customer.note': {
  1435. operator: 'ends with one of',
  1436. value: ['xxx'],
  1437. },
  1438. })
  1439. end
  1440. it 'does not match' do
  1441. expect(result[:matched_workflows]).not_to include(workflow.id)
  1442. end
  1443. end
  1444. end
  1445. describe '.perform - Condition - is any of' do
  1446. let(:payload) do
  1447. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  1448. end
  1449. context 'when match' do
  1450. let!(:workflow) do
  1451. create(:core_workflow,
  1452. object: 'Ticket',
  1453. condition_selected: {
  1454. 'ticket.title': {
  1455. operator: 'is any of',
  1456. value: ['a', 'b', ticket_title],
  1457. },
  1458. })
  1459. end
  1460. it 'does match' do
  1461. expect(result[:matched_workflows]).to include(workflow.id)
  1462. end
  1463. end
  1464. context 'when mismatch' do
  1465. let!(:workflow) do
  1466. create(:core_workflow,
  1467. object: 'Ticket',
  1468. condition_selected: {
  1469. 'ticket.title': {
  1470. operator: 'is any of',
  1471. value: ['xxx'],
  1472. },
  1473. })
  1474. end
  1475. it 'does not match' do
  1476. expect(result[:matched_workflows]).not_to include(workflow.id)
  1477. end
  1478. end
  1479. context 'when empty' do
  1480. before do
  1481. ticket.update!(title: '')
  1482. end
  1483. let!(:workflow) do
  1484. create(:core_workflow,
  1485. object: 'Ticket',
  1486. condition_selected: {
  1487. 'ticket.title': {
  1488. operator: 'is any of',
  1489. value: ['xxx'],
  1490. },
  1491. })
  1492. end
  1493. it 'does not match' do
  1494. expect(result[:matched_workflows]).not_to include(workflow.id)
  1495. end
  1496. end
  1497. end
  1498. describe '.perform - Condition - is none of' do
  1499. let(:payload) do
  1500. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  1501. end
  1502. context 'when match' do
  1503. let!(:workflow) do
  1504. create(:core_workflow,
  1505. object: 'Ticket',
  1506. condition_selected: {
  1507. 'ticket.title': {
  1508. operator: 'is none of',
  1509. value: %w[a b c],
  1510. },
  1511. })
  1512. end
  1513. it 'does match' do
  1514. expect(result[:matched_workflows]).to include(workflow.id)
  1515. end
  1516. end
  1517. context 'when mismatch' do
  1518. let!(:workflow) do
  1519. create(:core_workflow,
  1520. object: 'Ticket',
  1521. condition_selected: {
  1522. 'ticket.title': {
  1523. operator: 'is none of',
  1524. value: [ticket.title],
  1525. },
  1526. })
  1527. end
  1528. it 'does not match' do
  1529. expect(result[:matched_workflows]).not_to include(workflow.id)
  1530. end
  1531. end
  1532. context 'when empty' do
  1533. let!(:workflow) do
  1534. create(:core_workflow,
  1535. object: 'Ticket',
  1536. condition_selected: {
  1537. 'ticket.title': {
  1538. operator: 'is none of',
  1539. value: [ticket.title],
  1540. },
  1541. })
  1542. end
  1543. it 'does match' do
  1544. ticket.update!(title: '')
  1545. expect(result[:matched_workflows]).to include(workflow.id)
  1546. end
  1547. end
  1548. end
  1549. describe 'New ticket organization condition in core workflow not working for is specific usage #4750' do
  1550. let(:ticket_customer) { create(:customer, :with_org) }
  1551. let!(:workflow) do
  1552. create(:core_workflow,
  1553. object: 'Ticket',
  1554. condition_selected: {
  1555. 'ticket.organization_id': {
  1556. operator: 'is',
  1557. value: [ticket.customer.organization_id.to_s],
  1558. },
  1559. })
  1560. end
  1561. context 'when agent' do
  1562. let(:payload) do
  1563. base_payload.merge('params' => { 'customer_id' => ticket.customer_id })
  1564. end
  1565. it 'does match' do
  1566. expect(result[:matched_workflows]).to include(workflow.id)
  1567. end
  1568. end
  1569. context 'when customer' do
  1570. let!(:action_user) { ticket.customer } # rubocop:disable RSpec/LetSetup
  1571. it 'does match' do
  1572. expect(result[:matched_workflows]).to include(workflow.id)
  1573. end
  1574. end
  1575. end
  1576. describe 'Core Workflow: Readded options are not usable in conditions #4763' do
  1577. before do
  1578. workflow_1 && workflow_2
  1579. end
  1580. context 'when single value' do
  1581. let(:workflow_1) do
  1582. create(:core_workflow,
  1583. object: 'Ticket',
  1584. perform: {
  1585. 'ticket.priority_id': {
  1586. operator: 'remove_option',
  1587. remove_option: Ticket::Priority.pluck(:id).map(&:to_s),
  1588. },
  1589. })
  1590. end
  1591. let(:workflow_2) do
  1592. create(:core_workflow,
  1593. object: 'Ticket',
  1594. perform: {
  1595. 'ticket.priority_id': {
  1596. operator: 'add_option',
  1597. add_option: Ticket::Priority.pluck(:id).map(&:to_s),
  1598. },
  1599. })
  1600. end
  1601. let!(:workflow_3) do
  1602. create(:core_workflow,
  1603. object: 'Ticket',
  1604. condition_selected: {
  1605. 'ticket.priority_id': {
  1606. operator: 'is',
  1607. value: Ticket::Priority.where(name: '3 high').pluck(:id).map(&:to_s),
  1608. },
  1609. })
  1610. end
  1611. let(:payload) do
  1612. base_payload.merge('params' => { 'priority_id' => Ticket::Priority.find_by(name: '3 high').id.to_s })
  1613. end
  1614. it 'does match' do
  1615. expect(result[:matched_workflows]).to include(workflow_3.id)
  1616. end
  1617. end
  1618. context 'when multiple value', db_strategy: :reset do
  1619. let(:workflow_1) do
  1620. create(:core_workflow,
  1621. object: 'Ticket',
  1622. perform: {
  1623. "ticket.#{field_name}": {
  1624. operator: 'remove_option',
  1625. remove_option: ['key_1'],
  1626. },
  1627. })
  1628. end
  1629. let(:workflow_2) do
  1630. create(:core_workflow,
  1631. object: 'Ticket',
  1632. perform: {
  1633. "ticket.#{field_name}": {
  1634. operator: 'add_option',
  1635. add_option: ['key_1'],
  1636. },
  1637. })
  1638. end
  1639. let!(:workflow_3) do
  1640. create(:core_workflow,
  1641. object: 'Ticket',
  1642. condition_selected: {
  1643. "ticket.#{field_name}": {
  1644. operator: 'is',
  1645. value: ['key_1'],
  1646. },
  1647. })
  1648. end
  1649. let(:payload) do
  1650. base_payload.merge('params' => { field_name => ['key_1'] })
  1651. end
  1652. let(:field_name) { SecureRandom.uuid }
  1653. before do
  1654. create(:object_manager_attribute_multiselect, name: field_name, display: field_name)
  1655. ObjectManager::Attribute.migration_execute
  1656. end
  1657. it 'does match' do
  1658. expect(result[:matched_workflows]).to include(workflow_3.id)
  1659. end
  1660. end
  1661. end
  1662. end