create_spec.rb 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. require 'rails_helper'
  2. require 'system/examples/text_modules_examples'
  3. RSpec.describe 'Ticket Create', type: :system do
  4. context 'when applying ticket templates' do
  5. let(:agent) { create(:agent, groups: [permitted_group]) }
  6. let(:permitted_group) { create(:group) }
  7. let(:unpermitted_group) { create(:group) }
  8. let!(:template) { create(:template, :dummy_data, group: unpermitted_group, owner: agent) }
  9. # Regression test for issue #2424 - Unavailable ticket template attributes get applied
  10. it 'unavailable attributes do not get applied', authenticated_as: :agent do
  11. visit 'ticket/create'
  12. use_template(template)
  13. expect(page).to have_no_selector 'select[name="group_id"]'
  14. end
  15. end
  16. context 'when using text modules' do
  17. include_examples 'text modules', path: 'ticket/create'
  18. end
  19. context 'S/MIME', authenticated_as: :authenticate do
  20. def authenticate
  21. Setting.set('smime_integration', true)
  22. Setting.set('smime_config', smime_config) if defined?(smime_config)
  23. current_user
  24. end
  25. context 'no certificate present' do
  26. let!(:template) { create(:template, :dummy_data) }
  27. let(:current_user) { true }
  28. it 'has no security selections' do
  29. visit 'ticket/create'
  30. within(:active_content) do
  31. use_template(template)
  32. expect(page).to have_no_css('div.js-securityEncrypt.btn--active')
  33. expect(page).to have_no_css('div.js-securitySign.btn--active')
  34. click '.js-submit'
  35. expect(page).to have_css('.ticket-article-item', count: 1)
  36. open_article_meta
  37. expect(page).to have_no_css('span', text: 'Signed')
  38. expect(page).to have_no_css('span', text: 'Encrypted')
  39. security_result = Ticket::Article.last.preferences['security']
  40. expect(security_result['encryption']['success']).to be nil
  41. expect(security_result['sign']['success']).to be nil
  42. end
  43. end
  44. end
  45. context 'private key configured' do
  46. let(:current_user) { agent }
  47. let!(:template) { create(:template, :dummy_data, group: group, owner: agent, customer: customer) }
  48. let(:system_email_address) { 'smime1@example.com' }
  49. let(:email_address) { create(:email_address, email: system_email_address) }
  50. let(:group) { create(:group, email_address: email_address) }
  51. let(:agent_groups) { [group] }
  52. let(:agent) { create(:agent, groups: agent_groups) }
  53. before do
  54. create(:smime_certificate, :with_private, fixture: system_email_address)
  55. end
  56. context 'recipient certificate present' do
  57. let(:recipient_email_address) { 'smime2@example.com' }
  58. let(:customer) { create(:customer, email: recipient_email_address) }
  59. before do
  60. create(:smime_certificate, fixture: recipient_email_address)
  61. end
  62. it 'plain' do
  63. visit 'ticket/create'
  64. within(:active_content) do
  65. use_template(template)
  66. # wait till S/MIME check AJAX call is ready
  67. expect(page).to have_css('div.js-securityEncrypt.btn--active', wait: 5)
  68. expect(page).to have_css('div.js-securitySign.btn--active', wait: 5)
  69. # deactivate encryption and signing
  70. click '.js-securityEncrypt'
  71. click '.js-securitySign'
  72. click '.js-submit'
  73. expect(page).to have_css('.ticket-article-item', count: 1)
  74. open_article_meta
  75. expect(page).to have_no_css('span', text: 'Signed')
  76. expect(page).to have_no_css('span', text: 'Encrypted')
  77. security_result = Ticket::Article.last.preferences['security']
  78. expect(security_result['encryption']['success']).to be nil
  79. expect(security_result['sign']['success']).to be nil
  80. end
  81. end
  82. it 'signed' do
  83. visit 'ticket/create'
  84. within(:active_content) do
  85. use_template(template)
  86. # wait till S/MIME check AJAX call is ready
  87. expect(page).to have_css('div.js-securityEncrypt.btn--active', wait: 5)
  88. expect(page).to have_css('div.js-securitySign.btn--active', wait: 5)
  89. # deactivate encryption
  90. click '.js-securityEncrypt'
  91. click '.js-submit'
  92. expect(page).to have_css('.ticket-article-item', count: 1)
  93. open_article_meta
  94. expect(page).to have_css('span', text: 'Signed')
  95. expect(page).to have_no_css('span', text: 'Encrypted')
  96. security_result = Ticket::Article.last.preferences['security']
  97. expect(security_result['encryption']['success']).to be nil
  98. expect(security_result['sign']['success']).to be true
  99. end
  100. end
  101. it 'encrypted' do
  102. visit 'ticket/create'
  103. within(:active_content) do
  104. use_template(template)
  105. # wait till S/MIME check AJAX call is ready
  106. expect(page).to have_css('div.js-securityEncrypt.btn--active', wait: 5)
  107. expect(page).to have_css('div.js-securitySign.btn--active', wait: 5)
  108. # deactivate signing
  109. click '.js-securitySign'
  110. click '.js-submit'
  111. expect(page).to have_css('.ticket-article-item', count: 1)
  112. open_article_meta
  113. expect(page).to have_no_css('span', text: 'Signed')
  114. expect(page).to have_css('span', text: 'Encrypted')
  115. security_result = Ticket::Article.last.preferences['security']
  116. expect(security_result['encryption']['success']).to be true
  117. expect(security_result['sign']['success']).to be nil
  118. end
  119. end
  120. it 'signed and encrypted' do
  121. visit 'ticket/create'
  122. within(:active_content) do
  123. use_template(template)
  124. # wait till S/MIME check AJAX call is ready
  125. expect(page).to have_css('div.js-securityEncrypt.btn--active', wait: 5)
  126. expect(page).to have_css('div.js-securitySign.btn--active', wait: 5)
  127. click '.js-submit'
  128. expect(page).to have_css('.ticket-article-item', count: 1)
  129. open_article_meta
  130. expect(page).to have_css('span', text: 'Signed')
  131. expect(page).to have_css('span', text: 'Encrypted')
  132. security_result = Ticket::Article.last.preferences['security']
  133. expect(security_result['encryption']['success']).to be true
  134. expect(security_result['sign']['success']).to be true
  135. end
  136. end
  137. context 'Group default behavior' do
  138. let(:smime_config) { {} }
  139. shared_examples 'security defaults example' do |sign:, encrypt:|
  140. it "security defaults sign: #{sign}, encrypt: #{encrypt}" do
  141. within(:active_content) do
  142. encrypt_button = find('.js-securityEncrypt', wait: 5)
  143. sign_button = find('.js-securitySign', wait: 5)
  144. await_empty_ajax_queue
  145. active_button_class = '.btn--active'
  146. expect(encrypt_button.matches_css?(active_button_class, wait: 2)).to be(encrypt)
  147. expect(sign_button.matches_css?(active_button_class, wait: 2)).to be(sign)
  148. end
  149. end
  150. end
  151. shared_examples 'security defaults' do |sign:, encrypt:|
  152. before do
  153. visit 'ticket/create'
  154. within(:active_content) do
  155. use_template(template)
  156. end
  157. end
  158. include_examples 'security defaults example', sign: sign, encrypt: encrypt
  159. end
  160. shared_examples 'security defaults group change' do |sign:, encrypt:|
  161. before do
  162. visit 'ticket/create'
  163. within(:active_content) do
  164. use_template(template)
  165. await_empty_ajax_queue
  166. select new_group.name, from: 'group_id'
  167. end
  168. end
  169. include_examples 'security defaults example', sign: sign, encrypt: encrypt
  170. end
  171. context 'not configured' do
  172. it_behaves_like 'security defaults', sign: true, encrypt: true
  173. end
  174. context 'configuration present' do
  175. let(:smime_config) do
  176. {
  177. 'group_id' => group_defaults
  178. }
  179. end
  180. let(:group_defaults) do
  181. {
  182. 'default_encryption' => {
  183. group.id.to_s => default_encryption,
  184. },
  185. 'default_sign' => {
  186. group.id.to_s => default_sign,
  187. }
  188. }
  189. end
  190. let(:default_sign) { true }
  191. let(:default_encryption) { true }
  192. shared_examples 'sign and encrypt variations' do |check_examples_name|
  193. it_behaves_like check_examples_name, sign: true, encrypt: true
  194. context 'no value' do
  195. let(:group_defaults) { {} }
  196. it_behaves_like check_examples_name, sign: true, encrypt: true
  197. end
  198. context 'signing disabled' do
  199. let(:default_sign) { false }
  200. it_behaves_like check_examples_name, sign: false, encrypt: true
  201. end
  202. context 'encryption disabled' do
  203. let(:default_encryption) { false }
  204. it_behaves_like check_examples_name, sign: true, encrypt: false
  205. end
  206. end
  207. context 'same Group' do
  208. it_behaves_like 'sign and encrypt variations', 'security defaults'
  209. end
  210. context 'Group change' do
  211. let(:new_group) { create(:group, email_address: email_address) }
  212. let(:agent_groups) { [group, new_group] }
  213. let(:group_defaults) do
  214. {
  215. 'default_encryption' => {
  216. new_group.id.to_s => default_encryption,
  217. },
  218. 'default_sign' => {
  219. new_group.id.to_s => default_sign,
  220. }
  221. }
  222. end
  223. it_behaves_like 'sign and encrypt variations', 'security defaults group change'
  224. end
  225. end
  226. end
  227. end
  228. end
  229. end
  230. describe 'object manager attributes maxlength', authenticated_as: :authenticate, db_strategy: :reset do
  231. def authenticate
  232. create :object_manager_attribute_text, name: 'maxtest', display: 'maxtest', screens: attributes_for(:required_screen), data_option: {
  233. 'type' => 'text',
  234. 'maxlength' => 3,
  235. 'null' => true,
  236. 'translate' => false,
  237. 'default' => '',
  238. 'options' => {},
  239. 'relation' => '',
  240. }
  241. ObjectManager::Attribute.migration_execute
  242. true
  243. end
  244. it 'checks ticket create' do
  245. visit 'ticket/create'
  246. within(:active_content) do
  247. fill_in 'maxtest', with: 'hellu'
  248. expect(page.find_field('maxtest').value).to eq('hel')
  249. end
  250. end
  251. end
  252. describe 'GitLab Integration', :integration, authenticated_as: :authenticate do
  253. let(:customer) { create(:customer) }
  254. let(:agent) { create(:agent, groups: [Group.find_by(name: 'Users')]) }
  255. let!(:template) { create(:template, :dummy_data, group: Group.find_by(name: 'Users'), owner: agent, customer: customer) }
  256. before(:all) do # rubocop:disable RSpec/BeforeAfterAll
  257. required_envs = %w[GITLAB_ENDPOINT GITLAB_APITOKEN]
  258. required_envs.each do |key|
  259. skip("NOTICE: Missing environment variable #{key} for test! (Please fill up: #{required_envs.join(' && ')})") if ENV[key].blank?
  260. end
  261. end
  262. def authenticate
  263. Setting.set('gitlab_integration', true)
  264. Setting.set('gitlab_config', {
  265. api_token: ENV['GITLAB_APITOKEN'],
  266. endpoint: ENV['GITLAB_ENDPOINT'],
  267. })
  268. true
  269. end
  270. it 'creates a ticket with links' do
  271. visit 'ticket/create'
  272. within(:active_content) do
  273. use_template(template)
  274. # switch to gitlab sidebar
  275. click('.tabsSidebar-tab[data-tab=gitlab]')
  276. click('.sidebar-header-headline.js-headline')
  277. # add issue
  278. click_on 'Link issue'
  279. fill_in 'link', with: ENV['GITLAB_ISSUE_LINK']
  280. click_on 'Submit'
  281. await_empty_ajax_queue
  282. # verify issue
  283. content = find('.sidebar-git-issue-content')
  284. expect(content).to have_text('#1 Example issue')
  285. expect(content).to have_text('critical')
  286. expect(content).to have_text('special')
  287. expect(content).to have_text('important milestone')
  288. expect(content).to have_text('zammad-robot')
  289. # create Ticket
  290. click '.js-submit'
  291. await_empty_ajax_queue
  292. # check stored data
  293. expect(Ticket.last.preferences[:gitlab][:issue_links][0]).to eq(ENV['GITLAB_ISSUE_LINK'])
  294. end
  295. end
  296. end
  297. describe 'GitHub Integration', :integration, authenticated_as: :authenticate do
  298. let(:customer) { create(:customer) }
  299. let(:agent) { create(:agent, groups: [Group.find_by(name: 'Users')]) }
  300. let!(:template) { create(:template, :dummy_data, group: Group.find_by(name: 'Users'), owner: agent, customer: customer) }
  301. before(:all) do # rubocop:disable RSpec/BeforeAfterAll
  302. required_envs = %w[GITHUB_ENDPOINT GITHUB_APITOKEN]
  303. required_envs.each do |key|
  304. skip("NOTICE: Missing environment variable #{key} for test! (Please fill up: #{required_envs.join(' && ')})") if ENV[key].blank?
  305. end
  306. end
  307. def authenticate
  308. Setting.set('github_integration', true)
  309. Setting.set('github_config', {
  310. api_token: ENV['GITHUB_APITOKEN'],
  311. endpoint: ENV['GITHUB_ENDPOINT'],
  312. })
  313. true
  314. end
  315. it 'creates a ticket with links' do
  316. visit 'ticket/create'
  317. within(:active_content) do
  318. use_template(template)
  319. # switch to github sidebar
  320. click('.tabsSidebar-tab[data-tab=github]')
  321. click('.sidebar-header-headline.js-headline')
  322. # add issue
  323. click_on 'Link issue'
  324. fill_in 'link', with: ENV['GITHUB_ISSUE_LINK']
  325. click_on 'Submit'
  326. await_empty_ajax_queue
  327. # verify issue
  328. content = find('.sidebar-git-issue-content')
  329. expect(content).to have_text('#1575 GitHub integration')
  330. expect(content).to have_text('feature backlog')
  331. expect(content).to have_text('integration')
  332. expect(content).to have_text('4.0')
  333. expect(content).to have_text('Thorsten')
  334. # create Ticket
  335. click '.js-submit'
  336. await_empty_ajax_queue
  337. # check stored data
  338. expect(Ticket.last.preferences[:github][:issue_links][0]).to eq(ENV['GITHUB_ISSUE_LINK'])
  339. end
  340. end
  341. end
  342. end