diff --git a/app/models/issue.rb b/app/models/issue.rb index 4210297c..632e6537 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -45,6 +45,11 @@ class Issue < ActiveRecord::Base def new? today? && created_at == updated_at end + + # Return the number of +1 comments (upvotes) + def upvotes + notes.select(&:upvote?).size + end end # == Schema Information # diff --git a/app/models/note.rb b/app/models/note.rb index 581f7833..cee726ea 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -47,27 +47,27 @@ class Note < ActiveRecord::Base end def target - if noteable_type == "Commit" + if noteable_type == "Commit" project.commit(noteable_id) - else + else noteable end # Temp fix to prevent app crash # if note commit id doesnt exist - rescue + rescue nil end # Check if we can notify commit author # with email about our comment # - # If commit author email exist in project - # and commit author is not passed user we can + # If commit author email exist in project + # and commit author is not passed user we can # send email to him # # params: # user - current user - # + # # return: # Boolean # @@ -81,12 +81,18 @@ class Note < ActiveRecord::Base end def commit_author - @commit_author ||= - project.users.find_by_email(target.author_email) || + @commit_author ||= + project.users.find_by_email(target.author_email) || project.users.find_by_name(target.author_name) - rescue + rescue nil end + + # Returns true if this is an upvote note, + # otherwise false is returned + def upvote? + note =~ /^\+1/ ? true : false + end end # == Schema Information # diff --git a/app/views/issues/_show.html.haml b/app/views/issues/_show.html.haml index b8031e92..505fa81e 100644 --- a/app/views/issues/_show.html.haml +++ b/app/views/issues/_show.html.haml @@ -14,6 +14,8 @@ %span.label.important critical - if issue.today? %span.label.success today + - if issue.upvotes > 0 + %span.label.success= "+#{issue.upvotes}" diff --git a/app/views/issues/show.html.haml b/app/views/issues/show.html.haml index 13292d4e..fc0d3498 100644 --- a/app/views/issues/show.html.haml +++ b/app/views/issues/show.html.haml @@ -35,6 +35,9 @@ %cite.cgray and currently assigned to = image_tag gravatar_icon(@issue.assignee_email), :width => 16, :class => "lil_av" %strong.author= link_to_issue_assignee(@issue) + + - if @issue.upvotes > 0 + %span.label.success= "+#{@issue.upvotes}" %hr diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 74eb5b93..d76adff3 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -24,6 +24,37 @@ describe Issue do :assignee => Factory(:user), :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 # == Schema Information # diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index f36f12dd..c74f7277 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -20,10 +20,29 @@ describe Note do Note.today.where_values.should == ["created_at >= '#{Date.today}'"] 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, :project => project, :noteable_id => commit.id, @@ -36,12 +55,12 @@ describe Note do end end - describe "Pre-line commit notes" do - before do + describe "Pre-line commit notes" do + before do @note = Factory :note, :project => project, :noteable_id => commit.id, - :noteable_type => "Commit", + :noteable_type => "Commit", :line_code => "0_16_1" end