192 lines
5.1 KiB
Ruby
192 lines
5.1 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_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_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
|