8716ff7f63
- Preloading noteable we share the same noteable instance when more than one discussion refers to the same noteable. - Any other call to that object that is cached in that object will be for any discussion. - In those cases where merge_request_diff has all the sha stored to build a diff_refs get that diff_refs using directly those sha instead accessing to the git repository to first get the commits and later the sha.
191 lines
5.2 KiB
Ruby
191 lines
5.2 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe DiffNote, models: true do
|
|
include RepoHelpers
|
|
|
|
let(:project) { create(:project) }
|
|
let(:merge_request) { create(:merge_request, source_project: project) }
|
|
let(:commit) { project.commit(sample_commit.id) }
|
|
|
|
let(:path) { "files/ruby/popen.rb" }
|
|
|
|
let!(:position) do
|
|
Gitlab::Diff::Position.new(
|
|
old_path: path,
|
|
new_path: path,
|
|
old_line: nil,
|
|
new_line: 14,
|
|
diff_refs: merge_request.diff_refs
|
|
)
|
|
end
|
|
|
|
let!(:new_position) do
|
|
Gitlab::Diff::Position.new(
|
|
old_path: path,
|
|
new_path: path,
|
|
old_line: 16,
|
|
new_line: 22,
|
|
diff_refs: merge_request.diff_refs
|
|
)
|
|
end
|
|
|
|
subject { create(:diff_note_on_merge_request, project: project, position: position, noteable: merge_request) }
|
|
|
|
describe "#position=" do
|
|
context "when provided a string" do
|
|
it "sets the position" do
|
|
subject.position = new_position.to_json
|
|
|
|
expect(subject.position).to eq(new_position)
|
|
end
|
|
end
|
|
|
|
context "when provided a hash" do
|
|
it "sets the position" do
|
|
subject.position = new_position.to_h
|
|
|
|
expect(subject.position).to eq(new_position)
|
|
end
|
|
end
|
|
|
|
context "when provided a position object" do
|
|
it "sets the position" do
|
|
subject.position = new_position
|
|
|
|
expect(subject.position).to eq(new_position)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#diff_file" do
|
|
it "returns the correct diff file" do
|
|
diff_file = subject.diff_file
|
|
|
|
expect(diff_file.old_path).to eq(position.old_path)
|
|
expect(diff_file.new_path).to eq(position.new_path)
|
|
expect(diff_file.diff_refs).to eq(position.diff_refs)
|
|
end
|
|
end
|
|
|
|
describe "#diff_line" do
|
|
it "returns the correct diff line" do
|
|
diff_line = subject.diff_line
|
|
|
|
expect(diff_line.added?).to be true
|
|
expect(diff_line.new_line).to eq(position.new_line)
|
|
expect(diff_line.text).to eq("+ vars = {")
|
|
end
|
|
end
|
|
|
|
describe "#line_code" do
|
|
it "returns the correct line code" do
|
|
line_code = Gitlab::Diff::LineCode.generate(position.file_path, position.new_line, 15)
|
|
|
|
expect(subject.line_code).to eq(line_code)
|
|
end
|
|
end
|
|
|
|
describe "#for_line?" do
|
|
context "when provided the correct diff line" do
|
|
it "returns true" do
|
|
expect(subject.for_line?(subject.diff_line)).to be true
|
|
end
|
|
end
|
|
|
|
context "when provided a different diff line" do
|
|
it "returns false" do
|
|
some_line = subject.diff_file.diff_lines.first
|
|
|
|
expect(subject.for_line?(some_line)).to be false
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#active?" do
|
|
context "when noteable is a commit" do
|
|
subject { create(:diff_note_on_commit, project: project, position: position) }
|
|
|
|
it "returns true" do
|
|
expect(subject.active?).to be true
|
|
end
|
|
end
|
|
|
|
context "when noteable is a merge request" do
|
|
context "when the merge request's diff refs match that of the diff note" do
|
|
it "returns true" do
|
|
expect(subject.active?).to be true
|
|
end
|
|
end
|
|
|
|
context "when the merge request's diff refs don't match that of the diff note" do
|
|
before do
|
|
allow(subject.noteable).to receive(:diff_sha_refs).and_return(commit.diff_refs)
|
|
end
|
|
|
|
it "returns false" do
|
|
expect(subject.active?).to be false
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "creation" do
|
|
describe "updating of position" do
|
|
context "when noteable is a commit" do
|
|
let(:diff_note) { create(:diff_note_on_commit, project: project, position: position) }
|
|
|
|
it "doesn't use the DiffPositionUpdateService" do
|
|
expect(Notes::DiffPositionUpdateService).not_to receive(:new)
|
|
|
|
diff_note
|
|
end
|
|
|
|
it "doesn't update the position" do
|
|
diff_note
|
|
|
|
expect(diff_note.original_position).to eq(position)
|
|
expect(diff_note.position).to eq(position)
|
|
end
|
|
end
|
|
|
|
context "when noteable is a merge request" do
|
|
let(:diff_note) { create(:diff_note_on_merge_request, project: project, position: position, noteable: merge_request) }
|
|
|
|
context "when the note is active" do
|
|
it "doesn't use the DiffPositionUpdateService" do
|
|
expect(Notes::DiffPositionUpdateService).not_to receive(:new)
|
|
|
|
diff_note
|
|
end
|
|
|
|
it "doesn't update the position" do
|
|
diff_note
|
|
|
|
expect(diff_note.original_position).to eq(position)
|
|
expect(diff_note.position).to eq(position)
|
|
end
|
|
end
|
|
|
|
context "when the note is outdated" do
|
|
before do
|
|
allow(merge_request).to receive(:diff_sha_refs).and_return(commit.diff_refs)
|
|
end
|
|
|
|
it "uses the DiffPositionUpdateService" do
|
|
service = instance_double("Notes::DiffPositionUpdateService")
|
|
expect(Notes::DiffPositionUpdateService).to receive(:new).with(
|
|
project,
|
|
nil,
|
|
old_diff_refs: position.diff_refs,
|
|
new_diff_refs: commit.diff_refs,
|
|
paths: [path]
|
|
).and_return(service)
|
|
expect(service).to receive(:execute)
|
|
|
|
diff_note
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|