diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /spec/features/markdown | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'spec/features/markdown')
-rw-r--r-- | spec/features/markdown/copy_as_gfm_spec.rb | 56 | ||||
-rw-r--r-- | spec/features/markdown/keyboard_shortcuts_spec.rb | 119 | ||||
-rw-r--r-- | spec/features/markdown/markdown_spec.rb | 1 | ||||
-rw-r--r-- | spec/features/markdown/mermaid_spec.rb | 2 |
4 files changed, 121 insertions, 57 deletions
diff --git a/spec/features/markdown/copy_as_gfm_spec.rb b/spec/features/markdown/copy_as_gfm_spec.rb index 57362ed2d54..fbf4e531db1 100644 --- a/spec/features/markdown/copy_as_gfm_spec.rb +++ b/spec/features/markdown/copy_as_gfm_spec.rb @@ -30,13 +30,11 @@ RSpec.describe 'Copy as GFM', :js do it 'works', :aggregate_failures do verify( 'nesting', - '> 1. [x] **[$`2 + 2`$ {-=-}{+=+} 2^2 ~~:thumbsup:~~](http://google.com)**' ) verify( 'a real world example from the gitlab-ce README', - <<~GFM # GitLab @@ -103,19 +101,16 @@ RSpec.describe 'Copy as GFM', :js do verify( 'InlineDiffFilter', - '{-Deleted text-}', '{+Added text+}' ) verify( 'TaskListFilter', - <<~GFM, * [ ] Unchecked task * [x] Checked task GFM - <<~GFM 1. [ ] Unchecked ordered task 1. [x] Checked ordered task @@ -124,7 +119,6 @@ RSpec.describe 'Copy as GFM', :js do verify( 'ReferenceFilter', - # issue reference @feat.issue.to_reference, # full issue reference @@ -141,13 +135,11 @@ RSpec.describe 'Copy as GFM', :js do verify( 'AutolinkFilter', - 'https://example.com' ) verify( 'TableOfContentsFilter', - <<~GFM, [[_TOC_]] @@ -155,64 +147,53 @@ RSpec.describe 'Copy as GFM', :js do ## Heading 2 GFM - pipeline: :wiki, wiki: @project.wiki ) verify( 'EmojiFilter', - ':thumbsup:' ) verify( 'ImageLinkFilter', - '![Image](https://example.com/image.png)' ) verify_media_with_partial_path( '[test.txt](/uploads/a123/image.txt)', - project_media_uri(@project, '/uploads/a123/image.txt') ) verify_media_with_partial_path( '![Image](/uploads/a123/image.png)', - project_media_uri(@project, '/uploads/a123/image.png') ) verify( 'VideoLinkFilter', - '![Video](https://example.com/video.mp4)' ) verify_media_with_partial_path( '![Video](/uploads/a123/video.mp4)', - project_media_uri(@project, '/uploads/a123/video.mp4') ) verify( 'AudioLinkFilter', - '![Audio](https://example.com/audio.wav)' ) verify_media_with_partial_path( '![Audio](/uploads/a123/audio.wav)', - project_media_uri(@project, '/uploads/a123/audio.wav') ) verify( 'MathFilter: math as converted from GFM to HTML', - '$`c = \pm\sqrt{a^2 + b^2}`$', - # math block <<~GFM ```math @@ -334,7 +315,6 @@ RSpec.describe 'Copy as GFM', :js do verify( 'MermaidFilter: mermaid as converted from GFM to HTML', - <<~GFM ```mermaid graph TD; @@ -429,7 +409,6 @@ RSpec.describe 'Copy as GFM', :js do verify( 'SuggestionFilter: suggestion as converted from GFM to HTML', - <<~GFM ```suggestion New @@ -491,7 +470,6 @@ RSpec.describe 'Copy as GFM', :js do verify( 'SanitizationFilter', - <<~GFM <sub>sub</sub> @@ -527,13 +505,11 @@ RSpec.describe 'Copy as GFM', :js do verify( 'SanitizationFilter', - <<~GFM, ``` Plain text ``` GFM - <<~GFM, ```ruby def foo @@ -541,7 +517,6 @@ RSpec.describe 'Copy as GFM', :js do end ``` GFM - <<~GFM Foo @@ -553,27 +528,19 @@ RSpec.describe 'Copy as GFM', :js do verify( 'MarkdownFilter', - "Line with two spaces at the end \nto insert a linebreak", - '`code`', '`` code with ` ticks ``', - '> Quote', - # multiline quote <<~GFM, > Multiline Quote > > With multiple paragraphs GFM - '![Image](https://example.com/image.png)', - '# Heading with no anchor link', - '[Link](https://example.com)', - <<~GFM, * List item * List item 2 @@ -598,7 +565,6 @@ RSpec.describe 'Copy as GFM', :js do > Blockquote GFM - <<~GFM, 1. Ordered list item 1. Ordered list item 2 @@ -623,22 +589,16 @@ RSpec.describe 'Copy as GFM', :js do --- GFM - '# Heading', '## Heading', '### Heading', '#### Heading', '##### Heading', '###### Heading', - '**Bold**', - '*Italics*', - '~~Strikethrough~~', - '---', - # table <<~GFM, | Centered | Right | Left | @@ -696,9 +656,7 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as inline code' do verify( '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"] .line .no', - '`RuntimeError`', - target: '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]' ) end @@ -708,9 +666,7 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as inline code' do verify( '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]', - '`raise RuntimeError, "System commands must be given as an array of strings"`', - target: '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]' ) end @@ -720,14 +676,12 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as a code block' do verify( '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"], [id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_10"]', - <<~GFM, ```ruby raise RuntimeError, "System commands must be given as an array of strings" end ``` GFM - target: '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"]' ) end @@ -755,7 +709,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as a code block' do verify( '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8"], [id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_9_9"], [id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"], [id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_10"]', - <<~GFM, ```ruby unless cmd.is_a?(Array) @@ -763,7 +716,6 @@ RSpec.describe 'Copy as GFM', :js do end ``` GFM - target: '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8"].left-side' ) end @@ -773,7 +725,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as a code block' do verify( '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8"], [id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_9_9"], [id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"], [id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_10"]', - <<~GFM, ```ruby unless cmd.is_a?(Array) @@ -781,7 +732,6 @@ RSpec.describe 'Copy as GFM', :js do end ``` GFM - target: '[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8"].right-side' ) end @@ -799,7 +749,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as inline code' do verify( '.line[id="LC9"] .no', - '`RuntimeError`' ) end @@ -809,7 +758,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as inline code' do verify( '.line[id="LC9"]', - '`raise RuntimeError, "System commands must be given as an array of strings"`' ) end @@ -819,7 +767,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as a code block' do verify( '.line[id="LC9"], .line[id="LC10"]', - <<~GFM ```ruby raise RuntimeError, "System commands must be given as an array of strings" @@ -841,7 +788,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as inline code' do verify( '.line[id="LC27"] .nl', - '`"bio"`' ) end @@ -851,7 +797,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as inline code' do verify( '.line[id="LC27"]', - '`"bio": null,`' ) end @@ -861,7 +806,6 @@ RSpec.describe 'Copy as GFM', :js do it 'copies as a code block with the correct language' do verify( '.line[id="LC27"], .line[id="LC28"]', - <<~GFM ```json "bio": null, diff --git a/spec/features/markdown/keyboard_shortcuts_spec.rb b/spec/features/markdown/keyboard_shortcuts_spec.rb new file mode 100644 index 00000000000..81b1928658c --- /dev/null +++ b/spec/features/markdown/keyboard_shortcuts_spec.rb @@ -0,0 +1,119 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Markdown keyboard shortcuts', :js do + let_it_be(:project) { create(:project, :repository) } + let_it_be(:user) { create(:user) } + + let(:is_mac) { page.evaluate_script('navigator.platform').include?('Mac') } + let(:modifier_key) { is_mac ? :command : :control } + let(:other_modifier_key) { is_mac ? :control : :command } + + before do + project.add_developer(user) + + gitlab_sign_in(user) + + visit path_to_visit + + wait_for_requests + end + + shared_examples 'keyboard shortcuts' do + it 'bolds text when <modifier>+B is pressed' do + type_and_select('bold') + + markdown_field.send_keys([modifier_key, 'b']) + + expect(markdown_field.value).to eq('**bold**') + end + + it 'italicizes text when <modifier>+I is pressed' do + type_and_select('italic') + + markdown_field.send_keys([modifier_key, 'i']) + + expect(markdown_field.value).to eq('_italic_') + end + + it 'links text when <modifier>+K is pressed' do + type_and_select('link') + + markdown_field.send_keys([modifier_key, 'k']) + + expect(markdown_field.value).to eq('[link](url)') + + # Type some more text to ensure the cursor + # and selection are set correctly + markdown_field.send_keys('https://example.com') + + expect(markdown_field.value).to eq('[link](https://example.com)') + end + + it 'does not affect non-markdown fields on the same page' do + non_markdown_field.send_keys('some text') + + non_markdown_field.send_keys([modifier_key, 'b']) + + expect(focused_element).to eq(non_markdown_field.native) + expect(markdown_field.value).to eq('') + end + end + + shared_examples 'no side effects' do + it 'does not bold text when <other modifier>+B is pressed' do + type_and_select('bold') + + markdown_field.send_keys([@other_modifier_key, 'b']) + + expect(markdown_field.value).not_to eq('**bold**') + end + + it 'does not italicize text when <other modifier>+I is pressed' do + type_and_select('italic') + + markdown_field.send_keys([@other_modifier_key, 'i']) + + expect(markdown_field.value).not_to eq('_italic_') + end + + it 'does not link text when <other modifier>+K is pressed' do + type_and_select('link') + + markdown_field.send_keys([@other_modifier_key, 'k']) + + expect(markdown_field.value).not_to eq('[link](url)') + end + end + + context 'Vue.js markdown editor' do + let(:path_to_visit) { new_project_release_path(project) } + let(:markdown_field) { find_field('Release notes') } + let(:non_markdown_field) { find_field('Release title') } + + it_behaves_like 'keyboard shortcuts' + it_behaves_like 'no side effects' + end + + context 'Haml markdown editor' do + let(:path_to_visit) { new_project_issue_path(project) } + let(:markdown_field) { find_field('Description') } + let(:non_markdown_field) { find_field('Title') } + + it_behaves_like 'keyboard shortcuts' + it_behaves_like 'no side effects' + end + + def type_and_select(text) + markdown_field.send_keys(text) + + text.length.times do + markdown_field.send_keys([:shift, :arrow_left]) + end + end + + def focused_element + page.driver.browser.switch_to.active_element + end +end diff --git a/spec/features/markdown/markdown_spec.rb b/spec/features/markdown/markdown_spec.rb index d9d3f566bce..151ef76e884 100644 --- a/spec/features/markdown/markdown_spec.rb +++ b/spec/features/markdown/markdown_spec.rb @@ -247,6 +247,7 @@ RSpec.describe 'GitLab Markdown', :aggregate_failures do expect(doc).to reference_commits expect(doc).to reference_labels expect(doc).to reference_milestones + expect(doc).to reference_alerts end aggregate_failures 'TaskListFilter' do diff --git a/spec/features/markdown/mermaid_spec.rb b/spec/features/markdown/mermaid_spec.rb index 256dfdc26e9..bdb549326fa 100644 --- a/spec/features/markdown/mermaid_spec.rb +++ b/spec/features/markdown/mermaid_spec.rb @@ -44,7 +44,7 @@ RSpec.describe 'Mermaid rendering', :js do expect(page.html.scan(expected).count).to be(4) end - it 'renders only 2 Mermaid blocks and ', :js do + it 'renders only 2 Mermaid blocks and ', :js, quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/234081' } do description = <<~MERMAID ```mermaid graph LR |