Add tests for DiffNote
This commit is contained in:
parent
213f646f9a
commit
3dff2867b7
|
|
@ -0,0 +1,186 @@
|
|||
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 "#update_position" do
|
||||
context "when noteable is a commit" do
|
||||
subject { create(:diff_note_on_commit, project: project, position: position) }
|
||||
|
||||
it "doesn't use the DiffPositionUpdateService" do
|
||||
expect(Notes::DiffPositionUpdateService).not_to receive(:new)
|
||||
|
||||
subject.update_position
|
||||
end
|
||||
|
||||
it "doesn't update the position" do
|
||||
subject.update_position
|
||||
|
||||
expect(subject.original_position).to eq(position)
|
||||
expect(subject.position).to eq(position)
|
||||
end
|
||||
end
|
||||
|
||||
context "when noteable is a merge request" do
|
||||
context "when the note is active" do
|
||||
it "doesn't use the DiffPositionUpdateService" do
|
||||
expect(Notes::DiffPositionUpdateService).not_to receive(:new)
|
||||
|
||||
subject.update_position
|
||||
end
|
||||
|
||||
it "doesn't update the position" do
|
||||
subject.update_position
|
||||
|
||||
expect(subject.original_position).to eq(position)
|
||||
expect(subject.position).to eq(position)
|
||||
end
|
||||
end
|
||||
|
||||
context "when the note is outdated" do
|
||||
before do
|
||||
allow(subject.noteable).to receive(:diff_refs).and_return(commit.diff_refs)
|
||||
end
|
||||
|
||||
it "uses the DiffPositionUpdateService" do
|
||||
expect(Notes::DiffPositionUpdateService).to receive(:new).with(
|
||||
project,
|
||||
nil,
|
||||
old_diff_refs: position.diff_refs,
|
||||
new_diff_refs: commit.diff_refs,
|
||||
paths: [path]
|
||||
).and_call_original
|
||||
expect_any_instance_of(Notes::DiffPositionUpdateService).to receive(:execute).with(subject)
|
||||
|
||||
subject.update_position
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Reference in New Issue