From fa07c9d662cd73b751812d0def5f09244d6ee895 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 28 Feb 2012 16:48:15 +0200 Subject: [PATCH] register push event --- app/models/project.rb | 11 +++ app/workers/post_receive.rb | 1 + spec/models/activity_observer_spec.rb | 14 ++-- spec/models/project_hooks_spec.rb | 115 ++++++++++++++++++++++++++ spec/models/project_spec.rb | 100 ---------------------- 5 files changed, 135 insertions(+), 106 deletions(-) create mode 100644 spec/models/project_hooks_spec.rb diff --git a/app/models/project.rb b/app/models/project.rb index 122f59fb..4d1d4e79 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -90,6 +90,16 @@ class Project < ActiveRecord::Base [GIT_HOST['host'], code].join("/") end + def observe_push(oldrev, newrev, ref) + data = web_hook_data(oldrev, newrev, ref) + + Event.create( + :project => self, + :action => Event::Pushed, + :data => data + ) + end + def execute_web_hooks(oldrev, newrev, ref) ref_parts = ref.split('/') @@ -97,6 +107,7 @@ class Project < ActiveRecord::Base return if ref_parts[1] !~ /heads/ || oldrev == "00000000000000000000000000000000" data = web_hook_data(oldrev, newrev, ref) + web_hooks.each { |web_hook| web_hook.execute(data) } end diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb index 922a66eb..81654dfa 100644 --- a/app/workers/post_receive.rb +++ b/app/workers/post_receive.rb @@ -5,6 +5,7 @@ class PostReceive project = Project.find_by_path(reponame) return false if project.nil? + project.observe_push(oldrev, newrev, ref) project.execute_web_hooks(oldrev, newrev, ref) end end diff --git a/spec/models/activity_observer_spec.rb b/spec/models/activity_observer_spec.rb index c8f09159..9cd0dfb6 100644 --- a/spec/models/activity_observer_spec.rb +++ b/spec/models/activity_observer_spec.rb @@ -3,14 +3,18 @@ require 'spec_helper' describe ActivityObserver do let(:project) { Factory :project } + def self.it_should_be_valid_event + it { @event.should_not be_nil } + it { @event.project.should == project } + end + describe "Merge Request created" do before do @merge_request = Factory :merge_request, :project => project @event = Event.last end - it { @event.should_not be_nil } - it { @event.project.should == project } + it_should_be_valid_event it { @event.action.should == Event::Created } it { @event.target.should == @merge_request } end @@ -21,8 +25,7 @@ describe ActivityObserver do @event = Event.last end - it { @event.should_not be_nil } - it { @event.project.should == project } + it_should_be_valid_event it { @event.action.should == Event::Created } it { @event.target.should == @issue } end @@ -34,8 +37,7 @@ describe ActivityObserver do @event = Event.last end - it { @event.should_not be_nil } - it { @event.project.should == project } + it_should_be_valid_event it { @event.action.should == Event::Commented } it { @event.target.should == @note } end diff --git a/spec/models/project_hooks_spec.rb b/spec/models/project_hooks_spec.rb new file mode 100644 index 00000000..841c85ba --- /dev/null +++ b/spec/models/project_hooks_spec.rb @@ -0,0 +1,115 @@ +require 'spec_helper' + +describe Project, "Hooks" do + let(:project) { Factory :project } + + describe "Post Receive Event" do + it "should create push event" do + oldrev, newrev, ref = '00000000000000000000000000000000', 'newrev', 'refs/heads/master' + project.observe_push(oldrev, newrev, ref) + event = Event.last + + event.should_not be_nil + event.project.should == project + event.action.should == Event::Pushed + event.data == project.web_hook_data(oldrev, newrev, ref) + end + end + + describe "Web hooks" do + context "with no web hooks" do + it "raises no errors" do + lambda { + project.execute_web_hooks('oldrev', 'newrev', 'ref') + }.should_not raise_error + end + end + + context "with web hooks" do + before do + @webhook = Factory(:web_hook) + @webhook_2 = Factory(:web_hook) + project.web_hooks << [@webhook, @webhook_2] + end + + it "executes multiple web hook" do + @webhook.should_receive(:execute).once + @webhook_2.should_receive(:execute).once + + project.execute_web_hooks('oldrev', 'newrev', 'refs/heads/master') + end + end + + context "does not execute web hooks" do + before do + @webhook = Factory(:web_hook) + project.web_hooks << [@webhook] + end + + it "when pushing a branch for the first time" do + @webhook.should_not_receive(:execute) + project.execute_web_hooks('00000000000000000000000000000000', 'newrev', 'refs/heads/master') + end + + it "when pushing tags" do + @webhook.should_not_receive(:execute) + project.execute_web_hooks('oldrev', 'newrev', 'refs/tags/v1.0.0') + end + end + + context "when pushing new branches" do + + end + + context "when gathering commit data" do + before do + @oldrev, @newrev, @ref = project.fresh_commits(2).last.sha, project.fresh_commits(2).first.sha, 'refs/heads/master' + @commit = project.fresh_commits(2).first + + # Fill nil/empty attributes + project.description = "This is a description" + + @data = project.web_hook_data(@oldrev, @newrev, @ref) + end + + subject { @data } + + it { should include(before: @oldrev) } + it { should include(after: @newrev) } + it { should include(ref: @ref) } + + context "with repository data" do + subject { @data[:repository] } + + it { should include(name: project.name) } + it { should include(url: project.web_url) } + it { should include(description: project.description) } + it { should include(homepage: project.web_url) } + it { should include(private: project.private?) } + end + + context "with commits" do + subject { @data[:commits] } + + it { should be_an(Array) } + it { should have(1).element } + + context "the commit" do + subject { @data[:commits].first } + + it { should include(id: @commit.id) } + it { should include(message: @commit.safe_message) } + it { should include(timestamp: @commit.date.xmlschema) } + it { should include(url: "http://localhost/#{project.code}/commits/#{@commit.id}") } + + context "with a author" do + subject { @data[:commits].first[:author] } + + it { should include(name: @commit.author_name) } + it { should include(email: @commit.author_email) } + end + end + end + end + end +end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e97aaec1..f53b833f 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -70,106 +70,6 @@ describe Project do end end - describe "web hooks" do - let(:project) { Factory :project } - - context "with no web hooks" do - it "raises no errors" do - lambda { - project.execute_web_hooks('oldrev', 'newrev', 'ref') - }.should_not raise_error - end - end - - context "with web hooks" do - before do - @webhook = Factory(:web_hook) - @webhook_2 = Factory(:web_hook) - project.web_hooks << [@webhook, @webhook_2] - end - - it "executes multiple web hook" do - @webhook.should_receive(:execute).once - @webhook_2.should_receive(:execute).once - - project.execute_web_hooks('oldrev', 'newrev', 'refs/heads/master') - end - end - - context "does not execute web hooks" do - before do - @webhook = Factory(:web_hook) - project.web_hooks << [@webhook] - end - - it "when pushing a branch for the first time" do - @webhook.should_not_receive(:execute) - project.execute_web_hooks('00000000000000000000000000000000', 'newrev', 'refs/heads/master') - end - - it "when pushing tags" do - @webhook.should_not_receive(:execute) - project.execute_web_hooks('oldrev', 'newrev', 'refs/tags/v1.0.0') - end - end - - context "when pushing new branches" do - - end - - context "when gathering commit data" do - before do - @oldrev, @newrev, @ref = project.fresh_commits(2).last.sha, project.fresh_commits(2).first.sha, 'refs/heads/master' - @commit = project.fresh_commits(2).first - - # Fill nil/empty attributes - project.description = "This is a description" - - @data = project.web_hook_data(@oldrev, @newrev, @ref) - end - - subject { @data } - - it { should include(before: @oldrev) } - it { should include(after: @newrev) } - it { should include(ref: @ref) } - - context "with repository data" do - subject { @data[:repository] } - - it { should include(name: project.name) } - it { should include(url: project.web_url) } - it { should include(description: project.description) } - it { should include(homepage: project.web_url) } - it { should include(private: project.private?) } - end - - context "with commits" do - subject { @data[:commits] } - - it { should be_an(Array) } - it { should have(1).element } - - context "the commit" do - subject { @data[:commits].first } - - it { should include(id: @commit.id) } - it { should include(message: @commit.safe_message) } - it { should include(timestamp: @commit.date.xmlschema) } - it { should include(url: "http://localhost/#{project.code}/commits/#{@commit.id}") } - - context "with a author" do - subject { @data[:commits].first[:author] } - - it { should include(name: @commit.author_name) } - it { should include(email: @commit.author_email) } - end - end - end - - end - end - describe "updates" do let(:project) { Factory :project }