Count +1 votes in issue notes.

This commit is contained in:
Ariejan de Vroom 2012-03-14 15:31:31 +02:00
parent ed11ca13e8
commit 8d8b82127f
6 changed files with 81 additions and 15 deletions

View file

@ -45,6 +45,11 @@ class Issue < ActiveRecord::Base
def new? def new?
today? && created_at == updated_at today? && created_at == updated_at
end end
# Return the number of +1 comments (upvotes)
def upvotes
notes.select(&:upvote?).size
end
end end
# == Schema Information # == Schema Information
# #

View file

@ -47,27 +47,27 @@ class Note < ActiveRecord::Base
end end
def target def target
if noteable_type == "Commit" if noteable_type == "Commit"
project.commit(noteable_id) project.commit(noteable_id)
else else
noteable noteable
end end
# Temp fix to prevent app crash # Temp fix to prevent app crash
# if note commit id doesnt exist # if note commit id doesnt exist
rescue rescue
nil nil
end end
# Check if we can notify commit author # Check if we can notify commit author
# with email about our comment # with email about our comment
# #
# If commit author email exist in project # If commit author email exist in project
# and commit author is not passed user we can # and commit author is not passed user we can
# send email to him # send email to him
# #
# params: # params:
# user - current user # user - current user
# #
# return: # return:
# Boolean # Boolean
# #
@ -81,12 +81,18 @@ class Note < ActiveRecord::Base
end end
def commit_author def commit_author
@commit_author ||= @commit_author ||=
project.users.find_by_email(target.author_email) || project.users.find_by_email(target.author_email) ||
project.users.find_by_name(target.author_name) project.users.find_by_name(target.author_name)
rescue rescue
nil nil
end end
# Returns true if this is an upvote note,
# otherwise false is returned
def upvote?
note =~ /^\+1/ ? true : false
end
end end
# == Schema Information # == Schema Information
# #

View file

@ -14,6 +14,8 @@
%span.label.important critical %span.label.important critical
- if issue.today? - if issue.today?
%span.label.success today %span.label.success today
- if issue.upvotes > 0
%span.label.success= "+#{issue.upvotes}"

View file

@ -35,6 +35,9 @@
%cite.cgray and currently assigned to %cite.cgray and currently assigned to
= image_tag gravatar_icon(@issue.assignee_email), :width => 16, :class => "lil_av" = image_tag gravatar_icon(@issue.assignee_email), :width => 16, :class => "lil_av"
%strong.author= link_to_issue_assignee(@issue) %strong.author= link_to_issue_assignee(@issue)
- if @issue.upvotes > 0
%span.label.success= "+#{@issue.upvotes}"
%hr %hr

View file

@ -24,6 +24,37 @@ describe Issue do
:assignee => Factory(:user), :assignee => Factory(:user),
:project => Factory.create(:project)).should be_valid } :project => Factory.create(:project)).should be_valid }
describe "plus 1" do
let(:project) { Factory(:project) }
subject {
Factory.create(:issue,
:author => Factory(:user),
:assignee => Factory(:user),
:project => project)
}
it "with no notes has a 0/0 score" do
subject.upvotes.should == 0
end
it "should recognize non-+1 notes" do
subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone'))
subject.should have(1).note
subject.notes.first.upvote?.should be_false
subject.upvotes.should == 0
end
it "should recognize a single +1 note" do
subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))
subject.upvotes.should == 1
end
it "should recognize a multiple +1 notes" do
subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))
subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo'))
subject.upvotes.should == 2
end
end
end end
# == Schema Information # == Schema Information
# #

View file

@ -20,10 +20,29 @@ describe Note do
Note.today.where_values.should == ["created_at >= '#{Date.today}'"] Note.today.where_values.should == ["created_at >= '#{Date.today}'"]
end end
end end
describe "Commit notes" do
before do describe "Voting score" do
let(:project) { Factory(:project) }
it "recognizes a neutral note" do
note = Factory(:note, project: project, note: "This is not a +1 note")
note.should_not be_upvote
end
it "recognizes a +1 note" do
note = Factory(:note, project: project, note: "+1 for this")
note.should be_upvote
end
it "recognizes a -1 note as no vote" do
note = Factory(:note, project: project, note: "-1 for this")
note.should_not be_upvote
end
end
describe "Commit notes" do
before do
@note = Factory :note, @note = Factory :note,
:project => project, :project => project,
:noteable_id => commit.id, :noteable_id => commit.id,
@ -36,12 +55,12 @@ describe Note do
end end
end end
describe "Pre-line commit notes" do describe "Pre-line commit notes" do
before do before do
@note = Factory :note, @note = Factory :note,
:project => project, :project => project,
:noteable_id => commit.id, :noteable_id => commit.id,
:noteable_type => "Commit", :noteable_type => "Commit",
:line_code => "0_16_1" :line_code => "0_16_1"
end end