Simplify Note model specs

This commit is contained in:
Robert Speicher 2015-05-10 22:57:44 -04:00
parent b94c6d9f5b
commit 19142f4079
2 changed files with 36 additions and 215 deletions

View file

@ -34,7 +34,7 @@ FactoryGirl.define do
factory :system_note, traits: [:system] factory :system_note, traits: [:system]
trait :on_commit do trait :on_commit do
project factory: :project project
commit_id RepoHelpers.sample_commit.id commit_id RepoHelpers.sample_commit.id
noteable_type "Commit" noteable_type "Commit"
end end
@ -44,7 +44,7 @@ FactoryGirl.define do
end end
trait :on_merge_request do trait :on_merge_request do
project factory: :project project
noteable_id 1 noteable_id 1
noteable_type "MergeRequest" noteable_type "MergeRequest"
end end

View file

@ -20,20 +20,44 @@
require 'spec_helper' require 'spec_helper'
describe Note do describe Note do
describe "Associations" do describe 'associations' do
it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:project) }
it { is_expected.to belong_to(:noteable) } it { is_expected.to belong_to(:noteable) }
it { is_expected.to belong_to(:author).class_name('User') } it { is_expected.to belong_to(:author).class_name('User') }
end end
describe "Mass assignment" do describe 'validation' do
end
describe "Validation" do
it { is_expected.to validate_presence_of(:note) } it { is_expected.to validate_presence_of(:note) }
it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_presence_of(:project) }
end end
describe '#votable?' do
it 'is true for issue notes' do
note = build(:note_on_issue)
expect(note).to be_votable
end
it 'is true for merge request notes' do
note = build(:note_on_merge_request)
expect(note).to be_votable
end
it 'is false for merge request diff notes' do
note = build(:note_on_merge_request_diff)
expect(note).not_to be_votable
end
it 'is false for commit notes' do
note = build(:note_on_commit)
expect(note).not_to be_votable
end
it 'is false for commit diff notes' do
note = build(:note_on_commit_diff)
expect(note).not_to be_votable
end
end
describe 'voting score' do describe 'voting score' do
it 'recognizes a neutral note' do it 'recognizes a neutral note' do
note = build(:votable_note, note: 'This is not a +1 note') note = build(:votable_note, note: 'This is not a +1 note')
@ -78,8 +102,6 @@ describe Note do
end end
end end
let(:project) { create(:project) }
describe "Commit notes" do describe "Commit notes" do
let!(:note) { create(:note_on_commit, note: "+1 from me") } let!(:note) { create(:note_on_commit, note: "+1 from me") }
let!(:commit) { note.noteable } let!(:commit) { note.noteable }
@ -98,10 +120,6 @@ describe Note do
it "should be recognized by #for_commit?" do it "should be recognized by #for_commit?" do
expect(note).to be_for_commit expect(note).to be_for_commit
end end
it "should not be votable" do
expect(note).not_to be_votable
end
end end
describe "Commit diff line notes" do describe "Commit diff line notes" do
@ -126,205 +144,7 @@ describe Note do
end end
end end
describe "Issue notes" do describe 'authorization' do
let!(:note) { create(:note_on_issue, note: "+1 from me") }
it "should not be votable" do
expect(note).to be_votable
end
end
describe "Merge request notes" do
let!(:note) { create(:note_on_merge_request, note: "+1 from me") }
it "should be votable" do
expect(note).to be_votable
end
end
describe "Merge request diff line notes" do
let!(:note) { create(:note_on_merge_request_diff, note: "+1 from me") }
it "should not be votable" do
expect(note).not_to be_votable
end
end
describe '#create_cross_reference_note' do
let(:project) { create(:project) }
let(:author) { create(:user) }
let(:issue) { create(:issue, project: project) }
let(:mergereq) { create(:merge_request, :simple, target_project: project, source_project: project) }
let(:commit) { project.commit }
# Test all of {issue, merge request, commit} in both the referenced and referencing
# roles, to ensure that the correct information can be inferred from any argument.
context 'issue from a merge request' do
subject { Note.create_cross_reference_note(issue, mergereq, author) }
it { is_expected.to be_valid }
describe '#noteable' do
subject { super().noteable }
it { is_expected.to eq(issue) }
end
describe '#project' do
subject { super().project }
it { is_expected.to eq(issue.project) }
end
describe '#author' do
subject { super().author }
it { is_expected.to eq(author) }
end
describe '#note' do
subject { super().note }
it { is_expected.to eq("mentioned in merge request !#{mergereq.iid}") }
end
end
context 'issue from a commit' do
subject { Note.create_cross_reference_note(issue, commit, author) }
it { is_expected.to be_valid }
describe '#noteable' do
subject { super().noteable }
it { is_expected.to eq(issue) }
end
describe '#note' do
subject { super().note }
it { is_expected.to eq("mentioned in commit #{commit.sha}") }
end
end
context 'merge request from an issue' do
subject { Note.create_cross_reference_note(mergereq, issue, author) }
it { is_expected.to be_valid }
describe '#noteable' do
subject { super().noteable }
it { is_expected.to eq(mergereq) }
end
describe '#project' do
subject { super().project }
it { is_expected.to eq(mergereq.project) }
end
describe '#note' do
subject { super().note }
it { is_expected.to eq("mentioned in issue ##{issue.iid}") }
end
end
context 'commit from a merge request' do
subject { Note.create_cross_reference_note(commit, mergereq, author) }
it { is_expected.to be_valid }
describe '#noteable' do
subject { super().noteable }
it { is_expected.to eq(commit) }
end
describe '#project' do
subject { super().project }
it { is_expected.to eq(project) }
end
describe '#note' do
subject { super().note }
it { is_expected.to eq("mentioned in merge request !#{mergereq.iid}") }
end
end
context 'commit contained in a merge request' do
subject { Note.create_cross_reference_note(mergereq.commits.first, mergereq, author) }
it { is_expected.to be_nil }
end
context 'commit from issue' do
subject { Note.create_cross_reference_note(commit, issue, author) }
it { is_expected.to be_valid }
describe '#noteable_type' do
subject { super().noteable_type }
it { is_expected.to eq("Commit") }
end
describe '#noteable_id' do
subject { super().noteable_id }
it { is_expected.to be_nil }
end
describe '#commit_id' do
subject { super().commit_id }
it { is_expected.to eq(commit.id) }
end
describe '#note' do
subject { super().note }
it { is_expected.to eq("mentioned in issue ##{issue.iid}") }
end
end
context 'commit from commit' do
let(:parent_commit) { commit.parents.first }
subject { Note.create_cross_reference_note(commit, parent_commit, author) }
it { is_expected.to be_valid }
describe '#noteable_type' do
subject { super().noteable_type }
it { is_expected.to eq("Commit") }
end
describe '#noteable_id' do
subject { super().noteable_id }
it { is_expected.to be_nil }
end
describe '#commit_id' do
subject { super().commit_id }
it { is_expected.to eq(commit.id) }
end
describe '#note' do
subject { super().note }
it { is_expected.to eq("mentioned in commit #{parent_commit.id}") }
end
end
end
describe '#system?' do
let(:project) { create(:project) }
let(:issue) { create(:issue, project: project) }
let(:other) { create(:issue, project: project) }
let(:author) { create(:user) }
let(:assignee) { create(:user) }
let(:label) { create(:label) }
let(:milestone) { create(:milestone) }
it 'should recognize user-supplied notes as non-system' do
@note = create(:note_on_issue)
expect(@note).not_to be_system
end
it 'should identify cross-reference notes as system notes' do
@note = Note.create_cross_reference_note(issue, other, author)
expect(@note).to be_system
end
end
describe :authorization do
before do before do
@p1 = create(:project) @p1 = create(:project)
@p2 = create(:project) @p2 = create(:project)
@ -335,7 +155,7 @@ describe Note do
@abilities << Ability @abilities << Ability
end end
describe :read do describe 'read' do
before do before do
@p1.project_members.create(user: @u2, access_level: ProjectMember::GUEST) @p1.project_members.create(user: @u2, access_level: ProjectMember::GUEST)
@p2.project_members.create(user: @u3, access_level: ProjectMember::GUEST) @p2.project_members.create(user: @u3, access_level: ProjectMember::GUEST)
@ -346,7 +166,7 @@ describe Note do
it { expect(@abilities.allowed?(@u3, :read_note, @p1)).to be_falsey } it { expect(@abilities.allowed?(@u3, :read_note, @p1)).to be_falsey }
end end
describe :write do describe 'write' do
before do before do
@p1.project_members.create(user: @u2, access_level: ProjectMember::DEVELOPER) @p1.project_members.create(user: @u2, access_level: ProjectMember::DEVELOPER)
@p2.project_members.create(user: @u3, access_level: ProjectMember::DEVELOPER) @p2.project_members.create(user: @u3, access_level: ProjectMember::DEVELOPER)
@ -357,7 +177,7 @@ describe Note do
it { expect(@abilities.allowed?(@u3, :write_note, @p1)).to be_falsey } it { expect(@abilities.allowed?(@u3, :write_note, @p1)).to be_falsey }
end end
describe :admin do describe 'admin' do
before do before do
@p1.project_members.create(user: @u1, access_level: ProjectMember::REPORTER) @p1.project_members.create(user: @u1, access_level: ProjectMember::REPORTER)
@p1.project_members.create(user: @u2, access_level: ProjectMember::MASTER) @p1.project_members.create(user: @u2, access_level: ProjectMember::MASTER)
@ -373,6 +193,7 @@ describe Note do
it_behaves_like 'an editable mentionable' do it_behaves_like 'an editable mentionable' do
subject { create :note, noteable: issue, project: project } subject { create :note, noteable: issue, project: project }
let(:project) { create(:project) }
let(:issue) { create :issue, project: project } let(:issue) { create :issue, project: project }
let(:backref_text) { issue.gfm_reference } let(:backref_text) { issue.gfm_reference }
let(:set_mentionable_text) { ->(txt) { subject.note = txt } } let(:set_mentionable_text) { ->(txt) { subject.note = txt } }