create_spec.rb 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. require 'models/form_updater/concerns/applies_ticket_template_examples'
  6. require 'models/form_updater/concerns/applies_ticket_shared_draft_examples'
  7. require 'models/form_updater/concerns/stores_taskbar_state_examples'
  8. require 'models/form_updater/concerns/applies_taskbar_state_examples'
  9. RSpec.describe(FormUpdater::Updater::Ticket::Create) do
  10. subject(:resolved_result) do
  11. described_class.new(
  12. context: context,
  13. relation_fields: relation_fields,
  14. meta: meta,
  15. data: data,
  16. id: nil
  17. )
  18. end
  19. let(:group) { create(:group, name: 'Example 1') }
  20. let(:group2) { create(:group, name: 'Example 2') }
  21. let(:level1_group) { create(:group, name: 'Depth 1-G1', parent: group) }
  22. let(:level1_group2) { create(:group, name: 'Depth 1-G2', parent: group) }
  23. let(:level2_group) { create(:group, name: 'Depth 2-G1', parent: level1_group) }
  24. let(:user) { create(:agent, groups: [group, group2, level1_group2, level2_group]) }
  25. let(:context) { { current_user: user } }
  26. let(:meta) { { initial: true, form_id: SecureRandom.uuid } }
  27. let(:data) { {} }
  28. let(:relation_fields) do
  29. [
  30. {
  31. name: 'group_id',
  32. relation: 'group',
  33. },
  34. {
  35. name: 'state_id',
  36. relation: 'TicketState',
  37. },
  38. {
  39. name: 'priority_id',
  40. relation: 'TicketPriority',
  41. },
  42. ]
  43. end
  44. let(:expected_group_options) do
  45. [
  46. {
  47. value: group.id,
  48. label: group.name_last,
  49. disabled: false,
  50. children: [
  51. {
  52. value: level1_group.id,
  53. label: level1_group.name_last,
  54. disabled: true,
  55. children: [
  56. {
  57. value: level2_group.id,
  58. label: level2_group.name_last,
  59. disabled: false
  60. }
  61. ]
  62. },
  63. {
  64. value: level1_group2.id,
  65. label: level1_group2.name_last,
  66. disabled: false,
  67. },
  68. ]
  69. },
  70. {
  71. value: group2.id,
  72. label: group2.name_last,
  73. disabled: false
  74. }
  75. ]
  76. end
  77. let(:expected_result) do
  78. {
  79. 'group_id' => {
  80. options: expected_group_options
  81. },
  82. 'state_id' => {
  83. options: Ticket::State.by_category(:viewable_agent_new).reorder(name: :asc).map { |state| { value: state.id, label: state.name } },
  84. },
  85. 'priority_id' => {
  86. options: Ticket::Priority.where(active: true).reorder(id: :asc).map { |priority| { value: priority.id, label: priority.name } },
  87. },
  88. }
  89. end
  90. context 'when resolving' do
  91. it 'returns all resolved relation fields with correct value + label' do
  92. expect(resolved_result.resolve).to include(
  93. 'group_id' => include(expected_result['group_id']),
  94. 'state_id' => include(expected_result['state_id']),
  95. 'priority_id' => include(expected_result['priority_id']),
  96. )
  97. end
  98. context 'with only one group for user' do
  99. let(:user) { create(:agent, groups: [level2_group]) }
  100. it 'returns group_id as integer' do
  101. expect(resolved_result.resolve).to include(
  102. 'group_id' => include(value: level2_group.id)
  103. )
  104. end
  105. end
  106. context 'when no permission on all parent groups' do
  107. let(:user) { create(:agent, groups: [group2, level2_group]) }
  108. let(:expected_group_options) do
  109. [
  110. {
  111. value: group.id,
  112. label: group.name_last,
  113. disabled: true,
  114. children: [
  115. {
  116. value: level1_group.id,
  117. label: level1_group.name_last,
  118. disabled: true,
  119. children: [
  120. {
  121. value: level2_group.id,
  122. label: level2_group.name_last,
  123. disabled: false
  124. }
  125. ]
  126. },
  127. ]
  128. },
  129. {
  130. value: group2.id,
  131. label: group2.name_last,
  132. disabled: false
  133. }
  134. ]
  135. end
  136. it 'returns current group options' do
  137. expect(resolved_result.resolve).to include(
  138. 'group_id' => include(expected_result['group_id']),
  139. )
  140. end
  141. end
  142. context 'when group_id is given in data' do
  143. let(:data) { { 'group_id' => group.id } }
  144. it 'returns no new value for group' do
  145. expect(resolved_result.resolve).to not_include(
  146. 'group_id' => include(value: group.id)
  147. )
  148. end
  149. end
  150. context 'with different default priority' do
  151. before do
  152. Ticket::Priority.find(1).update!(default_create: true)
  153. end
  154. it 'returns initial value for priority_id' do
  155. expect(resolved_result.resolve).to include(
  156. 'priority_id' => include(initialValue: 1)
  157. )
  158. end
  159. end
  160. context 'when customer_id should be prefilled' do
  161. let(:meta) { { initial: true, form_id: SecureRandom.uuid, additional_data: { 'customer_id' => customer.id } } }
  162. let(:customer) { create(:customer, organization: create(:organization)) }
  163. it 'returns initial value for customer_id' do
  164. expect(resolved_result.resolve).to include(
  165. 'customer_id' => include(
  166. initialValue: customer.id,
  167. options: [{
  168. value: customer.id,
  169. label: customer.fullname,
  170. heading: customer.organization.name,
  171. object: customer.attributes
  172. .slice('active', 'email', 'firstname', 'fullname', 'image', 'lastname', 'mobile', 'out_of_office', 'out_of_office_end_at', 'out_of_office_start_at', 'phone', 'source', 'vip')
  173. .merge({
  174. '__typename' => 'User',
  175. 'id' => Gql::ZammadSchema.id_from_internal_id('User', customer.id),
  176. })
  177. }]
  178. )
  179. )
  180. end
  181. end
  182. end
  183. include_examples 'FormUpdater::ChecksCoreWorkflow', object_name: 'Ticket'
  184. include_examples 'FormUpdater::HasSecurityOptions', type: 'create'
  185. include_examples 'FormUpdater::AppliesTicketTemplate'
  186. include_examples 'FormUpdater::AppliesTicketSharedDraft'
  187. include_examples 'FormUpdater::StoresTaskbarState', taskbar_key: 'TicketCreateScreen-1234', taskbar_callback: 'TicketCreate'
  188. include_examples 'FormUpdater::AppliesTaskbarState', taskbar_key: 'TicketCreateScreen-1234', taskbar_callback: 'TicketCreate'
  189. end