/spec/support/shared_examples/features/content_editor_shared_examples.rb

https://github.com/gitlabhq/gitlabhq · Ruby · 122 lines · 86 code · 35 blank · 1 comment · 0 complexity · c95478e25417ca6bf3d0c53ea184d941 MD5 · raw file

  1. # frozen_string_literal: true
  2. RSpec.shared_examples 'edits content using the content editor' do
  3. content_editor_testid = '[data-testid="content-editor"] [contenteditable].ProseMirror'
  4. describe 'formatting bubble menu' do
  5. it 'shows a formatting bubble menu for a regular paragraph' do
  6. expect(page).to have_css(content_editor_testid)
  7. find(content_editor_testid).send_keys 'Typing text in the content editor'
  8. find(content_editor_testid).send_keys [:shift, :left]
  9. expect(page).to have_css('[data-testid="formatting-bubble-menu"]')
  10. end
  11. it 'does not show a formatting bubble menu for code' do
  12. find(content_editor_testid).send_keys 'This is a `code`'
  13. find(content_editor_testid).send_keys [:shift, :left]
  14. expect(page).not_to have_css('[data-testid="formatting-bubble-menu"]')
  15. end
  16. end
  17. describe 'code block' do
  18. before do
  19. visit(profile_preferences_path)
  20. find('.syntax-theme').choose('Dark')
  21. wait_for_requests
  22. page.go_back
  23. refresh
  24. end
  25. it 'applies theme classes to code blocks' do
  26. expect(page).not_to have_css('.content-editor-code-block.code.highlight.dark')
  27. find(content_editor_testid).send_keys [:enter, :enter]
  28. find(content_editor_testid).send_keys '```js ' # trigger input rule
  29. find(content_editor_testid).send_keys 'var a = 0'
  30. expect(page).to have_css('.content-editor-code-block.code.highlight.dark')
  31. end
  32. end
  33. describe 'code block bubble menu' do
  34. it 'shows a code block bubble menu for a code block' do
  35. find(content_editor_testid).send_keys [:enter, :enter]
  36. find(content_editor_testid).send_keys '```js ' # trigger input rule
  37. find(content_editor_testid).send_keys 'var a = 0'
  38. find(content_editor_testid).send_keys [:shift, :left]
  39. expect(page).not_to have_css('[data-testid="formatting-bubble-menu"]')
  40. expect(page).to have_css('[data-testid="code-block-bubble-menu"]')
  41. end
  42. it 'sets code block type to "javascript" for `js`' do
  43. find(content_editor_testid).send_keys [:enter, :enter]
  44. find(content_editor_testid).send_keys '```js '
  45. find(content_editor_testid).send_keys 'var a = 0'
  46. expect(find('[data-testid="code-block-bubble-menu"]')).to have_text('Javascript')
  47. end
  48. it 'sets code block type to "Custom (nomnoml)" for `nomnoml`' do
  49. find(content_editor_testid).send_keys [:enter, :enter]
  50. find(content_editor_testid).send_keys '```nomnoml '
  51. find(content_editor_testid).send_keys 'test'
  52. expect(find('[data-testid="code-block-bubble-menu"]')).to have_text('Custom (nomnoml)')
  53. end
  54. end
  55. describe 'mermaid diagram' do
  56. before do
  57. find(content_editor_testid).send_keys [:enter, :enter]
  58. find(content_editor_testid).send_keys '```mermaid '
  59. find(content_editor_testid).send_keys ['graph TD;', :enter, ' JohnDoe12 --> HelloWorld34']
  60. end
  61. it 'renders and updates the diagram correctly in a sandboxed iframe' do
  62. iframe = find(content_editor_testid).find('iframe')
  63. expect(iframe['src']).to include('/-/sandbox/mermaid')
  64. within_frame(iframe) do
  65. expect(find('svg').text).to include('JohnDoe12')
  66. expect(find('svg').text).to include('HelloWorld34')
  67. end
  68. expect(iframe['height'].to_i).to be > 100
  69. find(content_editor_testid).send_keys [:enter, ' JaneDoe34 --> HelloWorld56']
  70. within_frame(iframe) do
  71. page.has_content?('JaneDoe34')
  72. expect(find('svg').text).to include('JaneDoe34')
  73. expect(find('svg').text).to include('HelloWorld56')
  74. end
  75. end
  76. it 'toggles the diagram when preview button is clicked' do
  77. find('[data-testid="preview-diagram"]').click
  78. expect(find(content_editor_testid)).not_to have_selector('iframe')
  79. find('[data-testid="preview-diagram"]').click
  80. iframe = find(content_editor_testid).find('iframe')
  81. within_frame(iframe) do
  82. expect(find('svg').text).to include('JohnDoe12')
  83. expect(find('svg').text).to include('HelloWorld34')
  84. end
  85. end
  86. end
  87. end