checks_core_workflow_examples.rb 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. RSpec.shared_examples 'ChecksCoreWorkflow' do
  3. let(:agent_group) { create(:group) }
  4. let(:agent) { create(:agent, groups: [agent_group]) }
  5. before do
  6. UserInfo.current_user_id = agent.id
  7. end
  8. context 'when creation of closed tickets are only allowed by type set' do
  9. subject(:ticket) { create(:ticket, group: agent_group, screen: 'create_middle', state: Ticket::State.find_by(name: 'open'), pending_time: 5.days.from_now) }
  10. before do
  11. create(:core_workflow,
  12. object: 'Ticket',
  13. perform: {
  14. 'ticket.state_id': {
  15. operator: 'set_fixed_to',
  16. set_fixed_to: [ Ticket::State.find_by(name: 'closed').id.to_s ]
  17. },
  18. })
  19. end
  20. it 'checks that workflow blocked creation' do
  21. expect { ticket }.to raise_error(Exceptions::UnprocessableEntity, "Invalid value '#{Ticket::State.find_by(name: 'open').id}' for field 'state_id'!")
  22. end
  23. end
  24. context 'when creation of closed tickets are only allowed by type remove' do
  25. subject(:ticket) { create(:ticket, group: agent_group, screen: 'create_middle', state: Ticket::State.find_by(name: 'open'), pending_time: 5.days.from_now) }
  26. before do
  27. create(:core_workflow,
  28. object: 'Ticket',
  29. perform: {
  30. 'ticket.state_id': {
  31. operator: 'remove_option',
  32. remove_option: [ Ticket::State.find_by(name: 'open').id.to_s ]
  33. },
  34. })
  35. end
  36. it 'checks that workflow blocked creation' do
  37. expect { ticket }.to raise_error(Exceptions::UnprocessableEntity, "Invalid value '#{Ticket::State.find_by(name: 'open').id}' for field 'state_id'!")
  38. end
  39. end
  40. context 'when creation of closed tickets are only allowed by type add' do
  41. subject(:ticket) { create(:ticket, group: agent_group, screen: 'create_middle', state: Ticket::State.find_by(name: 'open'), pending_time: 5.days.from_now) }
  42. before do
  43. create(:core_workflow,
  44. object: 'Ticket',
  45. perform: {
  46. 'ticket.state_id': {
  47. operator: 'remove_option',
  48. remove_option: [ Ticket::State.find_by(name: 'open').id.to_s ]
  49. },
  50. })
  51. create(:core_workflow,
  52. object: 'Ticket',
  53. perform: {
  54. 'ticket.state_id': {
  55. operator: 'add_option',
  56. add_option: [ Ticket::State.find_by(name: 'open').id.to_s ]
  57. },
  58. })
  59. end
  60. it 'checks ticket creation success' do
  61. expect { ticket }.not_to raise_error
  62. end
  63. end
  64. context 'when pending time on pending ticket' do
  65. subject(:ticket) { create(:ticket, group: agent_group, screen: 'create_middle', state: Ticket::State.find_by(name: 'pending reminder')) }
  66. it 'checks that the pending time is mandatory' do
  67. expect { ticket }.to raise_error(Exceptions::UnprocessableEntity, "Missing required value for field 'pending_time'!")
  68. end
  69. end
  70. context 'when creation of mandatory field but hidden' do
  71. subject(:ticket) { create(:ticket, group: agent_group, screen: 'create_middle', state: Ticket::State.find_by(name: 'open')) }
  72. before do
  73. create(:core_workflow,
  74. object: 'Ticket',
  75. perform: {
  76. 'ticket.pending_time': {
  77. operator: 'set_mandatory',
  78. set_mandatory: true
  79. },
  80. })
  81. create(:core_workflow,
  82. object: 'Ticket',
  83. perform: {
  84. 'ticket.pending_time': {
  85. operator: 'hide',
  86. hide: true
  87. },
  88. })
  89. end
  90. it 'does create a ticket without pending_time value' do
  91. expect { ticket }.not_to raise_error
  92. end
  93. end
  94. describe 'Tickets can be closed with the bulk action, even when a mandatory field is empty #4198', db_strategy: :reset do
  95. let(:ticket) { create(:ticket, group: agent_group, state: Ticket::State.find_by(name: 'open')) }
  96. let(:ticket2) { create(:ticket, group: agent_group, state: Ticket::State.find_by(name: 'open')) }
  97. let(:field_name) { SecureRandom.uuid }
  98. let(:ticket_update) { { screen: 'edit', title: 'test' } }
  99. before do
  100. ticket
  101. create(:object_manager_attribute_text, object_name: 'Ticket', name: field_name, display: field_name, screens: {
  102. 'edit' => {
  103. 'ticket.agent' => {
  104. shown: true,
  105. required: false,
  106. }
  107. }
  108. })
  109. ObjectManager::Attribute.migration_execute
  110. ticket2
  111. create(:core_workflow,
  112. object: 'Ticket',
  113. perform: {
  114. "ticket.#{field_name}": {
  115. operator: 'set_mandatory',
  116. set_mandatory: true
  117. },
  118. })
  119. end
  120. it 'does raise error for old tickets before required test field got created' do
  121. expect do
  122. ticket.update(ticket_update)
  123. end.to raise_error(Exceptions::ApplicationModel, "Missing required value for field '#{field_name}'!")
  124. end
  125. it 'does raise error for new tickets after required test field got created' do
  126. expect do
  127. ticket2.update(ticket_update)
  128. end.to raise_error(Exceptions::ApplicationModel, "Missing required value for field '#{field_name}'!")
  129. end
  130. end
  131. end