Commit fa07c9d662cd73b751812d0def5f09244d6ee895

Authored by Dmitriy Zaporozhets
1 parent dcdb2fdf

register push event

app/models/project.rb
@@ -90,6 +90,16 @@ class Project < ActiveRecord::Base @@ -90,6 +90,16 @@ class Project < ActiveRecord::Base
90 [GIT_HOST['host'], code].join("/") 90 [GIT_HOST['host'], code].join("/")
91 end 91 end
92 92
  93 + def observe_push(oldrev, newrev, ref)
  94 + data = web_hook_data(oldrev, newrev, ref)
  95 +
  96 + Event.create(
  97 + :project => self,
  98 + :action => Event::Pushed,
  99 + :data => data
  100 + )
  101 + end
  102 +
93 def execute_web_hooks(oldrev, newrev, ref) 103 def execute_web_hooks(oldrev, newrev, ref)
94 ref_parts = ref.split('/') 104 ref_parts = ref.split('/')
95 105
@@ -97,6 +107,7 @@ class Project < ActiveRecord::Base @@ -97,6 +107,7 @@ class Project < ActiveRecord::Base
97 return if ref_parts[1] !~ /heads/ || oldrev == "00000000000000000000000000000000" 107 return if ref_parts[1] !~ /heads/ || oldrev == "00000000000000000000000000000000"
98 108
99 data = web_hook_data(oldrev, newrev, ref) 109 data = web_hook_data(oldrev, newrev, ref)
  110 +
100 web_hooks.each { |web_hook| web_hook.execute(data) } 111 web_hooks.each { |web_hook| web_hook.execute(data) }
101 end 112 end
102 113
app/workers/post_receive.rb
@@ -5,6 +5,7 @@ class PostReceive @@ -5,6 +5,7 @@ class PostReceive
5 project = Project.find_by_path(reponame) 5 project = Project.find_by_path(reponame)
6 return false if project.nil? 6 return false if project.nil?
7 7
  8 + project.observe_push(oldrev, newrev, ref)
8 project.execute_web_hooks(oldrev, newrev, ref) 9 project.execute_web_hooks(oldrev, newrev, ref)
9 end 10 end
10 end 11 end
spec/models/activity_observer_spec.rb
@@ -3,14 +3,18 @@ require 'spec_helper' @@ -3,14 +3,18 @@ require 'spec_helper'
3 describe ActivityObserver do 3 describe ActivityObserver do
4 let(:project) { Factory :project } 4 let(:project) { Factory :project }
5 5
  6 + def self.it_should_be_valid_event
  7 + it { @event.should_not be_nil }
  8 + it { @event.project.should == project }
  9 + end
  10 +
6 describe "Merge Request created" do 11 describe "Merge Request created" do
7 before do 12 before do
8 @merge_request = Factory :merge_request, :project => project 13 @merge_request = Factory :merge_request, :project => project
9 @event = Event.last 14 @event = Event.last
10 end 15 end
11 16
12 - it { @event.should_not be_nil }  
13 - it { @event.project.should == project } 17 + it_should_be_valid_event
14 it { @event.action.should == Event::Created } 18 it { @event.action.should == Event::Created }
15 it { @event.target.should == @merge_request } 19 it { @event.target.should == @merge_request }
16 end 20 end
@@ -21,8 +25,7 @@ describe ActivityObserver do @@ -21,8 +25,7 @@ describe ActivityObserver do
21 @event = Event.last 25 @event = Event.last
22 end 26 end
23 27
24 - it { @event.should_not be_nil }  
25 - it { @event.project.should == project } 28 + it_should_be_valid_event
26 it { @event.action.should == Event::Created } 29 it { @event.action.should == Event::Created }
27 it { @event.target.should == @issue } 30 it { @event.target.should == @issue }
28 end 31 end
@@ -34,8 +37,7 @@ describe ActivityObserver do @@ -34,8 +37,7 @@ describe ActivityObserver do
34 @event = Event.last 37 @event = Event.last
35 end 38 end
36 39
37 - it { @event.should_not be_nil }  
38 - it { @event.project.should == project } 40 + it_should_be_valid_event
39 it { @event.action.should == Event::Commented } 41 it { @event.action.should == Event::Commented }
40 it { @event.target.should == @note } 42 it { @event.target.should == @note }
41 end 43 end
spec/models/project_hooks_spec.rb 0 → 100644
@@ -0,0 +1,115 @@ @@ -0,0 +1,115 @@
  1 +require 'spec_helper'
  2 +
  3 +describe Project, "Hooks" do
  4 + let(:project) { Factory :project }
  5 +
  6 + describe "Post Receive Event" do
  7 + it "should create push event" do
  8 + oldrev, newrev, ref = '00000000000000000000000000000000', 'newrev', 'refs/heads/master'
  9 + project.observe_push(oldrev, newrev, ref)
  10 + event = Event.last
  11 +
  12 + event.should_not be_nil
  13 + event.project.should == project
  14 + event.action.should == Event::Pushed
  15 + event.data == project.web_hook_data(oldrev, newrev, ref)
  16 + end
  17 + end
  18 +
  19 + describe "Web hooks" do
  20 + context "with no web hooks" do
  21 + it "raises no errors" do
  22 + lambda {
  23 + project.execute_web_hooks('oldrev', 'newrev', 'ref')
  24 + }.should_not raise_error
  25 + end
  26 + end
  27 +
  28 + context "with web hooks" do
  29 + before do
  30 + @webhook = Factory(:web_hook)
  31 + @webhook_2 = Factory(:web_hook)
  32 + project.web_hooks << [@webhook, @webhook_2]
  33 + end
  34 +
  35 + it "executes multiple web hook" do
  36 + @webhook.should_receive(:execute).once
  37 + @webhook_2.should_receive(:execute).once
  38 +
  39 + project.execute_web_hooks('oldrev', 'newrev', 'refs/heads/master')
  40 + end
  41 + end
  42 +
  43 + context "does not execute web hooks" do
  44 + before do
  45 + @webhook = Factory(:web_hook)
  46 + project.web_hooks << [@webhook]
  47 + end
  48 +
  49 + it "when pushing a branch for the first time" do
  50 + @webhook.should_not_receive(:execute)
  51 + project.execute_web_hooks('00000000000000000000000000000000', 'newrev', 'refs/heads/master')
  52 + end
  53 +
  54 + it "when pushing tags" do
  55 + @webhook.should_not_receive(:execute)
  56 + project.execute_web_hooks('oldrev', 'newrev', 'refs/tags/v1.0.0')
  57 + end
  58 + end
  59 +
  60 + context "when pushing new branches" do
  61 +
  62 + end
  63 +
  64 + context "when gathering commit data" do
  65 + before do
  66 + @oldrev, @newrev, @ref = project.fresh_commits(2).last.sha, project.fresh_commits(2).first.sha, 'refs/heads/master'
  67 + @commit = project.fresh_commits(2).first
  68 +
  69 + # Fill nil/empty attributes
  70 + project.description = "This is a description"
  71 +
  72 + @data = project.web_hook_data(@oldrev, @newrev, @ref)
  73 + end
  74 +
  75 + subject { @data }
  76 +
  77 + it { should include(before: @oldrev) }
  78 + it { should include(after: @newrev) }
  79 + it { should include(ref: @ref) }
  80 +
  81 + context "with repository data" do
  82 + subject { @data[:repository] }
  83 +
  84 + it { should include(name: project.name) }
  85 + it { should include(url: project.web_url) }
  86 + it { should include(description: project.description) }
  87 + it { should include(homepage: project.web_url) }
  88 + it { should include(private: project.private?) }
  89 + end
  90 +
  91 + context "with commits" do
  92 + subject { @data[:commits] }
  93 +
  94 + it { should be_an(Array) }
  95 + it { should have(1).element }
  96 +
  97 + context "the commit" do
  98 + subject { @data[:commits].first }
  99 +
  100 + it { should include(id: @commit.id) }
  101 + it { should include(message: @commit.safe_message) }
  102 + it { should include(timestamp: @commit.date.xmlschema) }
  103 + it { should include(url: "http://localhost/#{project.code}/commits/#{@commit.id}") }
  104 +
  105 + context "with a author" do
  106 + subject { @data[:commits].first[:author] }
  107 +
  108 + it { should include(name: @commit.author_name) }
  109 + it { should include(email: @commit.author_email) }
  110 + end
  111 + end
  112 + end
  113 + end
  114 + end
  115 +end
spec/models/project_spec.rb
@@ -70,106 +70,6 @@ describe Project do @@ -70,106 +70,6 @@ describe Project do
70 end 70 end
71 end 71 end
72 72
73 - describe "web hooks" do  
74 - let(:project) { Factory :project }  
75 -  
76 - context "with no web hooks" do  
77 - it "raises no errors" do  
78 - lambda {  
79 - project.execute_web_hooks('oldrev', 'newrev', 'ref')  
80 - }.should_not raise_error  
81 - end  
82 - end  
83 -  
84 - context "with web hooks" do  
85 - before do  
86 - @webhook = Factory(:web_hook)  
87 - @webhook_2 = Factory(:web_hook)  
88 - project.web_hooks << [@webhook, @webhook_2]  
89 - end  
90 -  
91 - it "executes multiple web hook" do  
92 - @webhook.should_receive(:execute).once  
93 - @webhook_2.should_receive(:execute).once  
94 -  
95 - project.execute_web_hooks('oldrev', 'newrev', 'refs/heads/master')  
96 - end  
97 - end  
98 -  
99 - context "does not execute web hooks" do  
100 - before do  
101 - @webhook = Factory(:web_hook)  
102 - project.web_hooks << [@webhook]  
103 - end  
104 -  
105 - it "when pushing a branch for the first time" do  
106 - @webhook.should_not_receive(:execute)  
107 - project.execute_web_hooks('00000000000000000000000000000000', 'newrev', 'refs/heads/master')  
108 - end  
109 -  
110 - it "when pushing tags" do  
111 - @webhook.should_not_receive(:execute)  
112 - project.execute_web_hooks('oldrev', 'newrev', 'refs/tags/v1.0.0')  
113 - end  
114 - end  
115 -  
116 - context "when pushing new branches" do  
117 -  
118 - end  
119 -  
120 - context "when gathering commit data" do  
121 - before do  
122 - @oldrev, @newrev, @ref = project.fresh_commits(2).last.sha, project.fresh_commits(2).first.sha, 'refs/heads/master'  
123 - @commit = project.fresh_commits(2).first  
124 -  
125 - # Fill nil/empty attributes  
126 - project.description = "This is a description"  
127 -  
128 - @data = project.web_hook_data(@oldrev, @newrev, @ref)  
129 - end  
130 -  
131 - subject { @data }  
132 -  
133 - it { should include(before: @oldrev) }  
134 - it { should include(after: @newrev) }  
135 - it { should include(ref: @ref) }  
136 -  
137 - context "with repository data" do  
138 - subject { @data[:repository] }  
139 -  
140 - it { should include(name: project.name) }  
141 - it { should include(url: project.web_url) }  
142 - it { should include(description: project.description) }  
143 - it { should include(homepage: project.web_url) }  
144 - it { should include(private: project.private?) }  
145 - end  
146 -  
147 - context "with commits" do  
148 - subject { @data[:commits] }  
149 -  
150 - it { should be_an(Array) }  
151 - it { should have(1).element }  
152 -  
153 - context "the commit" do  
154 - subject { @data[:commits].first }  
155 -  
156 - it { should include(id: @commit.id) }  
157 - it { should include(message: @commit.safe_message) }  
158 - it { should include(timestamp: @commit.date.xmlschema) }  
159 - it { should include(url: "http://localhost/#{project.code}/commits/#{@commit.id}") }  
160 -  
161 - context "with a author" do  
162 - subject { @data[:commits].first[:author] }  
163 -  
164 - it { should include(name: @commit.author_name) }  
165 - it { should include(email: @commit.author_email) }  
166 - end  
167 - end  
168 - end  
169 -  
170 - end  
171 - end  
172 -  
173 describe "updates" do 73 describe "updates" do
174 let(:project) { Factory :project } 74 let(:project) { Factory :project }
175 75