renderer_spec.rb 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe NotificationFactory::Renderer do
  4. # rubocop:disable Lint/InterpolationCheck
  5. describe 'render' do
  6. before { @user = User.where(firstname: 'Nicole').first }
  7. it 'correctly renders a blank template' do
  8. renderer = build(:notification_factory_renderer)
  9. expect(renderer.render).to eq ''
  10. end
  11. context 'when rendering templates with ERB tags' do
  12. let(:template) { '<%% <%= "<%" %> %%>' }
  13. it 'ignores pre-existing ERB tags in an untrusted template' do
  14. renderer = build(:notification_factory_renderer, template: template)
  15. expect(renderer.render).to eq '<% <%= "<%" %> %%>'
  16. end
  17. it 'executes pre-existing ERB tags in a trusted template' do
  18. renderer = build(:notification_factory_renderer, template: template, trusted: true)
  19. expect(renderer.render).to eq '<% <% %%>'
  20. end
  21. end
  22. it 'correctly renders chained object references' do
  23. user = User.where(firstname: 'Nicole').first
  24. ticket = create(:ticket, customer: user)
  25. renderer = build(:notification_factory_renderer,
  26. objects: { ticket: ticket },
  27. template: '#{ticket.customer.firstname.downcase}')
  28. expect(renderer.render).to eq 'nicole'
  29. end
  30. it 'correctly renders multiple value calls' do
  31. ticket = create(:ticket, customer: @user)
  32. renderer = build(:notification_factory_renderer,
  33. objects: { ticket: ticket },
  34. template: '#{ticket.created_at.value.value.value.value.to_s.first}')
  35. expect(renderer.render).to eq '2'
  36. end
  37. it 'raises a StandardError when rendering a template with a broken syntax' do
  38. renderer = build(:notification_factory_renderer, template: 'test <% if %>', objects: {}, trusted: true)
  39. expect { renderer.render }.to raise_error(StandardError)
  40. end
  41. it 'raises a StandardError when rendering a template calling a non existant method' do
  42. renderer = build(:notification_factory_renderer, template: 'test <% Ticket.non_existant_method %>', objects: {}, trusted: true)
  43. expect { renderer.render }.to raise_error(StandardError)
  44. end
  45. it 'raises a StandardError when rendering a template referencing a non existant object' do
  46. renderer = build(:notification_factory_renderer, template: 'test <% NonExistantObject.first %>', objects: {}, trusted: true)
  47. expect { renderer.render }.to raise_error(StandardError)
  48. end
  49. context 'when handling ObjectManager::Attribute usage', db_strategy: :reset do
  50. before do
  51. create_object_manager_attribute
  52. ObjectManager::Attribute.migration_execute
  53. end
  54. let(:renderer) do
  55. build(:notification_factory_renderer,
  56. objects: { ticket: ticket },
  57. template: template)
  58. end
  59. shared_examples 'correctly rendering the attributes' do
  60. it 'correctly renders the attributes' do
  61. expect(renderer.render).to eq expected_render
  62. end
  63. end
  64. context 'with a simple select attribute' do
  65. let(:create_object_manager_attribute) do
  66. create(:object_manager_attribute_select, name: 'select')
  67. end
  68. let(:ticket) { create(:ticket, customer: @user, select: 'key_1') }
  69. let(:template) { '#{ticket.select} _SEPERATOR_ #{ticket.select.value}' }
  70. let(:expected_render) { 'key_1 _SEPERATOR_ value_1' }
  71. it_behaves_like 'correctly rendering the attributes'
  72. end
  73. context 'with select attribute on chained user object' do
  74. let(:create_object_manager_attribute) do
  75. create(:object_manager_attribute_select,
  76. object_lookup_id: ObjectLookup.by_name('User'),
  77. name: 'select')
  78. end
  79. let(:user) do
  80. user = User.where(firstname: 'Nicole').first
  81. user.select = 'key_2'
  82. user.save
  83. user
  84. end
  85. let(:ticket) { create(:ticket, customer: user) }
  86. let(:template) { '#{ticket.customer.select} _SEPERATOR_ #{ticket.customer.select.value}' }
  87. let(:expected_render) { 'key_2 _SEPERATOR_ value_2' }
  88. it_behaves_like 'correctly rendering the attributes'
  89. end
  90. context 'with select attribute on chained group object' do
  91. let(:create_object_manager_attribute) do
  92. create(:object_manager_attribute_select,
  93. object_lookup_id: ObjectLookup.by_name('Group'),
  94. name: 'select')
  95. end
  96. let(:template) { '#{ticket.group.select} _SEPERATOR_ #{ticket.group.select.value}' }
  97. let(:expected_render) { 'key_3 _SEPERATOR_ value_3' }
  98. let(:ticket) { create(:ticket, customer: @user) }
  99. before do
  100. group = ticket.group
  101. group.select = 'key_3'
  102. group.save
  103. end
  104. it_behaves_like 'correctly rendering the attributes'
  105. end
  106. context 'with select attribute on chained organization object' do
  107. let(:create_object_manager_attribute) do
  108. create(:object_manager_attribute_select,
  109. object_lookup_id: ObjectLookup.by_name('Organization'),
  110. name: 'select')
  111. end
  112. let(:user) do
  113. @user.organization.select = 'key_2'
  114. @user.organization.save
  115. @user
  116. end
  117. let(:ticket) { create(:ticket, customer: user) }
  118. let(:template) { '#{ticket.customer.organization.select} _SEPERATOR_ #{ticket.customer.organization.select.value}' }
  119. let(:expected_render) { 'key_2 _SEPERATOR_ value_2' }
  120. it_behaves_like 'correctly rendering the attributes'
  121. end
  122. context 'with multiselect', mariadb: true do
  123. context 'with a simple multiselect attribute' do
  124. let(:create_object_manager_attribute) do
  125. create(:object_manager_attribute_multiselect, name: 'multiselect')
  126. end
  127. let(:ticket) { create(:ticket, customer: @user, multiselect: ['key_1']) }
  128. let(:template) { '#{ticket.multiselect} _SEPERATOR_ #{ticket.multiselect.value}' }
  129. let(:expected_render) { 'key_1 _SEPERATOR_ value_1' }
  130. it_behaves_like 'correctly rendering the attributes'
  131. end
  132. context 'with single multiselect attribute on chained user object' do
  133. let(:create_object_manager_attribute) do
  134. create(:object_manager_attribute_multiselect,
  135. object_lookup_id: ObjectLookup.by_name('User'),
  136. name: 'multiselect')
  137. end
  138. let(:user) do
  139. user = User.where(firstname: 'Nicole').first
  140. user.multiselect = ['key_2']
  141. user.save
  142. user
  143. end
  144. let(:ticket) { create(:ticket, customer: user) }
  145. let(:template) { '#{ticket.customer.multiselect} _SEPERATOR_ #{ticket.customer.multiselect.value}' }
  146. let(:expected_render) { 'key_2 _SEPERATOR_ value_2' }
  147. it_behaves_like 'correctly rendering the attributes'
  148. end
  149. context 'with single multiselect attribute on chained group object' do
  150. let(:create_object_manager_attribute) do
  151. create(:object_manager_attribute_multiselect,
  152. object_lookup_id: ObjectLookup.by_name('Group'),
  153. name: 'multiselect')
  154. end
  155. let(:template) { '#{ticket.group.multiselect} _SEPERATOR_ #{ticket.group.multiselect.value}' }
  156. let(:expected_render) { 'key_3 _SEPERATOR_ value_3' }
  157. let(:ticket) { create(:ticket, customer: @user) }
  158. before do
  159. group = ticket.group
  160. group.multiselect = ['key_3']
  161. group.save
  162. end
  163. it_behaves_like 'correctly rendering the attributes'
  164. end
  165. context 'with single multiselect attribute on chained organization object' do
  166. let(:create_object_manager_attribute) do
  167. create(:object_manager_attribute_multiselect,
  168. object_lookup_id: ObjectLookup.by_name('Organization'),
  169. name: 'multiselect')
  170. end
  171. let(:user) do
  172. @user.organization.multiselect = ['key_2']
  173. @user.organization.save
  174. @user
  175. end
  176. let(:ticket) { create(:ticket, customer: user) }
  177. let(:template) { '#{ticket.customer.organization.multiselect} _SEPERATOR_ #{ticket.customer.organization.multiselect.value}' }
  178. let(:expected_render) { 'key_2 _SEPERATOR_ value_2' }
  179. it_behaves_like 'correctly rendering the attributes'
  180. end
  181. context 'with a multiple multiselect attribute' do
  182. let(:create_object_manager_attribute) do
  183. create(:object_manager_attribute_multiselect, name: 'multiselect')
  184. end
  185. let(:ticket) { create(:ticket, customer: @user, multiselect: %w[key_1 key_2]) }
  186. let(:template) { '#{ticket.multiselect} _SEPERATOR_ #{ticket.multiselect.value}' }
  187. let(:expected_render) { 'key_1, key_2 _SEPERATOR_ value_1, value_2' }
  188. it_behaves_like 'correctly rendering the attributes'
  189. end
  190. context 'with multiple multiselect attribute on chained user object' do
  191. let(:create_object_manager_attribute) do
  192. create(:object_manager_attribute_multiselect,
  193. object_lookup_id: ObjectLookup.by_name('User'),
  194. name: 'multiselect')
  195. end
  196. let(:user) do
  197. user = User.where(firstname: 'Nicole').first
  198. user.multiselect = %w[key_2 key_3]
  199. user.save
  200. user
  201. end
  202. let(:ticket) { create(:ticket, customer: user) }
  203. let(:template) { '#{ticket.customer.multiselect} _SEPERATOR_ #{ticket.customer.multiselect.value}' }
  204. let(:expected_render) { 'key_2, key_3 _SEPERATOR_ value_2, value_3' }
  205. it_behaves_like 'correctly rendering the attributes'
  206. end
  207. context 'with multiple multiselect attribute on chained group object' do
  208. let(:create_object_manager_attribute) do
  209. create(:object_manager_attribute_multiselect,
  210. object_lookup_id: ObjectLookup.by_name('Group'),
  211. name: 'multiselect')
  212. end
  213. let(:template) { '#{ticket.group.multiselect} _SEPERATOR_ #{ticket.group.multiselect.value}' }
  214. let(:expected_render) { 'key_3, key_1 _SEPERATOR_ value_3, value_1' }
  215. let(:ticket) { create(:ticket, customer: @user) }
  216. before do
  217. group = ticket.group
  218. group.multiselect = %w[key_3 key_1]
  219. group.save
  220. end
  221. it_behaves_like 'correctly rendering the attributes'
  222. end
  223. context 'with multiple multiselect attribute on chained organization object' do
  224. let(:create_object_manager_attribute) do
  225. create(:object_manager_attribute_multiselect,
  226. object_lookup_id: ObjectLookup.by_name('Organization'),
  227. name: 'multiselect')
  228. end
  229. let(:user) do
  230. @user.organization.multiselect = %w[key_2 key_1]
  231. @user.organization.save
  232. @user
  233. end
  234. let(:ticket) { create(:ticket, customer: user) }
  235. let(:template) { '#{ticket.customer.organization.multiselect} _SEPERATOR_ #{ticket.customer.organization.multiselect.value}' }
  236. let(:expected_render) { 'key_2, key_1 _SEPERATOR_ value_2, value_1' }
  237. it_behaves_like 'correctly rendering the attributes'
  238. end
  239. end
  240. context 'with a tree select attribute' do
  241. let(:create_object_manager_attribute) do
  242. create(:object_manager_attribute_tree_select, name: 'tree_select')
  243. end
  244. let(:ticket) { create(:ticket, customer: @user, tree_select: 'Incident::Hardware::Laptop') }
  245. let(:template) { '#{ticket.tree_select} _SEPERATOR_ #{ticket.tree_select.value}' }
  246. let(:expected_render) { 'Incident::Hardware::Laptop _SEPERATOR_ Incident::Hardware::Laptop' }
  247. it_behaves_like 'correctly rendering the attributes'
  248. end
  249. end
  250. end
  251. # rubocop:enable Lint/InterpolationCheck
  252. end