# frozen_string_literal: true require 'spec_helper' RSpec.describe Banzai::Pipeline::PlainMarkdownPipeline do using RSpec::Parameterized::TableSyntax 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) result end context 'when feature flag honor_escaped_markdown is disabled' do before do stub_feature_flags(honor_escaped_markdown: false) end it 'does not escape the markdown' do result = described_class.call(%q(\!), project: project) output = result[:output].to_html expect(output).to eq('
!
') expect(result[:escaped_literals]).to be_falsey end end 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("#{char}") } expect(result[:escaped_literals]).to be_truthy end it 'ensure we handle all the GitLab reference characters' 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 klass.reference_prefix end.compact reference_chars.all? do |char| Banzai::Filter::MarkdownPreEscapeFilter::REFERENCE_CHARACTERS.include?(char) end end it 'does not convert non-reference punctuation to spans' do markdown = %q(\"\'\*\+\,\-\.\/\:\;\<\=\>\?\[\]\_\`\{\|\}) + %q[\(\)\\\\] result = described_class.call(markdown, project: project) output = result[:output].to_html expect(output).not_to include('') expect(result[:escaped_literals]).to be_falsey 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 describe 'backslash escapes do not work in code blocks, code spans, autolinks, or raw HTML' do where(:markdown, :expected) do %q(`` \@\! ``) | %q(\@\!
)
%q( \@\!) | %Q(\\@\\!\n
)
%Q(~~~\n\\@\\!\n~~~) | %Q(\\@\\!\n
)
%q(foo\n
)
end
with_them do
it { correct_html_included(markdown, expected) }
end
end
end
end
end