Skip to content

Commit 9f46d86

Browse files
committed
feat(webhook status): migrate webhook execution data to triggered webhooks
1 parent 7ef595a commit 9f46d86

File tree

3 files changed

+155
-1
lines changed

3 files changed

+155
-1
lines changed

db/migrations/39_add_triggered_webhoooks_fk_to_execution.rb db/migrations/39_add_triggered_webhooks_fk_to_execution.rb

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
set_column_allow_null(:provider_id)
99
end
1010

11-
from(:webhook_executions).delete
1211
# Hope old code doesn't insert another webhook in the meantime!
1312

1413
# TODO drop_column(:webhook_executions, :webhook_id)
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
require 'securerandom'
2+
3+
Sequel.migration do
4+
up do
5+
from(:webhook_executions).each do | execution |
6+
pact_publication = from(:all_pact_publications).where(
7+
consumer_id: execution[:consumer_id],
8+
provider_id: execution[:provider_id]
9+
).where(
10+
Sequel.lit("created_at <= ?", execution[:created_at])
11+
).reverse_order(:id).limit(1).single_record
12+
13+
if pact_publication
14+
webhook_uuid = from(:webhooks).where(id: execution[:webhook_id]).single_record[:uuid]
15+
status = execution[:success] ? 'success' : 'failure'
16+
17+
from(:triggered_webhooks).insert(
18+
trigger_uuid: SecureRandom.urlsafe_base64,
19+
trigger_type: 'pact_publication',
20+
pact_publication_id: pact_publication[:id],
21+
webhook_id: execution[:webhook_id],
22+
webhook_uuid: webhook_uuid,
23+
consumer_id: execution[:consumer_id],
24+
provider_id: execution[:provider_id],
25+
created_at: execution[:created_at],
26+
updated_at: execution[:created_at],
27+
status: status
28+
)
29+
end
30+
end
31+
end
32+
33+
down do
34+
from(:triggered_webhooks).delete
35+
end
36+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
require 'tasks/database'
2+
3+
describe 'creating triggered webhooks from webhook executions (migrate 36-41)', no_db_clean: :true do
4+
5+
def create table_name, params, id_column_name = :id
6+
database[table_name].insert(params);
7+
database[table_name].order(id_column_name).last
8+
end
9+
10+
let(:database) { DB.connection_for_env 'test' }
11+
12+
before do
13+
PactBroker::Database.drop_objects
14+
PactBroker::Database.migrate(36)
15+
end
16+
17+
let(:before_now) { DateTime.new(2016, 1, 1) }
18+
let(:now) { DateTime.new(2018, 2, 2) }
19+
let(:consumer) { create(:pacticipants, {name: 'Consumer', created_at: now, updated_at: now}) }
20+
let(:provider) { create(:pacticipants, {name: 'Provider', created_at: now, updated_at: now}) }
21+
let(:consumer_version) { create(:versions, {number: '1.2.3', order: 1, pacticipant_id: consumer[:id], created_at: now, updated_at: now}) }
22+
let(:pact_version) { create(:pact_versions, {content: {some: 'json'}.to_json, sha: '1234', consumer_id: consumer[:id], provider_id: provider[:id], created_at: now}) }
23+
let(:pact_publication) do
24+
create(:pact_publications, {
25+
consumer_version_id: consumer_version[:id],
26+
provider_id: provider[:id],
27+
revision_number: 1,
28+
pact_version_id: pact_version[:id],
29+
created_at: (now - 1)
30+
})
31+
end
32+
33+
let(:pact_publication_2) do
34+
create(:pact_publications, {
35+
consumer_version_id: consumer_version[:id],
36+
provider_id: provider[:id],
37+
revision_number: 2,
38+
pact_version_id: pact_version[:id],
39+
created_at: now
40+
})
41+
end
42+
let(:pact_publication_3) do
43+
create(:pact_publications, {
44+
consumer_version_id: consumer_version[:id],
45+
provider_id: provider[:id],
46+
revision_number: 3,
47+
pact_version_id: pact_version[:id],
48+
created_at: (now + 1)
49+
})
50+
end
51+
let(:webhook) do
52+
create(:webhooks, {
53+
uuid: '1234',
54+
method: 'GET',
55+
url: 'http://www.example.org',
56+
consumer_id: consumer[:id],
57+
provider_id: provider[:id],
58+
is_json_request_body: false,
59+
created_at: now
60+
})
61+
end
62+
let(:webhook_execution) do
63+
create(:webhook_executions, {
64+
webhook_id: webhook[:id],
65+
pact_publication_id: pact_publication[:id],
66+
consumer_id: consumer[:id],
67+
provider_id: provider[:id],
68+
success: true,
69+
logs: 'logs',
70+
created_at: now
71+
})
72+
end
73+
74+
let(:do_migration) do
75+
PactBroker::Database.migrate(41)
76+
end
77+
78+
context "when a pact_publication can be found" do
79+
before do
80+
pact_publication
81+
pact_publication_2
82+
pact_publication_3
83+
webhook_execution
84+
end
85+
86+
it "creates a triggered webhook for each webhook execution" do
87+
do_migration
88+
expect(database[:triggered_webhooks].count).to eq 1
89+
expect(database[:triggered_webhooks].first[:webhook_id]).to eq webhook[:id]
90+
expect(database[:triggered_webhooks].first[:webhook_uuid]).to eq '1234'
91+
expect(database[:triggered_webhooks].first[:consumer_id]).to eq consumer[:id]
92+
expect(database[:triggered_webhooks].first[:provider_id]).to eq provider[:id]
93+
expect(database[:triggered_webhooks].first[:pact_publication_id]).to eq pact_publication_2[:id]
94+
expect(database[:triggered_webhooks].first[:status]).to eq 'success'
95+
expect(database[:triggered_webhooks].first[:created_at]).to eq webhook[:created_at]
96+
expect(database[:triggered_webhooks].first[:updated_at]).to eq webhook[:created_at]
97+
end
98+
99+
context "migrating backwards" do
100+
it "deletes the triggered_webhooks again" do
101+
do_migration
102+
PactBroker::Database.migrate(40)
103+
expect(database[:triggered_webhooks].count).to eq 0
104+
end
105+
end
106+
end
107+
108+
context "when a pact_publication cannot be found" do
109+
it "does not insert a triggered webhook" do
110+
do_migration
111+
expect(database[:triggered_webhooks].count).to eq 0
112+
end
113+
end
114+
115+
after do
116+
PactBroker::Database.migrate
117+
PactBroker::Database.truncate
118+
end
119+
end

0 commit comments

Comments
 (0)