diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-14 21:07:45 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-14 21:07:45 +0000 |
commit | 0b12a5312c9701fbfed25fbb334d47900ced736b (patch) | |
tree | a29a27e297134f573fd8e5c298d241f3156c207a /spec/lib/banzai/filter | |
parent | 92f95ccac81911d1fcc32e999a7f1ce04624a56c (diff) | |
download | gitlab-ce-0b12a5312c9701fbfed25fbb334d47900ced736b.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/lib/banzai/filter')
-rw-r--r-- | spec/lib/banzai/filter/repository_link_filter_spec.rb (renamed from spec/lib/banzai/filter/relative_link_filter_spec.rb) | 174 | ||||
-rw-r--r-- | spec/lib/banzai/filter/upload_link_filter_spec.rb | 221 |
2 files changed, 222 insertions, 173 deletions
diff --git a/spec/lib/banzai/filter/relative_link_filter_spec.rb b/spec/lib/banzai/filter/repository_link_filter_spec.rb index 9f467d7a6fd..c87f452a3df 100644 --- a/spec/lib/banzai/filter/relative_link_filter_spec.rb +++ b/spec/lib/banzai/filter/repository_link_filter_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe Banzai::Filter::RelativeLinkFilter do +describe Banzai::Filter::RepositoryLinkFilter do include GitHelpers include RepoHelpers @@ -128,11 +128,6 @@ describe Banzai::Filter::RelativeLinkFilter do expect { filter(act) }.not_to raise_error end - it 'does not raise an exception on URIs containing invalid utf-8 byte sequences in uploads' do - act = link("/uploads/%FF") - expect { filter(act) }.not_to raise_error - end - it 'does not raise an exception on URIs containing invalid utf-8 byte sequences in context requested path' do expect { filter(link("files/test.md"), requested_path: '%FF') }.not_to raise_error end @@ -147,11 +142,6 @@ describe Banzai::Filter::RelativeLinkFilter do expect { filter(act) }.not_to raise_error end - it 'does not raise an exception with a space in the path' do - act = link("/uploads/d18213acd3732630991986120e167e3d/Landscape_8.jpg \nBut here's some more unexpected text :smile:)") - expect { filter(act) }.not_to raise_error - end - it 'ignores ref if commit is passed' do doc = filter(link('non/existent.file'), commit: project.commit('empty-branch') ) expect(doc.at_css('a')['href']) @@ -350,166 +340,4 @@ describe Banzai::Filter::RelativeLinkFilter do include_examples :valid_repository end - - context 'with a /upload/ URL' do - # not needed - let(:commit) { nil } - let(:ref) { nil } - let(:requested_path) { nil } - let(:upload_path) { '/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg' } - let(:relative_path) { "/#{project.full_path}#{upload_path}" } - - context 'to a project upload' do - shared_examples 'rewrite project uploads' do - context 'with an absolute URL' do - let(:absolute_path) { Gitlab.config.gitlab.url + relative_path } - let(:only_path) { false } - - it 'rewrites the link correctly' do - doc = filter(link(upload_path)) - - expect(doc.at_css('a')['href']).to eq(absolute_path) - end - end - - it 'rebuilds relative URL for a link' do - doc = filter(link(upload_path)) - expect(doc.at_css('a')['href']).to eq(relative_path) - - doc = filter(nested(link(upload_path))) - expect(doc.at_css('a')['href']).to eq(relative_path) - end - - it 'rebuilds relative URL for an image' do - doc = filter(image(upload_path)) - expect(doc.at_css('img')['src']).to eq(relative_path) - - doc = filter(nested(image(upload_path))) - expect(doc.at_css('img')['src']).to eq(relative_path) - end - - it 'does not modify absolute URL' do - doc = filter(link('http://example.com')) - expect(doc.at_css('a')['href']).to eq 'http://example.com' - end - - it 'supports unescaped Unicode filenames' do - path = '/uploads/한글.png' - doc = filter(link(path)) - - expect(doc.at_css('a')['href']).to eq("/#{project.full_path}/uploads/%ED%95%9C%EA%B8%80.png") - end - - it 'supports escaped Unicode filenames' do - path = '/uploads/한글.png' - escaped = Addressable::URI.escape(path) - doc = filter(image(escaped)) - - expect(doc.at_css('img')['src']).to eq("/#{project.full_path}/uploads/%ED%95%9C%EA%B8%80.png") - end - end - - context 'without project repository access' do - let(:project) { create(:project, :repository, repository_access_level: ProjectFeature::PRIVATE) } - - it_behaves_like 'rewrite project uploads' - end - - context 'with project repository access' do - it_behaves_like 'rewrite project uploads' - end - end - - context 'to a group upload' do - let(:upload_link) { link('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg') } - let(:group) { create(:group) } - let(:project) { nil } - let(:relative_path) { "/groups/#{group.full_path}/-/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg" } - - context 'with an absolute URL' do - let(:absolute_path) { Gitlab.config.gitlab.url + relative_path } - let(:only_path) { false } - - it 'rewrites the link correctly' do - doc = filter(upload_link) - - expect(doc.at_css('a')['href']).to eq(absolute_path) - end - end - - it 'rewrites the link correctly' do - doc = filter(upload_link) - - expect(doc.at_css('a')['href']).to eq(relative_path) - end - - it 'rewrites the link correctly for subgroup' do - group.update!(parent: create(:group)) - - doc = filter(upload_link) - - expect(doc.at_css('a')['href']).to eq(relative_path) - end - - it 'does not modify absolute URL' do - doc = filter(link('http://example.com')) - - expect(doc.at_css('a')['href']).to eq 'http://example.com' - end - end - - context 'to a personal snippet' do - let(:group) { nil } - let(:project) { nil } - let(:relative_path) { '/uploads/-/system/personal_snippet/6/674e4f07fbf0a7736c3439212896e51a/example.tar.gz' } - - context 'with an absolute URL' do - let(:absolute_path) { Gitlab.config.gitlab.url + relative_path } - let(:only_path) { false } - - it 'rewrites the link correctly' do - doc = filter(link(relative_path)) - - expect(doc.at_css('a')['href']).to eq(absolute_path) - end - end - - context 'with a relative URL root' do - let(:gitlab_root) { '/gitlab' } - let(:absolute_path) { Gitlab.config.gitlab.url + gitlab_root + relative_path } - - before do - stub_config_setting(relative_url_root: gitlab_root) - end - - context 'with an absolute URL' do - let(:only_path) { false } - - it 'rewrites the link correctly' do - doc = filter(link(relative_path)) - - expect(doc.at_css('a')['href']).to eq(absolute_path) - end - end - - it 'rewrites the link correctly' do - doc = filter(link(relative_path)) - - expect(doc.at_css('a')['href']).to eq(gitlab_root + relative_path) - end - end - - it 'rewrites the link correctly' do - doc = filter(link(relative_path)) - - expect(doc.at_css('a')['href']).to eq(relative_path) - end - - it 'does not modify absolute URL' do - doc = filter(link('http://example.com')) - - expect(doc.at_css('a')['href']).to eq 'http://example.com' - end - end - end end diff --git a/spec/lib/banzai/filter/upload_link_filter_spec.rb b/spec/lib/banzai/filter/upload_link_filter_spec.rb new file mode 100644 index 00000000000..3f181dce7bc --- /dev/null +++ b/spec/lib/banzai/filter/upload_link_filter_spec.rb @@ -0,0 +1,221 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Banzai::Filter::UploadLinkFilter do + def filter(doc, contexts = {}) + contexts.reverse_merge!( + project: project, + group: group, + only_path: only_path + ) + + described_class.call(doc, contexts) + end + + def image(path) + %(<img src="#{path}" />) + end + + def video(path) + %(<video src="#{path}"></video>) + end + + def audio(path) + %(<audio src="#{path}"></audio>) + end + + def link(path) + %(<a href="#{path}">#{path}</a>) + end + + def nested(element) + %(<div>#{element}</div>) + end + + let_it_be(:project) { create(:project, :public) } + let_it_be(:user) { create(:user) } + let(:group) { nil } + let(:project_path) { project.full_path } + let(:only_path) { true } + let(:upload_path) { '/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg' } + let(:relative_path) { "/#{project.full_path}#{upload_path}" } + + context 'to a project upload' do + context 'with an absolute URL' do + let(:absolute_path) { Gitlab.config.gitlab.url + relative_path } + let(:only_path) { false } + + it 'rewrites the link correctly' do + doc = filter(link(upload_path)) + + expect(doc.at_css('a')['href']).to eq(absolute_path) + expect(doc.at_css('a').classes).to include('gfm') + end + end + + it 'rebuilds relative URL for a link' do + doc = filter(link(upload_path)) + + expect(doc.at_css('a')['href']).to eq(relative_path) + expect(doc.at_css('a').classes).to include('gfm') + + doc = filter(nested(link(upload_path))) + + expect(doc.at_css('a')['href']).to eq(relative_path) + expect(doc.at_css('a').classes).to include('gfm') + end + + it 'rebuilds relative URL for an image' do + doc = filter(image(upload_path)) + + expect(doc.at_css('img')['src']).to eq(relative_path) + expect(doc.at_css('img').classes).to include('gfm') + + doc = filter(nested(image(upload_path))) + + expect(doc.at_css('img')['src']).to eq(relative_path) + expect(doc.at_css('img').classes).to include('gfm') + end + + it 'does not modify absolute URL' do + doc = filter(link('http://example.com')) + + expect(doc.at_css('a')['href']).to eq 'http://example.com' + expect(doc.at_css('a').classes).not_to include('gfm') + end + + it 'supports unescaped Unicode filenames' do + path = '/uploads/한글.png' + doc = filter(link(path)) + + expect(doc.at_css('a')['href']).to eq("/#{project.full_path}/uploads/%ED%95%9C%EA%B8%80.png") + expect(doc.at_css('a').classes).to include('gfm') + end + + it 'supports escaped Unicode filenames' do + path = '/uploads/한글.png' + escaped = Addressable::URI.escape(path) + doc = filter(image(escaped)) + + expect(doc.at_css('img')['src']).to eq("/#{project.full_path}/uploads/%ED%95%9C%EA%B8%80.png") + expect(doc.at_css('img').classes).to include('gfm') + end + end + + context 'to a group upload' do + let(:upload_link) { link('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg') } + let_it_be(:group) { create(:group) } + let(:project) { nil } + let(:relative_path) { "/groups/#{group.full_path}/-/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg" } + + context 'with an absolute URL' do + let(:absolute_path) { Gitlab.config.gitlab.url + relative_path } + let(:only_path) { false } + + it 'rewrites the link correctly' do + doc = filter(upload_link) + + expect(doc.at_css('a')['href']).to eq(absolute_path) + expect(doc.at_css('a').classes).to include('gfm') + end + end + + it 'rewrites the link correctly' do + doc = filter(upload_link) + + expect(doc.at_css('a')['href']).to eq(relative_path) + expect(doc.at_css('a').classes).to include('gfm') + end + + it 'rewrites the link correctly for subgroup' do + group.update!(parent: create(:group)) + + doc = filter(upload_link) + + expect(doc.at_css('a')['href']).to eq(relative_path) + expect(doc.at_css('a').classes).to include('gfm') + end + + it 'does not modify absolute URL' do + doc = filter(link('http://example.com')) + + expect(doc.at_css('a')['href']).to eq 'http://example.com' + expect(doc.at_css('a').classes).not_to include('gfm') + end + end + + context 'to a personal snippet' do + let(:group) { nil } + let(:project) { nil } + let(:relative_path) { '/uploads/-/system/personal_snippet/6/674e4f07fbf0a7736c3439212896e51a/example.tar.gz' } + + context 'with an absolute URL' do + let(:absolute_path) { Gitlab.config.gitlab.url + relative_path } + let(:only_path) { false } + + it 'rewrites the link correctly' do + doc = filter(link(relative_path)) + + expect(doc.at_css('a')['href']).to eq(absolute_path) + expect(doc.at_css('a').classes).to include('gfm') + end + end + + context 'with a relative URL root' do + let(:gitlab_root) { '/gitlab' } + let(:absolute_path) { Gitlab.config.gitlab.url + gitlab_root + relative_path } + + before do + stub_config_setting(relative_url_root: gitlab_root) + end + + context 'with an absolute URL' do + let(:only_path) { false } + + it 'rewrites the link correctly' do + doc = filter(link(relative_path)) + + expect(doc.at_css('a')['href']).to eq(absolute_path) + expect(doc.at_css('a').classes).to include('gfm') + end + end + + it 'rewrites the link correctly' do + doc = filter(link(relative_path)) + + expect(doc.at_css('a')['href']).to eq(gitlab_root + relative_path) + expect(doc.at_css('a').classes).to include('gfm') + end + end + + it 'rewrites the link correctly' do + doc = filter(link(relative_path)) + + expect(doc.at_css('a')['href']).to eq(relative_path) + expect(doc.at_css('a').classes).to include('gfm') + end + + it 'does not modify absolute URL' do + doc = filter(link('http://example.com')) + + expect(doc.at_css('a')['href']).to eq 'http://example.com' + expect(doc.at_css('a').classes).not_to include('gfm') + end + end + + context 'invalid input' do + using RSpec::Parameterized::TableSyntax + + where(:name, :href) do + 'invalid URI' | '://foo' + 'invalid UTF-8 byte sequences' | '%FF' + 'garbled path' | 'open(/var/tmp/):%20/location%0Afrom:%20/test' + 'whitespace' | "d18213acd3732630991986120e167e3d/Landscape_8.jpg\nand more" + end + + with_them do + it { expect { filter(link("/uploads/#{href}")) }.not_to raise_error } + end + end +end |