OSDN Git Service

register push event
authorDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>
Tue, 28 Feb 2012 14:48:15 +0000 (16:48 +0200)
committerDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>
Tue, 28 Feb 2012 14:48:15 +0000 (16:48 +0200)
app/models/project.rb
app/workers/post_receive.rb
spec/models/activity_observer_spec.rb
spec/models/project_hooks_spec.rb [new file with mode: 0644]
spec/models/project_spec.rb

index 122f59f..4d1d4e7 100644 (file)
@@ -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
 
index 922a66e..81654df 100644 (file)
@@ -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
index c8f0915..9cd0dfb 100644 (file)
@@ -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 (file)
index 0000000..841c85b
--- /dev/null
@@ -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
index e97aaec..f53b833 100644 (file)
@@ -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 }