core_workflow_spec.rb 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720
  1. # Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe CoreWorkflow, type: :model do
  4. let(:group) { create(:group) }
  5. let!(:ticket) { create(:ticket, state: Ticket::State.find_by(name: 'pending reminder'), pending_time: Time.zone.now + 5.days, group: group) }
  6. let!(:base_payload) do
  7. {
  8. 'event' => 'core_workflow',
  9. 'request_id' => 'default',
  10. 'class_name' => 'Ticket',
  11. 'screen' => 'create_middle',
  12. 'params' => {},
  13. }
  14. end
  15. let(:payload) { base_payload }
  16. let!(:action_user) { create(:agent, groups: [ticket.group]) }
  17. let(:result) { described_class.perform(payload: payload, user: action_user) }
  18. describe '.perform - Default - Group' do
  19. let!(:group_change) { create(:group) }
  20. let!(:group_create) { create(:group) }
  21. describe 'for agent with full permissions on screen create_middle' do
  22. let(:action_user) { create(:agent) }
  23. before do
  24. action_user.group_names_access_map = {
  25. group_create.name => ['full'],
  26. group_change.name => ['change'],
  27. }
  28. end
  29. it 'does show group_create for agent with all permissions' do
  30. expect(result[:restrict_values]['group_id']).to include(group_create.id.to_s)
  31. end
  32. it 'does not show group_change for agent with all permissions' do
  33. expect(result[:restrict_values]['group_id']).not_to include(group_change.id.to_s)
  34. end
  35. end
  36. describe 'for agent with full permissions on screen edit' do
  37. let(:payload) do
  38. base_payload.merge('screen' => 'edit')
  39. end
  40. let(:action_user) { create(:agent) }
  41. before do
  42. action_user.group_names_access_map = {
  43. group_create.name => ['full'],
  44. group_change.name => ['change'],
  45. }
  46. end
  47. it 'does show group_create for agent with all permissions' do
  48. expect(result[:restrict_values]['group_id']).to include(group_create.id.to_s)
  49. end
  50. it 'does show group_change for agent with all permissions' do
  51. expect(result[:restrict_values]['group_id']).to include(group_change.id.to_s)
  52. end
  53. end
  54. describe 'for agent with change permissions on screen create_middle' do
  55. let(:action_user) { create(:agent) }
  56. before do
  57. action_user.group_names_access_map = {
  58. group_create.name => ['change'],
  59. group_change.name => ['change'],
  60. }
  61. end
  62. it 'does not show group_create for agent with change permissions' do
  63. expect(result[:restrict_values]['group_id']).not_to include(group_create.id.to_s)
  64. end
  65. it 'does not show group_change for agent with change permissions' do
  66. expect(result[:restrict_values]['group_id']).not_to include(group_change.id.to_s)
  67. end
  68. end
  69. describe 'for agent with change permissions on screen edit' do
  70. let(:payload) do
  71. base_payload.merge('screen' => 'edit')
  72. end
  73. let(:action_user) { create(:agent) }
  74. before do
  75. action_user.group_names_access_map = {
  76. group_create.name => ['change'],
  77. group_change.name => ['change'],
  78. }
  79. end
  80. it 'does show group_create for agent with change permissions' do
  81. expect(result[:restrict_values]['group_id']).to include(group_create.id.to_s)
  82. end
  83. it 'does show group_change for agent with change permissions' do
  84. expect(result[:restrict_values]['group_id']).to include(group_change.id.to_s)
  85. end
  86. end
  87. describe 'for customer on screen create_middle' do
  88. let(:action_user) { create(:customer) }
  89. it 'does show group_create for customer' do
  90. expect(result[:restrict_values]['group_id']).to include(group_create.id.to_s)
  91. end
  92. it 'does show group_change for customer' do
  93. expect(result[:restrict_values]['group_id']).to include(group_change.id.to_s)
  94. end
  95. end
  96. describe 'for customer on screen edit' do
  97. let(:payload) do
  98. base_payload.merge('screen' => 'edit')
  99. end
  100. let(:action_user) { create(:customer) }
  101. it 'does show group_create for customer' do
  102. expect(result[:restrict_values]['group_id']).to include(group_create.id.to_s)
  103. end
  104. it 'does show group_change for customer' do
  105. expect(result[:restrict_values]['group_id']).to include(group_change.id.to_s)
  106. end
  107. end
  108. end
  109. describe '.perform - Default - Owner' do
  110. before do
  111. another_group = create(:group)
  112. action_user.group_names_access_map = {
  113. ticket.group.name => ['full'],
  114. another_group.name => ['full'],
  115. }
  116. end
  117. it 'does not show any owners for no group' do
  118. expect(result[:restrict_values]['owner_id']).to eq([''])
  119. end
  120. describe 'on group' do
  121. let(:payload) do
  122. base_payload.merge('params' => { 'group_id' => ticket.group.id })
  123. end
  124. it 'does show ticket agent' do
  125. expect(result[:restrict_values]['owner_id']).to eq(['', action_user.id.to_s])
  126. end
  127. end
  128. describe 'on group save' do
  129. let(:payload) do
  130. base_payload.merge('request_id' => 'ChecksCoreWorkflow.validate_workflows', 'params' => { 'group_id' => ticket.group.id })
  131. end
  132. it 'does show ticket agent and system user' do
  133. expect(result[:restrict_values]['owner_id']).to eq(['', '1', action_user.id.to_s])
  134. end
  135. end
  136. end
  137. describe '.perform - Default - Bulk Owner' do
  138. let(:payload) do
  139. base_payload.merge('screen' => 'overview_bulk')
  140. end
  141. it 'does not show any owners for no group' do
  142. expect(result[:restrict_values]['owner_id']).to eq([''])
  143. end
  144. describe 'on ticket ids' do
  145. let(:payload) do
  146. base_payload.merge('screen' => 'overview_bulk', 'params' => { 'ticket_ids' => ticket.id.to_s })
  147. end
  148. it 'does show ticket agent' do
  149. expect(result[:restrict_values]['owner_id']).to eq(['', action_user.id.to_s])
  150. end
  151. end
  152. describe 'on ticket ids with no group overlap' do
  153. let(:ticket2) { create(:ticket) }
  154. let(:payload) do
  155. base_payload.merge('screen' => 'overview_bulk', 'params' => { 'ticket_ids' => "#{ticket.id},#{ticket2.id}" })
  156. end
  157. it 'does not show ticket agent' do
  158. expect(result[:restrict_values]['owner_id']).to eq([''])
  159. end
  160. end
  161. describe 'on ticket ids with group overlap' do
  162. let(:ticket2) { create(:ticket, group: ticket.group) }
  163. let(:payload) do
  164. base_payload.merge('screen' => 'overview_bulk', 'params' => { 'ticket_ids' => "#{ticket.id},#{ticket2.id}" })
  165. end
  166. it 'does show ticket agent' do
  167. expect(result[:restrict_values]['owner_id']).to eq(['', action_user.id.to_s])
  168. end
  169. end
  170. end
  171. describe '.perform - Default - State' do
  172. it 'does show state type new for create_middle' do
  173. expect(result[:restrict_values]['state_id']).to include(Ticket::State.find_by(name: 'new').id.to_s)
  174. end
  175. describe 'on edit' do
  176. let(:payload) do
  177. base_payload.merge('screen' => 'edit')
  178. end
  179. it 'does not show state type new' do
  180. expect(result[:restrict_values]['state_id']).not_to include(Ticket::State.find_by(name: 'new').id.to_s)
  181. end
  182. end
  183. end
  184. describe '.perform - Default - Priority' do
  185. let(:prio_invalid) { create(:ticket_priority, active: false) }
  186. it 'does show valid priority' do
  187. expect(result[:restrict_values]['priority_id']).to include(Ticket::Priority.find_by(name: '3 high').id.to_s)
  188. end
  189. it 'does not show invalid priority' do
  190. expect(result[:restrict_values]['priority_id']).not_to include(prio_invalid.id.to_s)
  191. end
  192. end
  193. describe '.perform - Default - Customer setting customer_ticket_create_group_ids' do
  194. let(:action_user) { create(:customer) }
  195. let!(:group1) { create(:group) }
  196. let!(:group2) { create(:group) }
  197. let!(:group3) { create(:group) }
  198. it 'does show group 1' do
  199. expect(result[:restrict_values]['group_id']).to include(group1.id.to_s)
  200. end
  201. context 'with customer_ticket_create_group_ids set' do
  202. before do
  203. Setting.set('customer_ticket_create_group_ids', [group2.id.to_s, group3.id.to_s])
  204. end
  205. it 'does not show group 1' do
  206. expect(result[:restrict_values]['group_id']).not_to include(group1.id.to_s)
  207. end
  208. end
  209. end
  210. describe '.perform - Default - #3721 - Fields are falsey displayed as mandatory if they contain historic screen values', db_strategy: :reset do
  211. let(:field_name) { SecureRandom.uuid }
  212. let(:screens) do
  213. {
  214. create_middle: {
  215. 'ticket.agent' => {
  216. shown: true,
  217. },
  218. },
  219. }
  220. end
  221. before do
  222. create(:object_manager_attribute_text, object_name: 'Ticket', name: field_name, display: field_name, screens: screens)
  223. ObjectManager::Attribute.migration_execute
  224. end
  225. it 'does show the field as optional because it has no required value' do
  226. expect(result[:mandatory][field_name]).to eq(false)
  227. end
  228. end
  229. describe '.perform - Custom - Pending Time' do
  230. it 'does not show pending time for non pending state' do
  231. expect(result[:visibility]['pending_time']).to eq('remove')
  232. end
  233. describe 'for ticket id with no state change' do
  234. let(:payload) do
  235. base_payload.merge('params' => {
  236. 'id' => ticket.id,
  237. })
  238. end
  239. it 'does show pending time for pending ticket' do
  240. expect(result[:visibility]['pending_time']).to eq('show')
  241. end
  242. end
  243. describe 'for ticket id with state change' do
  244. let(:payload) do
  245. base_payload.merge('params' => {
  246. 'id' => ticket.id,
  247. 'state_id' => Ticket::State.find_by(name: 'open').id.to_s,
  248. })
  249. end
  250. it 'does not show pending time for pending ticket' do
  251. expect(result[:visibility]['pending_time']).to eq('remove')
  252. end
  253. end
  254. end
  255. describe '.perform - Custom - Admin SLA' do
  256. let(:payload) do
  257. base_payload.merge(
  258. 'screen' => 'edit',
  259. 'class_name' => 'Sla',
  260. )
  261. end
  262. it 'does set first_response_time_in_text optional' do
  263. expect(result[:mandatory]['first_response_time_in_text']).to eq(false)
  264. end
  265. it 'does set update_time_in_text optional' do
  266. expect(result[:mandatory]['update_time_in_text']).to eq(false)
  267. end
  268. it 'does set solution_time_in_text optional' do
  269. expect(result[:mandatory]['solution_time_in_text']).to eq(false)
  270. end
  271. describe 'on first_response_time_enabled' do
  272. let(:payload) do
  273. base_payload.merge(
  274. 'screen' => 'edit',
  275. 'class_name' => 'Sla',
  276. 'params' => { 'first_response_time_enabled' => 'true' }
  277. )
  278. end
  279. it 'does set first_response_time_in_text mandatory' do
  280. expect(result[:mandatory]['first_response_time_in_text']).to eq(true)
  281. end
  282. it 'does set update_time_in_text optional' do
  283. expect(result[:mandatory]['update_time_in_text']).to eq(false)
  284. end
  285. it 'does set solution_time_in_text optional' do
  286. expect(result[:mandatory]['solution_time_in_text']).to eq(false)
  287. end
  288. end
  289. describe 'on update_time_enabled' do
  290. let(:payload) do
  291. base_payload.merge(
  292. 'screen' => 'edit',
  293. 'class_name' => 'Sla',
  294. 'params' => { 'update_time_enabled' => 'true' }
  295. )
  296. end
  297. it 'does set first_response_time_in_text optional' do
  298. expect(result[:mandatory]['first_response_time_in_text']).to eq(false)
  299. end
  300. it 'does set update_time_in_text mandatory' do
  301. expect(result[:mandatory]['update_time_in_text']).to eq(true)
  302. end
  303. it 'does set solution_time_in_text optional' do
  304. expect(result[:mandatory]['solution_time_in_text']).to eq(false)
  305. end
  306. end
  307. describe 'on solution_time_enabled' do
  308. let(:payload) do
  309. base_payload.merge(
  310. 'screen' => 'edit',
  311. 'class_name' => 'Sla',
  312. 'params' => { 'solution_time_enabled' => 'true' }
  313. )
  314. end
  315. it 'does set first_response_time_in_text optional' do
  316. expect(result[:mandatory]['first_response_time_in_text']).to eq(false)
  317. end
  318. it 'does set update_time_in_text optional' do
  319. expect(result[:mandatory]['update_time_in_text']).to eq(false)
  320. end
  321. it 'does set solution_time_in_text mandatory' do
  322. expect(result[:mandatory]['solution_time_in_text']).to eq(true)
  323. end
  324. end
  325. end
  326. describe '.perform - Custom - Admin CoreWorkflow' do
  327. let(:payload) do
  328. base_payload.merge(
  329. 'screen' => 'edit',
  330. 'class_name' => 'CoreWorkflow',
  331. )
  332. end
  333. it 'does not show screens for empty object' do
  334. expect(result[:restrict_values]['preferences::screen']).to eq([''])
  335. end
  336. it 'does not show invalid objects' do
  337. expect(result[:restrict_values]['object']).not_to include('CoreWorkflow')
  338. end
  339. describe 'on object Ticket' do
  340. let(:payload) do
  341. base_payload.merge(
  342. 'screen' => 'edit',
  343. 'class_name' => 'CoreWorkflow',
  344. 'params' => { 'object' => 'Ticket' },
  345. )
  346. end
  347. it 'does show screen create_middle' do
  348. expect(result[:restrict_values]['preferences::screen']).to include('create_middle')
  349. end
  350. it 'does show screen edit' do
  351. expect(result[:restrict_values]['preferences::screen']).to include('edit')
  352. end
  353. end
  354. describe 'on saved object Ticket' do
  355. let(:workflow) { create(:core_workflow, object: 'Ticket') }
  356. let(:payload) do
  357. base_payload.merge(
  358. 'screen' => 'edit',
  359. 'class_name' => 'CoreWorkflow',
  360. 'params' => { 'id' => workflow.id },
  361. )
  362. end
  363. it 'does show screen create_middle' do
  364. expect(result[:restrict_values]['preferences::screen']).to include('create_middle')
  365. end
  366. it 'does show screen edit' do
  367. expect(result[:restrict_values]['preferences::screen']).to include('edit')
  368. end
  369. end
  370. end
  371. describe '.perform - Condition - owner_id not set' do
  372. let!(:workflow) do
  373. create(:core_workflow,
  374. object: 'Ticket',
  375. condition_selected: {
  376. 'ticket.owner_id': {
  377. operator: 'not_set',
  378. },
  379. })
  380. end
  381. it 'does match' do
  382. expect(result[:matched_workflows]).to include(workflow.id)
  383. end
  384. describe 'for owner id 1' do
  385. let(:payload) do
  386. base_payload.merge(
  387. 'params' => { 'owner_id' => '1' },
  388. )
  389. end
  390. it 'does match' do
  391. expect(result[:matched_workflows]).to include(workflow.id)
  392. end
  393. end
  394. end
  395. describe '.perform - Condition - session.role_ids' do
  396. let!(:workflow) do
  397. create(:core_workflow,
  398. object: 'Ticket',
  399. condition_selected: {
  400. 'session.role_ids': {
  401. operator: 'is',
  402. value: [ Role.find_by(name: 'Agent').id.to_s ],
  403. },
  404. })
  405. end
  406. it 'does match' do
  407. expect(result[:matched_workflows]).to include(workflow.id)
  408. end
  409. describe 'for customer' do
  410. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  411. it 'does not match' do
  412. expect(result[:matched_workflows]).not_to include(workflow.id)
  413. end
  414. end
  415. end
  416. describe '.perform - Condition - session.group_ids_full' do
  417. let!(:workflow) do
  418. create(:core_workflow,
  419. object: 'Ticket',
  420. condition_selected: {
  421. 'session.group_ids_full': {
  422. operator: 'is',
  423. value: [ ticket.group.id.to_s ],
  424. },
  425. })
  426. end
  427. it 'does match' do
  428. expect(result[:matched_workflows]).to include(workflow.id)
  429. end
  430. describe 'for customer' do
  431. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  432. it 'does not match' do
  433. expect(result[:matched_workflows]).not_to include(workflow.id)
  434. end
  435. end
  436. end
  437. describe '.perform - Condition - session.group_ids_change' do
  438. let!(:workflow) do
  439. create(:core_workflow,
  440. object: 'Ticket',
  441. condition_selected: {
  442. 'session.group_ids_change': {
  443. operator: 'is',
  444. value: [ ticket.group.id.to_s ],
  445. },
  446. })
  447. end
  448. it 'does match' do
  449. expect(result[:matched_workflows]).to include(workflow.id)
  450. end
  451. describe 'for customer' do
  452. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  453. it 'does not match' do
  454. expect(result[:matched_workflows]).not_to include(workflow.id)
  455. end
  456. end
  457. end
  458. describe '.perform - Condition - session.group_ids_read' do
  459. let!(:workflow) do
  460. create(:core_workflow,
  461. object: 'Ticket',
  462. condition_selected: {
  463. 'session.group_ids_read': {
  464. operator: 'is',
  465. value: [ ticket.group.id.to_s ],
  466. },
  467. })
  468. end
  469. it 'does match' do
  470. expect(result[:matched_workflows]).to include(workflow.id)
  471. end
  472. describe 'for customer' do
  473. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  474. it 'does not match' do
  475. expect(result[:matched_workflows]).not_to include(workflow.id)
  476. end
  477. end
  478. end
  479. describe '.perform - Condition - session.group_ids_overview' do
  480. let!(:workflow) do
  481. create(:core_workflow,
  482. object: 'Ticket',
  483. condition_selected: {
  484. 'session.group_ids_overview': {
  485. operator: 'is',
  486. value: [ ticket.group.id.to_s ],
  487. },
  488. })
  489. end
  490. it 'does match' do
  491. expect(result[:matched_workflows]).to include(workflow.id)
  492. end
  493. describe 'for customer' do
  494. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  495. it 'does not match' do
  496. expect(result[:matched_workflows]).not_to include(workflow.id)
  497. end
  498. end
  499. end
  500. describe '.perform - Condition - session.group_ids_create' do
  501. let!(:workflow) do
  502. create(:core_workflow,
  503. object: 'Ticket',
  504. condition_selected: {
  505. 'session.group_ids_create': {
  506. operator: 'is',
  507. value: [ ticket.group.id.to_s ],
  508. },
  509. })
  510. end
  511. it 'does match' do
  512. expect(result[:matched_workflows]).to include(workflow.id)
  513. end
  514. describe 'for customer' do
  515. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  516. it 'does not match' do
  517. expect(result[:matched_workflows]).not_to include(workflow.id)
  518. end
  519. end
  520. end
  521. describe '.perform - Condition - session.permission_ids' do
  522. let!(:workflow) do
  523. create(:core_workflow,
  524. object: 'Ticket',
  525. condition_selected: {
  526. 'session.permission_ids': {
  527. operator: 'is',
  528. value: [ Permission.find_by(name: 'ticket.agent').id.to_s ],
  529. },
  530. })
  531. end
  532. it 'does match' do
  533. expect(result[:matched_workflows]).to include(workflow.id)
  534. end
  535. describe 'for customer' do
  536. let!(:action_user) { create(:customer) } # rubocop:disable RSpec/LetSetup
  537. it 'does not match' do
  538. expect(result[:matched_workflows]).not_to include(workflow.id)
  539. end
  540. end
  541. end
  542. describe '.perform - Condition - Regex match' do
  543. let(:payload) do
  544. base_payload.merge(
  545. 'params' => { 'title' => 'workflow ticket' },
  546. )
  547. end
  548. let!(:workflow) do
  549. create(:core_workflow,
  550. object: 'Ticket',
  551. condition_selected: {
  552. 'ticket.title': {
  553. operator: 'regex match',
  554. value: [ '^workflow' ],
  555. },
  556. })
  557. end
  558. it 'does match' do
  559. expect(result[:matched_workflows]).to include(workflow.id)
  560. end
  561. describe 'for invalid regex' do
  562. let!(:workflow) do
  563. create(:core_workflow,
  564. object: 'Ticket',
  565. condition_selected: {
  566. 'ticket.title': {
  567. operator: 'regex match',
  568. value: [ '^workfluw' ],
  569. },
  570. })
  571. end
  572. it 'does not match' do
  573. expect(result[:matched_workflows]).not_to include(workflow.id)
  574. end
  575. end
  576. end
  577. describe '.perform - Condition - Regex mismatch' do
  578. let(:payload) do
  579. base_payload.merge(
  580. 'params' => { 'title' => 'workflow ticket' },
  581. )
  582. end
  583. let!(:workflow) do
  584. create(:core_workflow,
  585. object: 'Ticket',
  586. condition_selected: {
  587. 'ticket.title': {
  588. operator: 'regex mismatch',
  589. value: [ '^workfluw' ],
  590. },
  591. })
  592. end
  593. it 'does match' do
  594. expect(result[:matched_workflows]).to include(workflow.id)
  595. end
  596. describe 'for invalid regex' do
  597. let!(:workflow) do
  598. create(:core_workflow,
  599. object: 'Ticket',
  600. condition_selected: {
  601. 'ticket.title': {
  602. operator: 'regex mismatch',
  603. value: [ '^workflow' ],
  604. },
  605. })
  606. end
  607. it 'does not match' do
  608. expect(result[:matched_workflows]).not_to include(workflow.id)
  609. end
  610. end
  611. end
  612. describe '.perform - Condition - Contains' do
  613. let(:payload) do
  614. base_payload.merge(
  615. 'params' => { 'title' => 'workflow ticket' },
  616. )
  617. end
  618. let!(:workflow) do
  619. create(:core_workflow,
  620. object: 'Ticket',
  621. condition_selected: {
  622. 'ticket.title': {
  623. operator: 'contains',
  624. value: [ 'workflow ticket', 'workflaw ticket' ],
  625. },
  626. })
  627. end
  628. it 'does match' do
  629. expect(result[:matched_workflows]).to include(workflow.id)
  630. end
  631. describe 'for invalid value' do
  632. let!(:workflow) do
  633. create(:core_workflow,
  634. object: 'Ticket',
  635. condition_selected: {
  636. 'ticket.title': {
  637. operator: 'contains',
  638. value: [ 'workfluw ticket', 'workflaw ticket' ],
  639. },
  640. })
  641. end
  642. it 'does not match' do
  643. expect(result[:matched_workflows]).not_to include(workflow.id)
  644. end
  645. end
  646. end
  647. describe '.perform - Condition - Contains not' do
  648. let(:payload) do
  649. base_payload.merge(
  650. 'params' => { 'title' => 'workflow ticket' },
  651. )
  652. end
  653. let!(:workflow) do
  654. create(:core_workflow,
  655. object: 'Ticket',
  656. condition_selected: {
  657. 'ticket.title': {
  658. operator: 'contains not',
  659. value: [ 'workfluw ticket', 'workflaw ticket' ],
  660. },
  661. })
  662. end
  663. it 'does match' do
  664. expect(result[:matched_workflows]).to include(workflow.id)
  665. end
  666. describe 'for invalid value' do
  667. let!(:workflow) do
  668. create(:core_workflow,
  669. object: 'Ticket',
  670. condition_selected: {
  671. 'ticket.title': {
  672. operator: 'contains not',
  673. value: [ 'workflow ticket', 'workflow ticket' ],
  674. },
  675. })
  676. end
  677. it 'does not match' do
  678. expect(result[:matched_workflows]).not_to include(workflow.id)
  679. end
  680. end
  681. end
  682. describe '.perform - Condition - Contains all' do
  683. let(:payload) do
  684. base_payload.merge(
  685. 'params' => { 'title' => 'workflow ticket' },
  686. )
  687. end
  688. let!(:workflow) do
  689. create(:core_workflow,
  690. object: 'Ticket',
  691. condition_selected: {
  692. 'ticket.title': {
  693. operator: 'contains all',
  694. value: [ 'workflow ticket', 'workflow ticket' ],
  695. },
  696. })
  697. end
  698. it 'does match' do
  699. expect(result[:matched_workflows]).to include(workflow.id)
  700. end
  701. describe 'for invalid value' do
  702. let!(:workflow) do
  703. create(:core_workflow,
  704. object: 'Ticket',
  705. condition_selected: {
  706. 'ticket.title': {
  707. operator: 'contains all',
  708. value: [ 'workflow ticket', 'workflaw ticket' ],
  709. },
  710. })
  711. end
  712. it 'does not match' do
  713. expect(result[:matched_workflows]).not_to include(workflow.id)
  714. end
  715. end
  716. end
  717. describe '.perform - Condition - Contains all not' do
  718. let(:payload) do
  719. base_payload.merge(
  720. 'params' => { 'title' => 'workflow ticket' },
  721. )
  722. end
  723. let!(:workflow) do
  724. create(:core_workflow,
  725. object: 'Ticket',
  726. condition_selected: {
  727. 'ticket.title': {
  728. operator: 'contains all not',
  729. value: [ 'workfluw ticket', 'workflaw ticket' ],
  730. },
  731. })
  732. end
  733. it 'does match' do
  734. expect(result[:matched_workflows]).to include(workflow.id)
  735. end
  736. describe 'for invalid value' do
  737. let!(:workflow) do
  738. create(:core_workflow,
  739. object: 'Ticket',
  740. condition_selected: {
  741. 'ticket.title': {
  742. operator: 'contains all not',
  743. value: [ 'workflow ticket', 'workflaw ticket' ],
  744. },
  745. })
  746. end
  747. it 'does not match' do
  748. expect(result[:matched_workflows]).not_to include(workflow.id)
  749. end
  750. end
  751. end
  752. describe '.perform - Stop after match' do
  753. let(:stop_after_match) { false }
  754. before do
  755. create(:core_workflow,
  756. object: 'Ticket',
  757. perform: {
  758. 'ticket.priority_id': {
  759. operator: 'hide',
  760. hide: 'true'
  761. },
  762. })
  763. create(:core_workflow,
  764. object: 'Ticket',
  765. perform: {
  766. 'ticket.priority_id': {
  767. operator: 'show',
  768. show: 'true'
  769. },
  770. },
  771. stop_after_match: stop_after_match)
  772. create(:core_workflow,
  773. object: 'Ticket',
  774. perform: {
  775. 'ticket.priority_id': {
  776. operator: 'hide',
  777. hide: 'true'
  778. },
  779. })
  780. end
  781. it 'does not stop' do
  782. expect(result[:visibility]['priority_id']).to eq('hide')
  783. end
  784. describe 'with stop_after_match' do
  785. let(:stop_after_match) { true }
  786. it 'does stop' do
  787. expect(result[:visibility]['priority_id']).to eq('show')
  788. end
  789. end
  790. end
  791. describe '.perform - Condition - Custom module' do
  792. let(:modules) { ['CoreWorkflow::Custom::Testa', 'CoreWorkflow::Custom::Testb', 'CoreWorkflow::Custom::Testc'] }
  793. let(:custom_class_false) do
  794. Class.new(CoreWorkflow::Custom::Backend) do
  795. def selected_attribute_match?
  796. false
  797. end
  798. end
  799. end
  800. let(:custom_class_true) do
  801. Class.new(CoreWorkflow::Custom::Backend) do
  802. def selected_attribute_match?
  803. true
  804. end
  805. end
  806. end
  807. let!(:workflow) do
  808. create(:core_workflow,
  809. object: 'Ticket',
  810. condition_selected: {
  811. 'custom.module': {
  812. operator: operator,
  813. value: modules,
  814. },
  815. })
  816. end
  817. describe 'with "match all modules" false' do
  818. let(:operator) { 'match all modules' }
  819. before do
  820. stub_const 'CoreWorkflow::Custom::Testa', custom_class_false
  821. stub_const 'CoreWorkflow::Custom::Testb', custom_class_false
  822. stub_const 'CoreWorkflow::Custom::Testc', custom_class_false
  823. end
  824. it 'does not match' do
  825. expect(result[:matched_workflows]).not_to include(workflow.id)
  826. end
  827. end
  828. describe 'with "match all modules" true' do
  829. let(:operator) { 'match all modules' }
  830. before do
  831. stub_const 'CoreWorkflow::Custom::Testa', custom_class_true
  832. stub_const 'CoreWorkflow::Custom::Testb', custom_class_true
  833. stub_const 'CoreWorkflow::Custom::Testc', custom_class_true
  834. end
  835. it 'does match' do
  836. expect(result[:matched_workflows]).to include(workflow.id)
  837. end
  838. end
  839. describe 'with "match all modules" blank' do
  840. let(:modules) { [] }
  841. let(:operator) { 'match all modules' }
  842. it 'does match' do
  843. expect(result[:matched_workflows]).to include(workflow.id)
  844. end
  845. end
  846. describe 'with "match one module" true' do
  847. let(:operator) { 'match one module' }
  848. before do
  849. stub_const 'CoreWorkflow::Custom::Testa', custom_class_false
  850. stub_const 'CoreWorkflow::Custom::Testb', custom_class_false
  851. stub_const 'CoreWorkflow::Custom::Testc', custom_class_true
  852. end
  853. it 'does match' do
  854. expect(result[:matched_workflows]).to include(workflow.id)
  855. end
  856. end
  857. describe 'with "match one module" false' do
  858. let(:operator) { 'match one module' }
  859. before do
  860. stub_const 'CoreWorkflow::Custom::Testa', custom_class_false
  861. stub_const 'CoreWorkflow::Custom::Testb', custom_class_false
  862. stub_const 'CoreWorkflow::Custom::Testc', custom_class_false
  863. end
  864. it 'does not match' do
  865. expect(result[:matched_workflows]).not_to include(workflow.id)
  866. end
  867. end
  868. describe 'with "match one module" blank' do
  869. let(:modules) { [] }
  870. let(:operator) { 'match one module' }
  871. it 'does match' do
  872. expect(result[:matched_workflows]).to include(workflow.id)
  873. end
  874. end
  875. describe 'with "match no modules" true' do
  876. let(:operator) { 'match no modules' }
  877. before do
  878. stub_const 'CoreWorkflow::Custom::Testa', custom_class_false
  879. stub_const 'CoreWorkflow::Custom::Testb', custom_class_false
  880. stub_const 'CoreWorkflow::Custom::Testc', custom_class_false
  881. end
  882. it 'does match' do
  883. expect(result[:matched_workflows]).to include(workflow.id)
  884. end
  885. end
  886. describe 'with "match no modules" false' do
  887. let(:operator) { 'match no modules' }
  888. before do
  889. stub_const 'CoreWorkflow::Custom::Testa', custom_class_true
  890. stub_const 'CoreWorkflow::Custom::Testb', custom_class_true
  891. stub_const 'CoreWorkflow::Custom::Testc', custom_class_true
  892. end
  893. it 'does not match' do
  894. expect(result[:matched_workflows]).not_to include(workflow.id)
  895. end
  896. end
  897. describe 'with "match no modules" blank' do
  898. let(:modules) { [] }
  899. let(:operator) { 'match no modules' }
  900. it 'does match' do
  901. expect(result[:matched_workflows]).to include(workflow.id)
  902. end
  903. end
  904. end
  905. describe '.perform - Select' do
  906. let!(:workflow1) do
  907. create(:core_workflow,
  908. object: 'Ticket',
  909. perform: {
  910. 'ticket.group_id': {
  911. operator: 'select',
  912. select: [ticket.group.id.to_s]
  913. },
  914. })
  915. end
  916. let!(:workflow2) do
  917. create(:core_workflow,
  918. object: 'Ticket',
  919. condition_selected: {
  920. 'ticket.group_id': {
  921. operator: 'is',
  922. value: ticket.group.id.to_s
  923. },
  924. },
  925. perform: {
  926. 'ticket.owner_id': {
  927. operator: 'select',
  928. select: [action_user.id.to_s]
  929. },
  930. })
  931. end
  932. it 'does match workflows' do
  933. expect(result[:matched_workflows]).to include(workflow1.id, workflow2.id)
  934. end
  935. it 'does select group' do
  936. expect(result[:select]['group_id']).to eq(ticket.group.id.to_s)
  937. end
  938. it 'does select owner (recursion)' do
  939. expect(result[:select]['owner_id']).to eq(action_user.id.to_s)
  940. end
  941. it 'does rerun 2 times (group select + owner select)' do
  942. expect(result[:rerun_count]).to eq(2)
  943. end
  944. end
  945. describe '.perform - Auto Select' do
  946. let!(:workflow1) do
  947. create(:core_workflow,
  948. object: 'Ticket',
  949. perform: {
  950. 'ticket.group_id': {
  951. operator: 'auto_select',
  952. auto_select: true
  953. },
  954. })
  955. end
  956. let!(:workflow2) do
  957. create(:core_workflow,
  958. object: 'Ticket',
  959. condition_selected: {
  960. 'ticket.group_id': {
  961. operator: 'is',
  962. value: ticket.group.id.to_s
  963. },
  964. },
  965. perform: {
  966. 'ticket.owner_id': {
  967. operator: 'auto_select',
  968. auto_select: true
  969. },
  970. })
  971. end
  972. it 'does match workflows' do
  973. expect(result[:matched_workflows]).to include(workflow1.id, workflow2.id)
  974. end
  975. it 'does select group' do
  976. expect(result[:select]['group_id']).to eq(ticket.group.id.to_s)
  977. end
  978. it 'does select owner (recursion)' do
  979. expect(result[:select]['owner_id']).to eq(action_user.id.to_s)
  980. end
  981. it 'does rerun 2 times (group select + owner select)' do
  982. expect(result[:rerun_count]).to eq(2)
  983. end
  984. describe 'with owner' do
  985. let(:payload) do
  986. base_payload.merge('params' => {
  987. 'group_id' => ticket.group.id.to_s,
  988. 'owner_id' => action_user.id.to_s,
  989. })
  990. end
  991. it 'does not select owner' do
  992. expect(result[:select]['owner_id']).to be nil
  993. end
  994. it 'does rerun 0 times' do
  995. expect(result[:rerun_count]).to eq(0)
  996. end
  997. end
  998. end
  999. describe '.perform - Fill in' do
  1000. let!(:workflow1) do
  1001. create(:core_workflow,
  1002. object: 'Ticket',
  1003. perform: {
  1004. 'ticket.group_id': {
  1005. operator: 'select',
  1006. select: [ticket.group.id.to_s]
  1007. },
  1008. })
  1009. end
  1010. let!(:workflow2) do
  1011. create(:core_workflow,
  1012. object: 'Ticket',
  1013. condition_selected: {
  1014. 'ticket.group_id': {
  1015. operator: 'is',
  1016. value: ticket.group.id.to_s
  1017. },
  1018. },
  1019. perform: {
  1020. 'ticket.title': {
  1021. operator: 'fill_in',
  1022. fill_in: 'hello'
  1023. },
  1024. })
  1025. end
  1026. it 'does match workflows' do
  1027. expect(result[:matched_workflows]).to include(workflow1.id, workflow2.id)
  1028. end
  1029. it 'does select group' do
  1030. expect(result[:select]['group_id']).to eq(ticket.group.id.to_s)
  1031. end
  1032. it 'does fill in title' do
  1033. expect(result[:fill_in]['title']).to eq('hello')
  1034. end
  1035. it 'does rerun 1 time (group select + title fill in)' do
  1036. expect(result[:rerun_count]).to eq(1)
  1037. end
  1038. end
  1039. describe '.perform - Fill in empty' do
  1040. let!(:workflow1) do
  1041. create(:core_workflow,
  1042. object: 'Ticket',
  1043. perform: {
  1044. 'ticket.group_id': {
  1045. operator: 'select',
  1046. select: [ticket.group.id.to_s]
  1047. },
  1048. })
  1049. end
  1050. let!(:workflow2) do
  1051. create(:core_workflow,
  1052. object: 'Ticket',
  1053. condition_selected: {
  1054. 'ticket.group_id': {
  1055. operator: 'is',
  1056. value: ticket.group.id.to_s
  1057. },
  1058. },
  1059. perform: {
  1060. 'ticket.title': {
  1061. operator: 'fill_in_empty',
  1062. fill_in_empty: 'hello'
  1063. },
  1064. })
  1065. end
  1066. it 'does match workflows' do
  1067. expect(result[:matched_workflows]).to include(workflow1.id, workflow2.id)
  1068. end
  1069. it 'does select group' do
  1070. expect(result[:select]['group_id']).to eq(ticket.group.id.to_s)
  1071. end
  1072. it 'does fill in title' do
  1073. expect(result[:fill_in]['title']).to eq('hello')
  1074. end
  1075. it 'does rerun 1 time (group select + title fill in)' do
  1076. expect(result[:rerun_count]).to eq(1)
  1077. end
  1078. describe 'with title' do
  1079. let(:payload) do
  1080. base_payload.merge('params' => {
  1081. 'title' => 'ha!',
  1082. })
  1083. end
  1084. it 'does not fill in title' do
  1085. expect(result[:fill_in]['title']).to be nil
  1086. end
  1087. it 'does rerun 1 times (group select)' do
  1088. expect(result[:rerun_count]).to eq(1)
  1089. end
  1090. end
  1091. end
  1092. describe '.perform - Rerun attributes default cache bug' do
  1093. before do
  1094. create(:core_workflow,
  1095. object: 'Ticket',
  1096. perform: {
  1097. 'ticket.group_id': {
  1098. operator: 'select',
  1099. select: [ticket.group.id.to_s]
  1100. },
  1101. })
  1102. create(:core_workflow,
  1103. object: 'Ticket',
  1104. condition_selected: {
  1105. 'ticket.group_id': {
  1106. operator: 'is_set',
  1107. },
  1108. },
  1109. perform: {
  1110. 'ticket.owner_id': {
  1111. operator: 'select',
  1112. select: [action_user.id.to_s]
  1113. },
  1114. })
  1115. create(:core_workflow,
  1116. object: 'Ticket',
  1117. condition_selected: {
  1118. 'ticket.owner_id': {
  1119. operator: 'not_set',
  1120. },
  1121. },
  1122. perform: {
  1123. 'ticket.priority_id': {
  1124. operator: 'hide',
  1125. hide: 'true'
  1126. },
  1127. })
  1128. end
  1129. it 'does not hide priority id' do
  1130. expect(result[:visibility]['priority_id']).to eq('show')
  1131. end
  1132. end
  1133. describe '.perform - Clean up params after restrict values removed selected value by set_fixed_to' do
  1134. let(:payload) do
  1135. base_payload.merge('params' => {
  1136. 'owner_id' => action_user.id,
  1137. })
  1138. end
  1139. before do
  1140. create(:core_workflow,
  1141. object: 'Ticket',
  1142. perform: {
  1143. 'ticket.group_id': {
  1144. operator: 'select',
  1145. select: [ticket.group.id.to_s]
  1146. },
  1147. })
  1148. create(:core_workflow,
  1149. object: 'Ticket',
  1150. condition_selected: {
  1151. 'ticket.group_id': {
  1152. operator: 'is_set',
  1153. },
  1154. },
  1155. perform: {
  1156. 'ticket.owner_id': {
  1157. operator: 'set_fixed_to',
  1158. set_fixed_to: ['']
  1159. },
  1160. })
  1161. create(:core_workflow,
  1162. object: 'Ticket',
  1163. condition_selected: {
  1164. 'ticket.owner_id': {
  1165. operator: 'is_set',
  1166. },
  1167. },
  1168. perform: {
  1169. 'ticket.priority_id': {
  1170. operator: 'hide',
  1171. hide: 'true'
  1172. },
  1173. })
  1174. end
  1175. it 'does not allow owner_id' do
  1176. expect(result[:restrict_values]['owner_id']).not_to include(action_user.id)
  1177. end
  1178. it 'does not hide priority id' do
  1179. expect(result[:visibility]['priority_id']).to eq('show')
  1180. end
  1181. end
  1182. describe '.perform - Clean up params after restrict values removed selected value by remove_option' do
  1183. let(:payload) do
  1184. base_payload.merge('params' => {
  1185. 'owner_id' => action_user.id,
  1186. })
  1187. end
  1188. before do
  1189. create(:core_workflow,
  1190. object: 'Ticket',
  1191. perform: {
  1192. 'ticket.group_id': {
  1193. operator: 'select',
  1194. select: [ticket.group.id.to_s]
  1195. },
  1196. })
  1197. create(:core_workflow,
  1198. object: 'Ticket',
  1199. condition_selected: {
  1200. 'ticket.group_id': {
  1201. operator: 'is_set',
  1202. },
  1203. },
  1204. perform: {
  1205. 'ticket.owner_id': {
  1206. operator: 'remove_option',
  1207. remove_option: [action_user.id]
  1208. },
  1209. })
  1210. create(:core_workflow,
  1211. object: 'Ticket',
  1212. condition_selected: {
  1213. 'ticket.owner_id': {
  1214. operator: 'is_set',
  1215. },
  1216. },
  1217. perform: {
  1218. 'ticket.priority_id': {
  1219. operator: 'hide',
  1220. hide: 'true'
  1221. },
  1222. })
  1223. end
  1224. it 'does not allow owner_id' do
  1225. expect(result[:restrict_values]['owner_id']).not_to include(action_user.id)
  1226. end
  1227. it 'does not hide priority id' do
  1228. expect(result[:visibility]['priority_id']).to eq('show')
  1229. end
  1230. end
  1231. describe '.perform - Clean up params after restrict values removed selected value by default attributes' do
  1232. let(:payload) do
  1233. base_payload.merge('params' => {
  1234. 'owner_id' => action_user.id,
  1235. })
  1236. end
  1237. before do
  1238. create(:core_workflow,
  1239. object: 'Ticket',
  1240. condition_selected: {
  1241. 'ticket.owner_id': {
  1242. operator: 'is_set',
  1243. },
  1244. },
  1245. perform: {
  1246. 'ticket.priority_id': {
  1247. operator: 'hide',
  1248. hide: 'true'
  1249. },
  1250. })
  1251. end
  1252. it 'does not allow owner_id' do
  1253. expect(result[:restrict_values]['owner_id']).not_to include(action_user.id)
  1254. end
  1255. it 'does not hide priority id' do
  1256. expect(result[:visibility]['priority_id']).to eq('show')
  1257. end
  1258. end
  1259. describe '.perform - Default - auto selection based on only_shown_if_selectable' do
  1260. it 'does auto select group' do
  1261. expect(result[:select]['group_id']).not_to be nil
  1262. end
  1263. it 'does auto hide group' do
  1264. expect(result[:visibility]['group_id']).to eq('hide')
  1265. end
  1266. end
  1267. describe '.perform - One field and two perform actions' do
  1268. before do
  1269. create(:core_workflow,
  1270. object: 'Ticket',
  1271. perform: {
  1272. 'ticket.owner_id': {
  1273. operator: %w[select set_optional],
  1274. select: [action_user.id.to_s],
  1275. set_optional: 'true',
  1276. },
  1277. })
  1278. end
  1279. it 'does auto select owner' do
  1280. expect(result[:select]['owner_id']).to eq(action_user.id.to_s)
  1281. end
  1282. it 'does set owner optional' do
  1283. expect(result[:mandatory]['owner_id']).to eq(false)
  1284. end
  1285. end
  1286. describe '.perform - Hide mobile based on user login' do
  1287. let(:base_payload) do
  1288. {
  1289. 'event' => 'core_workflow',
  1290. 'request_id' => 'default',
  1291. 'class_name' => 'User',
  1292. 'screen' => 'create',
  1293. 'params' => {
  1294. 'login' => 'nicole.special@zammad.org',
  1295. },
  1296. }
  1297. end
  1298. before do
  1299. create(:core_workflow,
  1300. object: 'User',
  1301. condition_selected: { 'user.login'=>{ 'operator' => 'is', 'value' => 'nicole.special@zammad.org' } },
  1302. perform: { 'user.mobile'=>{ 'operator' => 'hide', 'hide' => 'true' } },)
  1303. end
  1304. it 'does hide mobile for user' do
  1305. expect(result[:visibility]['mobile']).to eq('hide')
  1306. end
  1307. end
  1308. describe '.perform - Condition - group active is true' do
  1309. let(:payload) do
  1310. base_payload.merge('params' => {
  1311. 'group_id' => Group.first.id,
  1312. })
  1313. end
  1314. let!(:workflow) do
  1315. create(:core_workflow,
  1316. object: 'Ticket',
  1317. condition_selected: { 'group.active'=>{ 'operator' => 'is', 'value' => true } })
  1318. end
  1319. it 'does match' do
  1320. expect(result[:matched_workflows]).to include(workflow.id)
  1321. end
  1322. end
  1323. describe '.perform - Condition - group.assignment_timeout (Integer) matches' do
  1324. let(:group) { create(:group, assignment_timeout: 10) }
  1325. let(:payload) do
  1326. base_payload.merge('params' => {
  1327. 'group_id' => group.id,
  1328. })
  1329. end
  1330. before do
  1331. create(:core_workflow,
  1332. object: 'Ticket',
  1333. condition_selected: { 'group.assignment_timeout'=>{ 'operator' => 'is', 'value' => 10 } },
  1334. perform: { 'ticket.priority_id'=>{ 'operator' => 'hide', 'hide' => 'true' } },)
  1335. end
  1336. it 'does match' do
  1337. expect(result[:visibility]['priority_id']).to eq('hide')
  1338. end
  1339. end
  1340. describe '.perform - Readonly' do
  1341. let!(:workflow1) do
  1342. create(:core_workflow,
  1343. object: 'Ticket',
  1344. perform: {
  1345. 'ticket.group_id': {
  1346. operator: 'set_readonly',
  1347. set_readonly: 'true'
  1348. },
  1349. })
  1350. end
  1351. it 'does match workflow' do
  1352. expect(result[:matched_workflows]).to include(workflow1.id)
  1353. end
  1354. it 'does set group readonly' do
  1355. expect(result[:readonly]['group_id']).to eq(true)
  1356. end
  1357. context 'when readonly unset' do
  1358. let!(:workflow2) do
  1359. create(:core_workflow,
  1360. object: 'Ticket',
  1361. perform: {
  1362. 'ticket.group_id': {
  1363. operator: 'unset_readonly',
  1364. unset_readonly: 'true'
  1365. },
  1366. })
  1367. end
  1368. it 'does match workflows' do
  1369. expect(result[:matched_workflows]).to include(workflow1.id, workflow2.id)
  1370. end
  1371. it 'does set group readonly' do
  1372. expect(result[:readonly]['group_id']).to eq(false)
  1373. end
  1374. end
  1375. end
  1376. describe 'Core Workflow "is not" operator is working unexpected #3752' do
  1377. let(:approval_role) { create(:role) }
  1378. let!(:workflow) do
  1379. create(:core_workflow,
  1380. object: 'Ticket',
  1381. condition_selected: {
  1382. 'session.role_ids': {
  1383. operator: 'is_not',
  1384. value: [ approval_role.id.to_s ]
  1385. },
  1386. })
  1387. end
  1388. context 'when not action user has approval role' do
  1389. let(:action_user) { create(:agent, roles: [Role.find_by(name: 'Agent'), approval_role]) }
  1390. it 'does not match' do
  1391. expect(result[:matched_workflows]).not_to include(workflow.id)
  1392. end
  1393. end
  1394. context 'when action user has not approval role' do
  1395. let(:action_user) { create(:agent) }
  1396. it 'does match' do
  1397. expect(result[:matched_workflows]).to include(workflow.id)
  1398. end
  1399. end
  1400. end
  1401. describe 'Saved conditions break on selections without reloading #3758', db_strategy: :reset do
  1402. let(:field_name) { SecureRandom.uuid }
  1403. let(:screens) do
  1404. {
  1405. edit: {
  1406. 'ticket.agent' => {
  1407. shown: true,
  1408. },
  1409. },
  1410. }
  1411. end
  1412. let!(:workflow) do
  1413. create(:core_workflow,
  1414. object: 'Ticket',
  1415. condition_saved: {
  1416. "ticket.#{field_name}": {
  1417. operator: 'is_not',
  1418. value: 'true',
  1419. },
  1420. })
  1421. end
  1422. let(:payload) do
  1423. base_payload.merge('params' => { 'id' => ticket.id }, 'screen' => 'edit')
  1424. end
  1425. before do
  1426. create(:object_manager_attribute_boolean, object_name: 'Ticket', name: field_name, display: field_name, screens: screens)
  1427. ObjectManager::Attribute.migration_execute
  1428. end
  1429. it 'does match the workflow because saved value is false' do
  1430. expect(result[:matched_workflows]).to include(workflow.id)
  1431. end
  1432. context 'when params contain boolean field true' do
  1433. let(:payload) do
  1434. base_payload.merge('params' => { 'id' => ticket.id, field_name => true }, 'screen' => 'edit')
  1435. end
  1436. it 'does match the workflow because saved value is false' do
  1437. expect(result[:matched_workflows]).to include(workflow.id)
  1438. end
  1439. end
  1440. end
  1441. describe 'Core Workflow: Add organization condition attributes for object User #3779' do
  1442. let(:organization) { create(:organization, note: 'hello') }
  1443. let!(:base_payload) do
  1444. {
  1445. 'event' => 'core_workflow',
  1446. 'request_id' => 'default',
  1447. 'class_name' => 'User',
  1448. 'screen' => 'create',
  1449. 'params' => {},
  1450. }
  1451. end
  1452. let!(:workflow) do
  1453. create(:core_workflow,
  1454. object: 'User',
  1455. condition_selected: {
  1456. 'organization.note': {
  1457. operator: 'is',
  1458. value: 'hello',
  1459. },
  1460. })
  1461. end
  1462. context 'when new user has no organization' do
  1463. it 'does not match the workflow' do
  1464. expect(result[:matched_workflows]).not_to include(workflow.id)
  1465. end
  1466. end
  1467. context 'when new user is part of the organization' do
  1468. let(:payload) do
  1469. base_payload.merge('params' => { 'organization_id' => organization.id.to_s })
  1470. end
  1471. it 'does match the workflow' do
  1472. expect(result[:matched_workflows]).to include(workflow.id)
  1473. end
  1474. end
  1475. end
  1476. end