edit_spec.rb 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe 'Knowledge Base Locale Answer Edit', type: :system do
  4. include_context 'basic Knowledge Base'
  5. before do
  6. published_answer && draft_answer && internal_answer
  7. end
  8. it 'wraps long texts' do
  9. long_string = '3KKFA9DAWE9VJYNNnpYRRtMwfa168O1yvpD2t9QXsfb3cppGV6KZ12q0UUJIy5r4Exfk18GnWPR0A3SoDsjxIHz1Gcu4aCEVzenilSOu4gAfxnB6k3mSBUOGIfdgChEBYhcHGgiCmV2EoXu4gG7GAJxKJhM2d4NUiL5RZttGtMXYYFr2Jsg7MV7xXGcygnsLMYqnwzOJxBK0vH3fzhdIZd6YrqR3fggaY0RyKtVigOBZ2SETC8s238Z9eDL4gfUW'
  10. visit "#knowledge_base/#{knowledge_base.id}/locale/#{primary_locale.system_locale.locale}/answer/#{draft_answer.id}/edit"
  11. within(:active_content) do
  12. find('.richtext-content').send_keys long_string
  13. expect(page).to have_css('.js-submit') { |elem| !elem.obscured? }
  14. expect(page).to have_css('.page-header-title') { |elem| !elem.obscured? }
  15. end
  16. end
  17. context 'add weblink' do
  18. def open_editor_and_add_link(input)
  19. visit "#knowledge_base/#{knowledge_base.id}/locale/#{primary_locale.system_locale.locale}/answer/#{draft_answer.id}/edit"
  20. find('a[data-action="link"]').click
  21. within('.popover-content') do
  22. find('input').fill_in with: input
  23. find('[type=submit]').click
  24. end
  25. end
  26. it 'allows mailto links' do
  27. open_editor_and_add_link 'mailto:test@example.com'
  28. expect(page).to have_link(href: 'mailto:test@example.com')
  29. end
  30. it 'allows link with a protocol' do
  31. open_editor_and_add_link 'protocol://example.org'
  32. expect(page).to have_link(href: 'protocol://example.org')
  33. end
  34. it 'allows relative link' do
  35. open_editor_and_add_link '/path'
  36. expect(page).to have_link(href: '/path')
  37. end
  38. it 'allows non-protocol URL and prepends default protocol' do
  39. open_editor_and_add_link 'example.com'
  40. expect(page).to have_link(href: 'http://example.com')
  41. end
  42. end
  43. context 'embedded video' do
  44. it 'has adding functionality' do
  45. visit "#knowledge_base/#{knowledge_base.id}/locale/#{primary_locale.system_locale.locale}/answer/#{published_answer.id}/edit"
  46. find('a[data-action="embed_video"]').click
  47. within('.popover-content') do
  48. find('input').fill_in with: 'https://www.youtube.com/watch?v=vTTzwJsHpU8'
  49. find('[type=submit]').click
  50. end
  51. within('.richtext-content') do
  52. expect(page).to have_text('( widget: video, provider: youtube, id: vTTzwJsHpU8 )')
  53. end
  54. end
  55. it 'loads stored' do
  56. visit "#knowledge_base/#{knowledge_base.id}/locale/#{primary_locale.system_locale.locale}/answer/#{published_answer_with_video.id}"
  57. iframe = find('iframe')
  58. expect(iframe['src']).to start_with('https://www.youtube.com/embed/')
  59. end
  60. end
  61. context 'tags' do
  62. before do
  63. visit "#knowledge_base/#{knowledge_base.id}/locale/#{locale_name}/answer/#{published_answer_with_tag.id}/edit"
  64. end
  65. let(:new_tag_name) { 'capybara_kb_tag' }
  66. it 'adds a new tag' do
  67. within :active_content do
  68. click '.js-newTagLabel'
  69. elem = find('.js-newTagInput')
  70. elem.fill_in with: new_tag_name
  71. elem.send_keys :return
  72. wait.until_exists { published_answer_with_tag.reload.tag_list.include? new_tag_name }
  73. expect(page).to have_link(new_tag_name, href: false, class: ['js-tag'])
  74. end
  75. end
  76. it 'triggers autocomplete after one character' do
  77. within :active_content do
  78. click '.js-newTagLabel'
  79. elem = find('.js-newTagInput')
  80. elem.fill_in with: 'e'
  81. expect(page).to have_css('ul.ui-autocomplete > li.ui-menu-item', minimum: 1)
  82. end
  83. end
  84. it 'shows an existing tag' do
  85. within :active_content do
  86. expect(page).to have_link(published_answer_tag_name, href: false, class: ['js-tag'])
  87. end
  88. end
  89. it 'deletes a tag' do
  90. within :active_content do
  91. find('.list-item', text: published_answer_tag_name)
  92. .find('.js-delete').click
  93. expect(page).to have_no_link(published_answer_tag_name, href: false, class: ['js-tag'])
  94. wait.until_exists { published_answer_with_tag.reload.tag_list.exclude? published_answer_tag_name }
  95. end
  96. end
  97. end
  98. describe 'linked tickets' do
  99. let(:ticket) { Ticket.first }
  100. it 'links a ticket' do
  101. visit "#knowledge_base/#{knowledge_base.id}/locale/#{locale_name}/answer/#{published_answer.id}/edit"
  102. within '.knowledge-base-sidebar .sidebar-linked-tickets' do
  103. click '.js-add'
  104. end
  105. in_modal do
  106. fill_in 'ticket_number', with: ticket.number
  107. click '.js-submit'
  108. end
  109. within '.knowledge-base-sidebar .sidebar-linked-tickets' do
  110. expect(page).to have_text(ticket.title)
  111. end
  112. added_link = Link.list(link_object: 'Ticket', link_object_value: ticket.id).last
  113. expect(added_link).to eq({
  114. 'link_object' => 'KnowledgeBase::Answer::Translation',
  115. 'link_object_value' => published_answer.translations.first.id,
  116. 'link_type' => 'normal',
  117. })
  118. end
  119. context 'when a linked ticket exists' do
  120. before do
  121. create(:link, from: ticket, to: published_answer.translations.first)
  122. visit "#knowledge_base/#{knowledge_base.id}/locale/#{locale_name}/answer/#{published_answer.id}/edit"
  123. end
  124. it 'shows a linked ticket' do
  125. within '.knowledge-base-sidebar .sidebar-linked-tickets' do
  126. expect(page).to have_text(ticket.title)
  127. end
  128. end
  129. it 'removes a linked ticket' do
  130. within '.knowledge-base-sidebar .sidebar-linked-tickets' do
  131. click '.js-delete'
  132. expect(page).to have_no_text(ticket.title)
  133. end
  134. expect(Link.list(link_object: 'Ticket', link_object_value: ticket.id)).to be_blank
  135. end
  136. context 'when agent has no acess to ticket', authenticated_as: -> { create(:admin) } do
  137. it 'does not show a linked ticket' do
  138. within '.knowledge-base-sidebar .sidebar-linked-tickets' do
  139. expect(page).to have_no_text(ticket.title)
  140. end
  141. end
  142. end
  143. end
  144. end
  145. context 'deleted by another user' do
  146. before do
  147. visit "#knowledge_base/#{knowledge_base.id}/locale/#{primary_locale.system_locale.locale}/answer/#{published_answer.id}/edit"
  148. end
  149. it 'shows not available', performs_jobs: true do
  150. find(:active_content, text: published_answer.translations.first.title)
  151. perform_enqueued_jobs do
  152. ActiveRecord::Base.transaction do
  153. published_answer.destroy
  154. end
  155. end
  156. within :active_content do
  157. expect(page).to have_text('The page is not available anymore')
  158. end
  159. end
  160. end
  161. context 'updated by another user' do
  162. before do
  163. ensure_websocket do
  164. visit "#knowledge_base/#{knowledge_base.id}/locale/#{primary_locale.system_locale.locale}/answer/#{published_answer.id}/edit"
  165. end
  166. travel 1.minute
  167. end
  168. it 'shows new content', performs_jobs: true do
  169. find(:active_content, text: published_answer.translations.first.title)
  170. accept_prompt do
  171. perform_enqueued_jobs do
  172. Transaction.execute do
  173. published_answer.translations.first.update! title: 'new title'
  174. end
  175. end
  176. end
  177. within :active_content do
  178. expect(page).to have_text('new title')
  179. end
  180. end
  181. end
  182. describe 'previewing' do
  183. before do
  184. visit "#knowledge_base/#{knowledge_base.id}/locale/#{primary_locale.system_locale.locale}/answer/#{draft_answer.id}/edit"
  185. end
  186. it 'opens preview' do
  187. new_window = window_opened_by { click '.icon-external' }
  188. within_window new_window do
  189. within '.main--article' do
  190. expect(page).to have_text(draft_answer.translations.first.title)
  191. end
  192. end
  193. end
  194. it 'creates a KB preview token' do
  195. expect { click('.icon-external') }
  196. .to change { Token.exists?(action: 'KnowledgeBasePreview') }
  197. .to(true)
  198. end
  199. end
  200. end