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 90 [GIT_HOST['host'], code].join("/")
91 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 103 def execute_web_hooks(oldrev, newrev, ref)
94 104 ref_parts = ref.split('/')
95 105  
... ... @@ -97,6 +107,7 @@ class Project < ActiveRecord::Base
97 107 return if ref_parts[1] !~ /heads/ || oldrev == "00000000000000000000000000000000"
98 108  
99 109 data = web_hook_data(oldrev, newrev, ref)
  110 +
100 111 web_hooks.each { |web_hook| web_hook.execute(data) }
101 112 end
102 113  
... ...
app/workers/post_receive.rb
... ... @@ -5,6 +5,7 @@ class PostReceive
5 5 project = Project.find_by_path(reponame)
6 6 return false if project.nil?
7 7  
  8 + project.observe_push(oldrev, newrev, ref)
8 9 project.execute_web_hooks(oldrev, newrev, ref)
9 10 end
10 11 end
... ...
spec/models/activity_observer_spec.rb
... ... @@ -3,14 +3,18 @@ require 'spec_helper'
3 3 describe ActivityObserver do
4 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 11 describe "Merge Request created" do
7 12 before do
8 13 @merge_request = Factory :merge_request, :project => project
9 14 @event = Event.last
10 15 end
11 16  
12   - it { @event.should_not be_nil }
13   - it { @event.project.should == project }
  17 + it_should_be_valid_event
14 18 it { @event.action.should == Event::Created }
15 19 it { @event.target.should == @merge_request }
16 20 end
... ... @@ -21,8 +25,7 @@ describe ActivityObserver do
21 25 @event = Event.last
22 26 end
23 27  
24   - it { @event.should_not be_nil }
25   - it { @event.project.should == project }
  28 + it_should_be_valid_event
26 29 it { @event.action.should == Event::Created }
27 30 it { @event.target.should == @issue }
28 31 end
... ... @@ -34,8 +37,7 @@ describe ActivityObserver do
34 37 @event = Event.last
35 38 end
36 39  
37   - it { @event.should_not be_nil }
38   - it { @event.project.should == project }
  40 + it_should_be_valid_event
39 41 it { @event.action.should == Event::Commented }
40 42 it { @event.target.should == @note }
41 43 end
... ...
spec/models/project_hooks_spec.rb 0 → 100644
... ... @@ -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 70 end
71 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 73 describe "updates" do
174 74 let(:project) { Factory :project }
175 75  
... ...