diff options
Diffstat (limited to 'spec/presenters/snippet_blob_presenter_spec.rb')
-rw-r--r-- | spec/presenters/snippet_blob_presenter_spec.rb | 122 |
1 files changed, 69 insertions, 53 deletions
diff --git a/spec/presenters/snippet_blob_presenter_spec.rb b/spec/presenters/snippet_blob_presenter_spec.rb index 915f43fe572..83fe37effc0 100644 --- a/spec/presenters/snippet_blob_presenter_spec.rb +++ b/spec/presenters/snippet_blob_presenter_spec.rb @@ -3,70 +3,75 @@ require 'spec_helper' RSpec.describe SnippetBlobPresenter do + let_it_be(:snippet) { create(:personal_snippet, :repository) } + + let(:branch) { snippet.default_branch } + let(:blob) { snippet.blobs.first } + describe '#rich_data' do + let(:data_endpoint_url) { "/-/snippets/#{snippet.id}/raw/#{branch}/#{file}" } + before do allow_next_instance_of(described_class) do |instance| allow(instance).to receive(:current_user).and_return(nil) end + + blob.name = File.basename(file) + blob.path = file end - subject { described_class.new(snippet.blob).rich_data } + subject { described_class.new(blob).rich_data } context 'with PersonalSnippet' do - let(:snippet) { create(:personal_snippet, :repository) } - context 'when blob is binary' do - it 'returns the HTML associated with the binary' do - allow(snippet).to receive(:blob).and_return(snippet.repository.blob_at('master', 'files/images/logo-black.png')) + let(:file) { 'files/images/logo-black.png' } + let(:blob) { blob_at(file) } + it 'returns the HTML associated with the binary' do expect(subject).to include('file-content image_file') end end context 'with markdown format' do - let(:snippet) { create(:personal_snippet, file_name: 'test.md', content: '*foo*') } + let(:file) { 'README.md' } + let(:blob) { blob_at(file) } it 'returns rich markdown content' do - expected = <<~HTML - <div class="file-content md"> - <p data-sourcepos="1:1-1:5" dir="auto"><em>foo</em></p> - </div> - HTML - - expect(subject).to eq(expected) + expect(subject).to include('file-content md') end end context 'with notebook format' do - let(:snippet) { create(:personal_snippet, file_name: 'test.ipynb') } + let(:file) { 'test.ipynb' } it 'returns rich notebook content' do - expect(subject.strip).to eq %Q(<div class="file-content" data-endpoint="/-/snippets/#{snippet.id}/raw" id="js-notebook-viewer"></div>) + expect(subject.strip).to eq %Q(<div class="file-content" data-endpoint="#{data_endpoint_url}" id="js-notebook-viewer"></div>) end end context 'with openapi format' do - let(:snippet) { create(:personal_snippet, file_name: 'openapi.yml') } + let(:file) { 'openapi.yml' } it 'returns rich openapi content' do - expect(subject).to eq %Q(<div class="file-content" data-endpoint="/-/snippets/#{snippet.id}/raw" id="js-openapi-viewer"></div>\n) + expect(subject).to eq %Q(<div class="file-content" data-endpoint="#{data_endpoint_url}" id="js-openapi-viewer"></div>\n) end end context 'with svg format' do - let(:snippet) { create(:personal_snippet, file_name: 'test.svg') } + let(:file) { 'files/images/wm.svg' } + let(:blob) { blob_at(file) } it 'returns rich svg content' do result = Nokogiri::HTML::DocumentFragment.parse(subject) image_tag = result.search('img').first - expect(image_tag.attr('src')).to include("data:#{snippet.blob.mime_type};base64") - expect(image_tag.attr('alt')).to eq('test.svg') + expect(image_tag.attr('src')).to include("data:#{blob.mime_type};base64") + expect(image_tag.attr('alt')).to eq(File.basename(file)) end end context 'with other format' do - let(:snippet) { create(:personal_snippet, file_name: 'test') } + let(:file) { 'test' } it 'does not return no rich content' do expect(subject).to be_nil @@ -76,36 +81,41 @@ RSpec.describe SnippetBlobPresenter do end describe '#plain_data' do - let(:snippet) { build(:personal_snippet) } + let(:blob) { blob_at(file) } - subject { described_class.new(snippet.blob).plain_data } + subject { described_class.new(blob).plain_data } - it 'returns nil when the snippet blob is binary' do - allow(snippet.blob).to receive(:binary?).and_return(true) + context 'when blob is binary' do + let(:file) { 'files/images/logo-black.png' } - expect(subject).to be_nil + it 'returns nil' do + expect(subject).to be_nil + end end - it 'returns plain content when snippet file is markup' do - snippet.file_name = 'test.md' - snippet.content = '*foo*' + context 'when blob is markup' do + let(:file) { 'README.md' } - expect(subject).to eq '<span id="LC1" class="line" lang="markdown"><span class="ge">*foo*</span></span>' + it 'returns plain content' do + expect(subject).to include('<span id="LC1" class="line" lang="markdown">') + end end - it 'returns highlighted syntax content' do - snippet.file_name = 'test.rb' - snippet.content = 'class Foo;end' + context 'when blob has syntax' do + let(:file) { 'files/ruby/regex.rb' } - expect(subject) - .to eq '<span id="LC1" class="line" lang="ruby"><span class="k">class</span> <span class="nc">Foo</span><span class="p">;</span><span class="k">end</span></span>' + it 'returns highlighted syntax content' do + expect(subject) + .to include '<span id="LC1" class="line" lang="ruby"><span class="k">module</span> <span class="nn">Gitlab</span>' + end end - it 'returns plain text highlighted content' do - snippet.file_name = 'test' - snippet.content = 'foo' + context 'when blob has plain data' do + let(:file) { 'LICENSE' } - expect(subject).to eq '<span id="LC1" class="line" lang="plaintext">foo</span>' + it 'returns plain text highlighted content' do + expect(subject).to include('<span id="LC1" class="line" lang="plaintext">The MIT License (MIT)</span>') + end end end @@ -115,40 +125,42 @@ RSpec.describe SnippetBlobPresenter do let_it_be(:personal_snippet) { create(:personal_snippet, :repository, author: user) } let_it_be(:project_snippet) { create(:project_snippet, :repository, project: project, author: user) } + let(:blob) { snippet.blobs.first } + before do project.add_developer(user) end describe '#raw_path' do - subject { described_class.new(snippet.blobs.first, current_user: user).raw_path } + subject { described_class.new(blob, current_user: user).raw_path } it_behaves_like 'snippet blob raw path' - context 'with snippet_multiple_files feature disabled' do - before do - stub_feature_flags(snippet_multiple_files: false) - end + context 'with a snippet without a repository' do + let(:personal_snippet) { build(:personal_snippet, author: user, id: 1) } + let(:project_snippet) { build(:project_snippet, project: project, author: user, id: 1) } + let(:blob) { snippet.blob } context 'with ProjectSnippet' do let(:snippet) { project_snippet } - it 'returns the raw path' do - expect(subject).to eq "/#{snippet.project.full_path}/-/snippets/#{snippet.id}/raw" + it 'returns the raw project snippet path' do + expect(subject).to eq("/#{project_snippet.project.full_path}/-/snippets/#{project_snippet.id}/raw") end end context 'with PersonalSnippet' do let(:snippet) { personal_snippet } - it 'returns the raw path' do - expect(subject).to eq "/-/snippets/#{snippet.id}/raw" + it 'returns the raw personal snippet path' do + expect(subject).to eq("/-/snippets/#{personal_snippet.id}/raw") end end end end describe '#raw_url' do - subject { described_class.new(snippet.blobs.first, current_user: user).raw_url } + subject { described_class.new(blob, current_user: user).raw_url } before do stub_default_url_options(host: 'test.host') @@ -156,10 +168,10 @@ RSpec.describe SnippetBlobPresenter do it_behaves_like 'snippet blob raw url' - context 'with snippet_multiple_files feature disabled' do - before do - stub_feature_flags(snippet_multiple_files: false) - end + context 'with a snippet without a repository' do + let(:personal_snippet) { build(:personal_snippet, author: user, id: 1) } + let(:project_snippet) { build(:project_snippet, project: project, author: user, id: 1) } + let(:blob) { snippet.blob } context 'with ProjectSnippet' do let(:snippet) { project_snippet } @@ -179,4 +191,8 @@ RSpec.describe SnippetBlobPresenter do end end end + + def blob_at(path) + snippet.repository.blob_at(branch, path) + end end |