edit_spec.rb 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. require 'models/form_updater/concerns/checks_core_workflow_examples'
  4. require 'models/form_updater/concerns/has_security_options_examples'
  5. RSpec.describe(FormUpdater::Updater::Ticket::Edit) do
  6. subject(:resolved_result) do
  7. described_class.new(
  8. context: context,
  9. relation_fields: relation_fields,
  10. meta: meta,
  11. data: data,
  12. id: id,
  13. )
  14. end
  15. let(:group) { create(:group) }
  16. let(:user) { create(:agent, groups: [group]) }
  17. let(:context) { { current_user: user } }
  18. let(:meta) { { initial: true, form_id: SecureRandom.uuid } }
  19. let(:data) { {} }
  20. let(:id) { nil }
  21. let(:relation_fields) do
  22. [
  23. {
  24. name: 'group_id',
  25. relation: 'group',
  26. },
  27. {
  28. name: 'state_id',
  29. relation: 'TicketState',
  30. },
  31. {
  32. name: 'priority_id',
  33. relation: 'TicketPriority',
  34. },
  35. ]
  36. end
  37. let(:expected_result) do
  38. {
  39. 'group_id' => {
  40. options: [ { value: group.id, label: group.name } ],
  41. },
  42. 'state_id' => {
  43. options: Ticket::State.by_category(:viewable_agent_edit).reorder(name: :asc).map { |state| { value: state.id, label: state.name } },
  44. },
  45. 'priority_id' => {
  46. options: Ticket::Priority.where(active: true).reorder(id: :asc).map { |priority| { value: priority.id, label: priority.name } },
  47. },
  48. }
  49. end
  50. context 'when resolving' do
  51. it 'returns all resolved relation fields with correct value + label' do
  52. expect(resolved_result.resolve).to include(
  53. 'group_id' => include(expected_result['group_id']),
  54. 'state_id' => include(expected_result['state_id']),
  55. 'priority_id' => include(expected_result['priority_id']),
  56. )
  57. end
  58. context 'when body is used' do
  59. before do
  60. create(:core_workflow, object: 'Ticket',
  61. perform: {
  62. body: {
  63. operator: 'set_readonly',
  64. set_readonly: true
  65. },
  66. })
  67. end
  68. it 'body (and also attachments) should be disabled' do
  69. expect(resolved_result.resolve).to include(
  70. 'body' => include({
  71. disabled: true,
  72. }),
  73. 'attachments' => include({
  74. disabled: true,
  75. }),
  76. )
  77. end
  78. end
  79. context 'when ticket has object attribute value with a historical value', db_strategy: :reset do
  80. let(:field_name) { SecureRandom.uuid }
  81. let(:screens) do
  82. {
  83. create_middle: {
  84. '-all-' => {
  85. shown: true,
  86. required: false,
  87. },
  88. },
  89. create: {
  90. '-all-' => {
  91. shown: true,
  92. required: false,
  93. },
  94. },
  95. edit: {
  96. '-all-' => {
  97. shown: true,
  98. required: false,
  99. },
  100. },
  101. }
  102. end
  103. let(:object_attribute_field_type) { :object_manager_attribute_select }
  104. let(:object_attribute) do
  105. create(object_attribute_field_type, object_name: 'Ticket', name: field_name, display: field_name, screens: screens)
  106. end
  107. let(:ticket_object_attribute_value) { 'key_3' }
  108. let(:id) do
  109. Gql::ZammadSchema.id_from_object(create(:ticket, group: group, object_attribute.name => ticket_object_attribute_value))
  110. end
  111. before do
  112. object_attribute
  113. ObjectManager::Attribute.migration_execute
  114. object_attribute.reload
  115. end
  116. shared_examples 'resolve fields' do
  117. it 'checks that "rejectNonExistentValues" is false' do
  118. # Trigger first object authorization check.
  119. resolved_result.authorized?
  120. result = resolved_result.resolve
  121. expect(result[field_name]).to include(expected_result)
  122. end
  123. end
  124. context 'when object attribute is a select field' do
  125. before do
  126. object_attribute.update!(data_option: object_attribute[:data_option].merge({ options: { key_1: 'value_1', key_2: 'value_2' } }))
  127. ObjectManager::Attribute.migration_execute
  128. end
  129. let(:expected_result) do
  130. {
  131. options: [
  132. {
  133. value: 'key_1',
  134. label: 'value_1',
  135. },
  136. {
  137. value: 'key_2',
  138. label: 'value_2',
  139. },
  140. ],
  141. clearable: true,
  142. rejectNonExistentValues: false
  143. }
  144. end
  145. include_examples 'resolve fields'
  146. end
  147. context 'when object attribute is a tree select field' do
  148. let(:object_attribute_field_type) { :object_manager_attribute_tree_select }
  149. let(:ticket_object_attribute_value) { 'Incident::Softwareproblem::MS Office' }
  150. let(:expected_result) do
  151. {
  152. options: [
  153. {
  154. label: 'Incident',
  155. value: 'Incident',
  156. disabled: false,
  157. children: [
  158. {
  159. label: 'Hardware',
  160. value: 'Incident::Hardware',
  161. disabled: false,
  162. children: [
  163. {
  164. label: 'Monitor',
  165. value: 'Incident::Hardware::Monitor',
  166. disabled: false,
  167. },
  168. {
  169. label: 'Mouse',
  170. value: 'Incident::Hardware::Mouse',
  171. disabled: false,
  172. },
  173. ]
  174. },
  175. ]
  176. },
  177. {
  178. label: 'Change request',
  179. value: 'Change request',
  180. disabled: false,
  181. }
  182. ],
  183. clearable: true,
  184. rejectNonExistentValues: false
  185. }
  186. end
  187. before do
  188. object_attribute.update!(data_option: object_attribute[:data_option].merge({ options: [
  189. {
  190. 'name' => 'Incident',
  191. 'value' => 'Incident',
  192. 'children' => [
  193. {
  194. 'name' => 'Hardware',
  195. 'value' => 'Incident::Hardware',
  196. 'children' => [
  197. {
  198. 'name' => 'Monitor',
  199. 'value' => 'Incident::Hardware::Monitor'
  200. },
  201. {
  202. 'name' => 'Mouse',
  203. 'value' => 'Incident::Hardware::Mouse'
  204. },
  205. ]
  206. },
  207. ]
  208. },
  209. {
  210. 'name' => 'Change request',
  211. 'value' => 'Change request'
  212. }
  213. ] }))
  214. ObjectManager::Attribute.migration_execute
  215. end
  216. include_examples 'resolve fields'
  217. end
  218. end
  219. end
  220. include_examples 'FormUpdater::ChecksCoreWorkflow', object_name: 'Ticket'
  221. include_examples 'FormUpdater::HasSecurityOptions', type: 'edit'
  222. end