diff options
Diffstat (limited to 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb')
-rw-r--r-- | spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb | 156 |
1 files changed, 66 insertions, 90 deletions
diff --git a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb index c8cd9d4fcac..80392fe264f 100644 --- a/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb +++ b/spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb @@ -5,117 +5,93 @@ require 'spec_helper' RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do using RSpec::Parameterized::TableSyntax - shared_examples_for 'renders correct markdown' do - describe 'CommonMark tests', :aggregate_failures do - it 'converts all reference punctuation to literals' do - reference_chars = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS - markdown = reference_chars.split('').map {|char| char.prepend("\\") }.join - punctuation = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.split('') - punctuation = punctuation.delete_if {|char| char == '&' } - punctuation << '&' - - result = described_class.call(markdown, project: project) - output = result[:output].to_html - - punctuation.each { |char| expect(output).to include("<span>#{char}</span>") } - expect(result[:escaped_literals]).to be_truthy - end + describe 'backslash escapes', :aggregate_failures do + let_it_be(:project) { create(:project, :public) } + let_it_be(:issue) { create(:issue, project: project) } - it 'ensure we handle all the GitLab reference characters', :eager_load do - reference_chars = ObjectSpace.each_object(Class).map do |klass| - next unless klass.included_modules.include?(Referable) - next unless klass.respond_to?(:reference_prefix) - next unless klass.reference_prefix.length == 1 + it 'converts all reference punctuation to literals' do + reference_chars = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS + markdown = reference_chars.split('').map {|char| char.prepend("\\") }.join + punctuation = Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.split('') + punctuation = punctuation.delete_if {|char| char == '&' } + punctuation << '&' - klass.reference_prefix - end.compact + result = described_class.call(markdown, project: project) + output = result[:output].to_html - reference_chars.all? do |char| - Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.include?(char) - end - end + punctuation.each { |char| expect(output).to include("<span>#{char}</span>") } + expect(result[:escaped_literals]).to be_truthy + end - it 'does not convert non-reference punctuation to spans' do - markdown = %q(\"\'\*\+\,\-\.\/\:\;\<\=\>\?\[\]\_\`\{\|\}) + %q[\(\)\\\\] + it 'ensure we handle all the GitLab reference characters', :eager_load do + reference_chars = ObjectSpace.each_object(Class).map do |klass| + next unless klass.included_modules.include?(Referable) + next unless klass.respond_to?(:reference_prefix) + next unless klass.reference_prefix.length == 1 - result = described_class.call(markdown, project: project) - output = result[:output].to_html + klass.reference_prefix + end.compact - expect(output).not_to include('<span>') - expect(result[:escaped_literals]).to be_falsey + reference_chars.all? do |char| + Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.include?(char) end + end - it 'does not convert other characters to literals' do - markdown = %q(\→\A\a\ \3\φ\«) - expected = '\→\A\a\ \3\φ\«' - - result = correct_html_included(markdown, expected) - expect(result[:escaped_literals]).to be_falsey - end + it 'does not convert non-reference punctuation to spans' do + markdown = %q(\"\'\*\+\,\-\.\/\:\;\<\=\>\?\[\]\_\`\{\|\}) + %q[\(\)\\\\] - describe 'backslash escapes do not work in code blocks, code spans, autolinks, or raw HTML' do - where(:markdown, :expected) do - %q(`` \@\! ``) | %q(<code>\@\!</code>) - %q( \@\!) | %Q(<code>\\@\\!\n</code>) - %Q(~~~\n\\@\\!\n~~~) | %Q(<code>\\@\\!\n</code>) - %q(<http://example.com?find=\@>) | %q(<a href="http://example.com?find=%5C@">http://example.com?find=\@</a>) - %q[<a href="/bar\@)">] | %q[<a href="/bar%5C@)">] - end - - with_them do - it { correct_html_included(markdown, expected) } - end - end + result = described_class.call(markdown, project: project) + output = result[:output].to_html - describe 'work in all other contexts, including URLs and link titles, link references, and info strings in fenced code blocks' do - let(:markdown) { %Q(``` foo\\@bar\nfoo\n```) } - - it 'renders correct html' do - if Feature.enabled?(:use_cmark_renderer, default_enabled: :yaml) - correct_html_included(markdown, %Q(<pre data-sourcepos="1:1-3:3" lang="foo@bar"><code>foo\n</code></pre>)) - else - correct_html_included(markdown, %Q(<code lang="foo@bar">foo\n</code>)) - end - end - - where(:markdown, :expected) do - %q![foo](/bar\@ "\@title")! | %q(<a href="/bar@" title="@title">foo</a>) - %Q![foo]\n\n[foo]: /bar\\@ "\\@title"! | %q(<a href="/bar@" title="@title">foo</a>) - end - - with_them do - it { correct_html_included(markdown, expected) } - end - end + expect(output).not_to include('<span>') + expect(result[:escaped_literals]).to be_falsey end - end - - describe 'backslash escapes' do - let_it_be(:project) { create(:project, :public) } - let_it_be(:issue) { create(:issue, project: project) } - - def correct_html_included(markdown, expected) - result = described_class.call(markdown, {}) - expect(result[:output].to_html).to include(expected) + it 'does not convert other characters to literals' do + markdown = %q(\→\A\a\ \3\φ\«) + expected = '\→\A\a\ \3\φ\«' - result + result = correct_html_included(markdown, expected) + expect(result[:escaped_literals]).to be_falsey end - context 'using ruby-based HTML renderer' do - before do - stub_feature_flags(use_cmark_renderer: false) + describe 'backslash escapes do not work in code blocks, code spans, autolinks, or raw HTML' do + where(:markdown, :expected) do + %q(`` \@\! ``) | %q(<code>\@\!</code>) + %q( \@\!) | %Q(<code>\\@\\!\n</code>) + %Q(~~~\n\\@\\!\n~~~) | %Q(<code>\\@\\!\n</code>) + %q(<http://example.com?find=\@>) | %q(<a href="http://example.com?find=%5C@">http://example.com?find=\@</a>) + %q[<a href="/bar\@)">] | %q[<a href="/bar%5C@)">] end - it_behaves_like 'renders correct markdown' + with_them do + it { correct_html_included(markdown, expected) } + end end - context 'using c-based HTML renderer' do - before do - stub_feature_flags(use_cmark_renderer: true) + describe 'work in all other contexts, including URLs and link titles, link references, and info strings in fenced code blocks' do + let(:markdown) { %Q(``` foo\\@bar\nfoo\n```) } + + it 'renders correct html' do + correct_html_included(markdown, %Q(<pre data-sourcepos="1:1-3:3" lang="foo@bar"><code>foo\n</code></pre>)) + end + + where(:markdown, :expected) do + %q![foo](/bar\@ "\@title")! | %q(<a href="/bar@" title="@title">foo</a>) + %Q![foo]\n\n[foo]: /bar\\@ "\\@title"! | %q(<a href="/bar@" title="@title">foo</a>) end - it_behaves_like 'renders correct markdown' + with_them do + it { correct_html_included(markdown, expected) } + end end end + + def correct_html_included(markdown, expected) + result = described_class.call(markdown, {}) + + expect(result[:output].to_html).to include(expected) + + result + end end |