gitlab-org--gitlab-foss/spec/lib/gitlab/diff/file_spec.rb

397 lines
12 KiB
Ruby
Raw Normal View History

require 'spec_helper'
2015-12-09 05:55:36 -05:00
describe Gitlab::Diff::File, lib: true do
include RepoHelpers
let(:project) { create(:project, :repository) }
2015-04-21 09:13:40 -04:00
let(:commit) { project.commit(sample_commit.id) }
let(:diff) { commit.raw_diffs.first }
let(:diff_file) { described_class.new(diff, diff_refs: commit.diff_refs, repository: project.repository) }
2016-07-11 18:12:31 -04:00
describe '#diff_lines' do
let(:diff_lines) { diff_file.diff_lines }
it { expect(diff_lines.size).to eq(30) }
it { expect(diff_lines.first).to be_kind_of(Gitlab::Diff::Line) }
end
2016-07-11 18:12:31 -04:00
describe '#mode_changed?' do
it { expect(diff_file.mode_changed?).to be_falsey }
end
describe '#too_large?' do
it 'returns true for a file that is too large' do
expect(diff).to receive(:too_large?).and_return(true)
expect(diff_file.too_large?).to eq(true)
end
it 'returns false for a file that is small enough' do
expect(diff).to receive(:too_large?).and_return(false)
expect(diff_file.too_large?).to eq(false)
end
end
describe '#collapsed?' do
it 'returns true for a file that is quite big' do
expect(diff).to receive(:collapsed?).and_return(true)
expect(diff_file.collapsed?).to eq(true)
end
it 'returns false for a file that is small enough' do
expect(diff).to receive(:collapsed?).and_return(false)
expect(diff_file.collapsed?).to eq(false)
end
end
describe '#old_content_commit' do
it 'returns base commit' do
old_content_commit = diff_file.old_content_commit
expect(old_content_commit.id).to eq('6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9')
end
end
describe '#old_blob' do
it 'returns blob of commit of base commit' do
old_data = diff_file.old_blob.data
expect(old_data).to include('raise "System commands must be given as an array of strings"')
end
end
describe '#new_blob' do
it 'returns blob of new commit' do
data = diff_file.new_blob.data
expect(data).to include('raise RuntimeError, "System commands must be given as an array of strings"')
end
end
describe '#diffable?' do
let(:commit) { project.commit('1a0b36b3cdad1d2ee32457c102a8c0b7056fa863') }
let(:diffs) { commit.diffs }
before do
info_dir_path = File.join(project.repository.path_to_repo, 'info')
FileUtils.mkdir(info_dir_path) unless File.exist?(info_dir_path)
File.write(File.join(info_dir_path, 'attributes'), "*.md -diff\n")
end
it "returns true for files that do not have attributes" do
diff_file = diffs.diff_file_with_new_path('LICENSE')
expect(diff_file.diffable?).to be_truthy
end
it "returns false for files that have been marked as not being diffable in attributes" do
diff_file = diffs.diff_file_with_new_path('README.md')
expect(diff_file.diffable?).to be_falsey
end
end
2017-06-06 17:28:06 -04:00
describe '#content_changed?' do
context 'when created' do
let(:commit) { project.commit('33f3729a45c02fc67d00adb1b8bca394b0e761d9') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/images/6049019_460s.jpg') }
it 'returns false' do
expect(diff_file.content_changed?).to be_falsey
end
end
context 'when deleted' do
let(:commit) { project.commit('d59c60028b053793cecfb4022de34602e1a9218e') }
let(:diff_file) { commit.diffs.diff_file_with_old_path('files/js/commit.js.coffee') }
it 'returns false' do
expect(diff_file.content_changed?).to be_falsey
end
end
context 'when renamed' do
let(:commit) { project.commit('6907208d755b60ebeacb2e9dfea74c92c3449a1f') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/js/commit.coffee') }
before do
allow(diff_file.new_blob).to receive(:id).and_return(diff_file.old_blob.id)
end
it 'returns false' do
expect(diff_file.content_changed?).to be_falsey
end
end
context 'when content changed' do
context 'when binary' do
let(:commit) { project.commit('2f63565e7aac07bcdadb654e253078b727143ec4') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/images/6049019_460s.jpg') }
it 'returns true' do
expect(diff_file.content_changed?).to be_truthy
end
end
context 'when not binary' do
let(:commit) { project.commit('570e7b2abdd848b95f2f578043fc23bd6f6fd24d') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/ruby/popen.rb') }
it 'returns true' do
expect(diff_file.content_changed?).to be_truthy
end
end
end
end
describe '#simple_viewer' do
context 'when the file is not diffable' do
before do
allow(diff_file).to receive(:diffable?).and_return(false)
end
it 'returns a Not Diffable viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::NotDiffable)
end
end
context 'when the content changed' do
context 'when the file represented by the diff file is binary' do
before do
allow(diff_file).to receive(:raw_binary?).and_return(true)
end
it 'returns a No Preview viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::NoPreview)
end
end
context 'when the diff file old and new blob types are different' do
before do
allow(diff_file).to receive(:different_type?).and_return(true)
end
it 'returns a No Preview viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::NoPreview)
end
end
context 'when the file represented by the diff file is text-based' do
it 'returns a text viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Text)
end
end
end
context 'when created' do
let(:commit) { project.commit('913c66a37b4a45b9769037c55c2d238bd0942d2e') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/ruby/popen.rb') }
before do
allow(diff_file).to receive(:content_changed?).and_return(nil)
end
context 'when the file represented by the diff file is binary' do
before do
allow(diff_file).to receive(:raw_binary?).and_return(true)
end
it 'returns an Added viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Added)
end
end
context 'when the diff file old and new blob types are different' do
before do
allow(diff_file).to receive(:different_type?).and_return(true)
end
it 'returns an Added viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Added)
end
end
context 'when the file represented by the diff file is text-based' do
it 'returns a text viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Text)
end
end
end
context 'when deleted' do
let(:commit) { project.commit('d59c60028b053793cecfb4022de34602e1a9218e') }
let(:diff_file) { commit.diffs.diff_file_with_old_path('files/js/commit.js.coffee') }
before do
allow(diff_file).to receive(:content_changed?).and_return(nil)
end
context 'when the file represented by the diff file is binary' do
before do
allow(diff_file).to receive(:raw_binary?).and_return(true)
end
it 'returns a Deleted viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Deleted)
end
end
context 'when the diff file old and new blob types are different' do
before do
allow(diff_file).to receive(:different_type?).and_return(true)
end
it 'returns a Deleted viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Deleted)
end
end
context 'when the file represented by the diff file is text-based' do
it 'returns a text viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Text)
end
end
end
context 'when renamed' do
let(:commit) { project.commit('6907208d755b60ebeacb2e9dfea74c92c3449a1f') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/js/commit.coffee') }
before do
allow(diff_file).to receive(:content_changed?).and_return(nil)
end
it 'returns a Renamed viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::Renamed)
end
end
context 'when mode changed' do
before do
allow(diff_file).to receive(:content_changed?).and_return(nil)
allow(diff_file).to receive(:mode_changed?).and_return(true)
end
it 'returns a Mode Changed viewer' do
expect(diff_file.simple_viewer).to be_a(DiffViewer::ModeChanged)
end
end
end
describe '#rich_viewer' do
let(:commit) { project.commit('2f63565e7aac07bcdadb654e253078b727143ec4') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/images/6049019_460s.jpg') }
context 'when the diff file has a matching viewer' do
context 'when the diff file content did not change' do
before do
allow(diff_file).to receive(:content_changed?).and_return(false)
end
it 'returns nil' do
expect(diff_file.rich_viewer).to be_nil
end
end
context 'when the diff file is not diffable' do
before do
allow(diff_file).to receive(:diffable?).and_return(false)
end
it 'returns nil' do
expect(diff_file.rich_viewer).to be_nil
end
end
context 'when the diff file old and new blob types are different' do
before do
allow(diff_file).to receive(:different_type?).and_return(true)
end
it 'returns nil' do
expect(diff_file.rich_viewer).to be_nil
end
end
context 'when the diff file has an external storage error' do
before do
allow(diff_file).to receive(:external_storage_error?).and_return(true)
end
it 'returns nil' do
expect(diff_file.rich_viewer).to be_nil
end
end
context 'when everything is right' do
it 'returns the viewer' do
expect(diff_file.rich_viewer).to be_a(DiffViewer::Image)
end
end
end
context 'when the diff file does not have a matching viewer' do
let(:commit) { project.commit('570e7b2abdd848b95f2f578043fc23bd6f6fd24d') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/ruby/popen.rb') }
it 'returns nil' do
expect(diff_file.rich_viewer).to be_nil
end
end
end
describe '#rendered_as_text?' do
context 'when the simple viewer is text-based' do
let(:commit) { project.commit('570e7b2abdd848b95f2f578043fc23bd6f6fd24d') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/ruby/popen.rb') }
context 'when ignoring errors' do
context 'when the viewer has render errors' do
before do
diff_file.diff.too_large!
end
it 'returns true' do
expect(diff_file.rendered_as_text?).to be_truthy
end
end
context "when the viewer doesn't have render errors" do
it 'returns true' do
expect(diff_file.rendered_as_text?).to be_truthy
end
end
end
context 'when not ignoring errors' do
context 'when the viewer has render errors' do
before do
diff_file.diff.too_large!
end
it 'returns false' do
expect(diff_file.rendered_as_text?(ignore_errors: false)).to be_falsey
end
end
context "when the viewer doesn't have render errors" do
it 'returns true' do
expect(diff_file.rendered_as_text?(ignore_errors: false)).to be_truthy
end
end
end
end
context 'when the simple viewer is binary' do
let(:commit) { project.commit('2f63565e7aac07bcdadb654e253078b727143ec4') }
let(:diff_file) { commit.diffs.diff_file_with_new_path('files/images/6049019_460s.jpg') }
it 'returns false' do
expect(diff_file.rendered_as_text?).to be_falsey
end
end
end
end