diff options
Diffstat (limited to 'spec/features/markdown/math_spec.rb')
-rw-r--r-- | spec/features/markdown/math_spec.rb | 104 |
1 files changed, 75 insertions, 29 deletions
diff --git a/spec/features/markdown/math_spec.rb b/spec/features/markdown/math_spec.rb index 25459494a0c..0bc8f2146e9 100644 --- a/spec/features/markdown/math_spec.rb +++ b/spec/features/markdown/math_spec.rb @@ -24,9 +24,7 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do ``` MATH - issue = create(:issue, project: project, description: description) - - visit project_issue_path(project, issue) + create_and_visit_issue_with_description(description) expect(page).to have_selector('.katex .mord.mathnormal', text: 'b') expect(page).to have_selector('.katex-display .mord.mathnormal', text: 'b') @@ -40,9 +38,7 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do This link is valid $`\\href{https://gitlab.com}{Gitlab}`$. MATH - issue = create(:issue, project: project, description: description) - - visit project_issue_path(project, issue) + create_and_visit_issue_with_description(description) page.within '.description > .md' do # unfortunately there is no class selector for KaTeX's "unsupported command" @@ -59,9 +55,7 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do ``` MATH - issue = create(:issue, project: project, description: description) - - visit project_issue_path(project, issue) + create_and_visit_issue_with_description(description) page.within '.description > .md' do expect(page).to have_selector('.js-lazy-render-math-container', text: /math block exceeds 1000 characters/) @@ -75,11 +69,7 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do ``` MATH - issue = create(:issue, project: project, description: description) - - visit project_issue_path(project, issue) - - wait_for_requests + create_and_visit_issue_with_description(description) page.within '.description > .md' do expect(page).not_to have_selector('.katex-error') @@ -93,11 +83,7 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do ``` MATH - issue = create(:issue, project: project, description: description) - - visit project_issue_path(project, issue) - - wait_for_requests + create_and_visit_issue_with_description(description) page.within '.description > .md' do click_button 'Display anyway' @@ -113,11 +99,7 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do ``` MATH - issue = create(:issue, project: project, description: description) - - visit project_issue_path(project, issue) - - wait_for_requests + create_and_visit_issue_with_description(description) page.within '.description > .md' do expect(page).to have_selector('.katex-error', @@ -132,11 +114,7 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do ``` MATH - issue = create(:issue, project: project, description: description) - - visit project_issue_path(project, issue) - - wait_for_requests + create_and_visit_issue_with_description(description) page.within '.description > .md' do expect(page).to have_selector('.katex-error', text: /&lt;script&gt;/) @@ -162,4 +140,72 @@ RSpec.describe 'Math rendering', :js, feature_category: :team_planning do expect(page).not_to have_selector('.js-lazy-render-math') end end + + it 'uses math-content-display for display math', :js do + description = <<~MATH + ```math + 1 + 2 + ``` + MATH + + create_and_visit_issue_with_description(description) + + page.within '.description > .md' do + expect(page).to have_selector('.math-content-display') + end + end + + it 'uses math-content-inline for inline math', :js do + description = 'one $`1 + 2`$ two' + + create_and_visit_issue_with_description(description) + + page.within '.description > .md' do + expect(page).to have_selector('.math-content-inline') + end + end + + context 'when math tries to cover other elements on the page' do + it 'prevents hijacking for display math', :js do + description = <<~MATH + [test link](#) + + ```math + \\hskip{-200pt}\\href{https://example.com}{\\smash{\\raisebox{20em}{$\\smash{\\raisebox{20em}{$\\phantom{\\underset{\\underset{\\underset{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}}{\\underset{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}}}{\\underset{\\underset{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}}{}}}$}}$}}} + ``` + MATH + + issue = create_and_visit_issue_with_description(description) + + page.within '.description > .md' do + click_link 'test link' + + expect(page).to have_current_path(project_issue_path(project, issue)) + end + end + + it 'prevents hijacking for inline math', :js do + description = <<~MATH + [test link](#) $`\\hskip{-200pt}\\href{https://example.com}{\\smash{\\raisebox{20em}{$\\smash{\\raisebox{20em}{$\\phantom{\\underset{\\underset{\\underset{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}}{\\underset{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}}}{\\underset{\\underset{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}{\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}\\rule{20em}{20em}}}{}}}$}}$}}}`$ + MATH + + issue = create_and_visit_issue_with_description(description) + + page.within '.description > .md' do + click_link 'test link' + + expect(page).to have_current_path(project_issue_path(project, issue)) + end + end + end + + def create_and_visit_issue_with_description(description) + issue = create(:issue, project: project, description: description) + + visit project_issue_path(project, issue) + + wait_for_requests + + issue + end end |