Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/diff_note_spec.rb')
-rw-r--r--spec/models/diff_note_spec.rb120
1 files changed, 113 insertions, 7 deletions
diff --git a/spec/models/diff_note_spec.rb b/spec/models/diff_note_spec.rb
index 601dac21e6a..ae493d5c081 100644
--- a/spec/models/diff_note_spec.rb
+++ b/spec/models/diff_note_spec.rb
@@ -91,18 +91,124 @@ describe DiffNote do
end
describe '#create_diff_file callback' do
- let(:noteable) { create(:merge_request) }
- let(:project) { noteable.project }
-
context 'merge request' do
- let!(:diff_note) { create(:diff_note_on_merge_request, project: project, noteable: noteable) }
+ let(:position) do
+ Gitlab::Diff::Position.new(old_path: "files/ruby/popen.rb",
+ new_path: "files/ruby/popen.rb",
+ old_line: nil,
+ new_line: 9,
+ diff_refs: merge_request.diff_refs)
+ end
- it 'creates a diff note file' do
- expect(diff_note.reload.note_diff_file).to be_present
+ subject { build(:diff_note_on_merge_request, project: project, position: position, noteable: merge_request) }
+
+ let(:diff_file_from_repository) do
+ position.diff_file(project.repository)
+ end
+
+ let(:diff_file) do
+ diffs = merge_request.diffs
+ raw_diff = diffs.diffable.raw_diffs(diffs.diff_options.merge(paths: ['files/ruby/popen.rb'])).first
+ Gitlab::Diff::File.new(raw_diff,
+ repository: diffs.project.repository,
+ diff_refs: diffs.diff_refs,
+ fallback_diff_refs: diffs.fallback_diff_refs)
+ end
+
+ let(:diff_line) { diff_file.diff_lines.first }
+
+ let(:line_code) { '2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14' }
+
+ before do
+ allow(subject.position).to receive(:line_code).and_return('2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14')
+ end
+
+ context 'when diffs are already created' do
+ before do
+ allow(subject).to receive(:created_at_diff?).and_return(true)
+ end
+
+ context 'when diff_file is found in persisted diffs' do
+ before do
+ allow(merge_request).to receive_message_chain(:diffs, :diff_files, :first).and_return(diff_file)
+ end
+
+ context 'when importing' do
+ before do
+ subject.importing = true
+ subject.line_code = line_code
+ end
+
+ context 'when diff_line is found in persisted diff_file' do
+ before do
+ allow(diff_file).to receive(:line_for_position).with(position).and_return(diff_line)
+ end
+
+ it 'creates a diff note file' do
+ subject.save
+ expect(subject.note_diff_file).to be_present
+ end
+ end
+
+ context 'when diff_line is not found in persisted diff_file' do
+ before do
+ allow(diff_file).to receive(:line_for_position).and_return(nil)
+ end
+
+ it_behaves_like 'a valid diff note with after commit callback'
+ end
+ end
+
+ context 'when not importing' do
+ context 'when diff_line is not found' do
+ before do
+ allow(diff_file).to receive(:line_for_position).with(position).and_return(nil)
+ end
+
+ it 'raises an error' do
+ expect { subject.save }.to raise_error(::DiffNote::NoteDiffFileCreationError,
+ "Failed to find diff line for: #{diff_file.file_path}, "\
+ "old_line: #{position.old_line}"\
+ ", new_line: #{position.new_line}")
+ end
+ end
+
+ context 'when diff_line is found' do
+ before do
+ allow(diff_file).to receive(:line_for_position).with(position).and_return(diff_line)
+ end
+
+ it 'creates a diff note file' do
+ subject.save
+ expect(subject.reload.note_diff_file).to be_present
+ end
+ end
+ end
+ end
+
+ context 'when diff file is not found in persisted diffs' do
+ before do
+ allow_next_instance_of(Gitlab::Diff::FileCollection::MergeRequestDiff) do |merge_request_diff|
+ allow(merge_request_diff).to receive(:diff_files).and_return([])
+ end
+ end
+
+ it_behaves_like 'a valid diff note with after commit callback'
+ end
+ end
+
+ context 'when diffs are not already created' do
+ before do
+ allow(subject).to receive(:created_at_diff?).and_return(false)
+ end
+
+ it_behaves_like 'a valid diff note with after commit callback'
end
it 'does not create diff note file if it is a reply' do
- expect { create(:diff_note_on_merge_request, noteable: noteable, in_reply_to: diff_note) }
+ diff_note = create(:diff_note_on_merge_request, project: project, noteable: merge_request)
+
+ expect { create(:diff_note_on_merge_request, noteable: merge_request, in_reply_to: diff_note) }
.not_to change(NoteDiffFile, :count)
end
end