diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 20:02:30 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 20:02:30 +0000 |
commit | 41fe97390ceddf945f3d967b8fdb3de4c66b7dea (patch) | |
tree | 9c8d89a8624828992f06d892cd2f43818ff5dcc8 /spec/lib/banzai | |
parent | 0804d2dc31052fb45a1efecedc8e06ce9bc32862 (diff) | |
download | gitlab-ce-41fe97390ceddf945f3d967b8fdb3de4c66b7dea.tar.gz |
Add latest changes from gitlab-org/gitlab@14-9-stable-eev14.9.0-rc42
Diffstat (limited to 'spec/lib/banzai')
8 files changed, 142 insertions, 15 deletions
diff --git a/spec/lib/banzai/filter/front_matter_filter_spec.rb b/spec/lib/banzai/filter/front_matter_filter_spec.rb index 1562c388296..f3543ab9582 100644 --- a/spec/lib/banzai/filter/front_matter_filter_spec.rb +++ b/spec/lib/banzai/filter/front_matter_filter_spec.rb @@ -105,6 +105,56 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do end end + context 'source position mapping' do + it 'keeps spaces before and after' do + content = <<~MD + + + --- + + foo: :foo_symbol + + --- + + + # Header + MD + + output = filter(content) + + expect(output).to eq <<~MD + + + ```yaml:frontmatter + + foo: :foo_symbol + + ``` + + + # Header + MD + end + + it 'keeps an empty line in place of the encoding' do + content = <<~MD + # encoding: UTF-8 + --- + foo: :foo_symbol + --- + MD + + output = filter(content) + + expect(output).to eq <<~MD + + ```yaml:frontmatter + foo: :foo_symbol + ``` + MD + end + end + context 'on content without front matter' do it 'returns the content unmodified' do content = <<~MD @@ -119,7 +169,7 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do context 'on front matter without content' do it 'converts YAML front matter to a fenced code block' do - content = <<~MD + content = <<~MD.rstrip --- foo: :foo_symbol bar: :bar_symbol @@ -134,7 +184,6 @@ RSpec.describe Banzai::Filter::FrontMatterFilter do foo: :foo_symbol bar: :bar_symbol ``` - MD end end diff --git a/spec/lib/banzai/filter/image_link_filter_spec.rb b/spec/lib/banzai/filter/image_link_filter_spec.rb index 5c04f6b2b3e..238c3cdb9c1 100644 --- a/spec/lib/banzai/filter/image_link_filter_spec.rb +++ b/spec/lib/banzai/filter/image_link_filter_spec.rb @@ -5,34 +5,82 @@ require 'spec_helper' RSpec.describe Banzai::Filter::ImageLinkFilter do include FilterSpecHelper - def image(path) - %(<img src="#{path}" />) + let(:path) { '/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg' } + let(:context) { {} } + + def image(path, alt: nil, data_src: nil) + alt_tag = alt ? %Q{alt="#{alt}"} : "" + data_src_tag = data_src ? %Q{data-src="#{data_src}"} : "" + + %(<img src="#{path}" #{alt_tag} #{data_src_tag} />) end it 'wraps the image with a link to the image src' do - doc = filter(image('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')) + doc = filter(image(path), context) + expect(doc.at_css('img')['src']).to eq doc.at_css('a')['href'] end it 'does not wrap a duplicate link' do - doc = filter(%Q(<a href="/whatever">#{image('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')}</a>)) + doc = filter(%Q(<a href="/whatever">#{image(path)}</a>), context) + expect(doc.to_html).to match %r{^<a href="/whatever"><img[^>]*></a>$} end it 'works with external images' do - doc = filter(image('https://i.imgur.com/DfssX9C.jpg')) + doc = filter(image('https://i.imgur.com/DfssX9C.jpg'), context) + expect(doc.at_css('img')['src']).to eq doc.at_css('a')['href'] end it 'works with inline images' do - doc = filter(%Q(<p>test #{image('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')} inline</p>)) + doc = filter(%Q(<p>test #{image(path)} inline</p>), context) + expect(doc.to_html).to match %r{^<p>test <a[^>]*><img[^>]*></a> inline</p>$} end it 'keep the data-canonical-src' do - doc = filter(%q(<img src="http://assets.example.com/6cd/4d7" data-canonical-src="http://example.com/test.png" />)) + doc = filter(%q(<img src="http://assets.example.com/6cd/4d7" data-canonical-src="http://example.com/test.png" />), context) expect(doc.at_css('img')['src']).to eq doc.at_css('a')['href'] expect(doc.at_css('img')['data-canonical-src']).to eq doc.at_css('a')['data-canonical-src'] end + + it 'adds no-attachment icon class to the link' do + doc = filter(image(path), context) + + expect(doc.at_css('a')['class']).to match(%r{no-attachment-icon}) + end + + context 'when :link_replaces_image is true' do + let(:context) { { link_replaces_image: true } } + + it 'replaces the image with link to image src', :aggregate_failures do + doc = filter(image(path), context) + + expect(doc.to_html).to match(%r{^<a[^>]*>#{path}</a>$}) + expect(doc.at_css('a')['href']).to eq(path) + end + + it 'uses image alt as a link text', :aggregate_failures do + doc = filter(image(path, alt: 'My image'), context) + + expect(doc.to_html).to match(%r{^<a[^>]*>My image</a>$}) + expect(doc.at_css('a')['href']).to eq(path) + end + + it 'uses image data-src as a link text', :aggregate_failures do + data_src = '/uploads/data-src.png' + doc = filter(image(path, data_src: data_src), context) + + expect(doc.to_html).to match(%r{^<a[^>]*>#{data_src}</a>$}) + expect(doc.at_css('a')['href']).to eq(data_src) + end + + it 'adds attachment icon class to the link' do + doc = filter(image(path), context) + + expect(doc.at_css('a')['class']).to match(%r{with-attachment-icon}) + end + end end diff --git a/spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb b/spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb index 0840ccf19e4..ef23725c790 100644 --- a/spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb +++ b/spec/lib/banzai/filter/issuable_reference_expansion_filter_spec.rb @@ -33,7 +33,7 @@ RSpec.describe Banzai::Filter::IssuableReferenceExpansionFilter do end it 'ignores non-issuable links' do - link = create_link('text', project: project, reference_type: 'issue') + link = create_link('text', project: project.id, reference_type: 'issue') doc = filter(link, context) expect(doc.css('a').last.text).to eq('text') diff --git a/spec/lib/banzai/filter/reference_redactor_filter_spec.rb b/spec/lib/banzai/filter/reference_redactor_filter_spec.rb index d0336e9e059..a2f34d42814 100644 --- a/spec/lib/banzai/filter/reference_redactor_filter_spec.rb +++ b/spec/lib/banzai/filter/reference_redactor_filter_spec.rb @@ -3,7 +3,6 @@ require 'spec_helper' RSpec.describe Banzai::Filter::ReferenceRedactorFilter do - include ActionView::Helpers::UrlHelper include FilterSpecHelper it 'ignores non-GFM links' do @@ -14,7 +13,7 @@ RSpec.describe Banzai::Filter::ReferenceRedactorFilter do end def reference_link(data) - link_to('text', '', class: 'gfm', data: data) + ActionController::Base.helpers.link_to('text', '', class: 'gfm', data: data) end it 'skips when the skip_redaction flag is set' do diff --git a/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb b/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb index d7bcebbbe34..2e811d35662 100644 --- a/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/external_issue_reference_filter_spec.rb @@ -256,4 +256,23 @@ RSpec.describe Banzai::Filter::References::ExternalIssueReferenceFilter do it_behaves_like "external issue tracker" end end + + context 'checking N+1' do + let_it_be(:integration) { create(:redmine_integration, project: project) } + let_it_be(:issue1) { ExternalIssue.new("#123", project) } + let_it_be(:issue2) { ExternalIssue.new("YT-123", project) } + + before do + project.update!(issues_enabled: false) + end + + it 'does not have N+1 per multiple references per project', :use_sql_query_cache do + single_reference = "External Issue #{issue1.to_reference}" + multiple_references = "External Issues #{issue1.to_reference} and #{issue2.to_reference}" + + control_count = ActiveRecord::QueryRecorder.new { reference_filter(single_reference).to_html }.count + + expect { reference_filter(multiple_references).to_html }.not_to exceed_query_limit(control_count) + end + end end diff --git a/spec/lib/banzai/filter/references/label_reference_filter_spec.rb b/spec/lib/banzai/filter/references/label_reference_filter_spec.rb index b18d68c8dd4..c342a831d62 100644 --- a/spec/lib/banzai/filter/references/label_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/label_reference_filter_spec.rb @@ -277,7 +277,7 @@ RSpec.describe Banzai::Filter::References::LabelReferenceFilter do end context 'References with html entities' do - let!(:label) { create(:label, name: '<html>', project: project) } + let!(:label) { create(:label, title: '<html>', project: project) } it 'links to a valid reference' do doc = reference_filter('See ~"<html>"') diff --git a/spec/lib/banzai/filter/task_list_filter_spec.rb b/spec/lib/banzai/filter/task_list_filter_spec.rb new file mode 100644 index 00000000000..c89acd1a643 --- /dev/null +++ b/spec/lib/banzai/filter/task_list_filter_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Banzai::Filter::TaskListFilter do + include FilterSpecHelper + + it 'adds `<task-button></task-button>` to every list item' do + doc = filter("<ul data-sourcepos=\"1:1-2:20\">\n<li data-sourcepos=\"1:1-1:20\">[ ] testing item 1</li>\n<li data-sourcepos=\"2:1-2:20\">[x] testing item 2</li>\n</ul>") + + expect(doc.xpath('.//li//task-button').count).to eq(2) + end +end diff --git a/spec/lib/banzai/reference_redactor_spec.rb b/spec/lib/banzai/reference_redactor_spec.rb index 78cceedd0e5..45e14032a98 100644 --- a/spec/lib/banzai/reference_redactor_spec.rb +++ b/spec/lib/banzai/reference_redactor_spec.rb @@ -106,13 +106,12 @@ RSpec.describe Banzai::ReferenceRedactor do end context 'when the user cannot read cross project' do - include ActionView::Helpers::UrlHelper let(:project) { create(:project) } let(:other_project) { create(:project, :public) } def create_link(issuable) type = issuable.class.name.underscore.downcase - link_to(issuable.to_reference, '', + ActionController::Base.helpers.link_to(issuable.to_reference, '', class: 'gfm has-tooltip', title: issuable.title, data: { |