1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# frozen_string_literal: true
module QA
RSpec.describe 'Manage' do
describe 'WebHooks integration', :requires_admin, :integrations, :orchestrated, product_group: :integrations do
before(:context) do
toggle_local_requests(true)
end
after(:context) do
Vendor::Smocker::SmockerApi.teardown!
end
let(:session) { SecureRandom.hex(5) }
it 'sends a push event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348945' do
setup_webhook(push: true) do |webhook, smocker|
Resource::Repository::ProjectPush.fabricate! do |project_push|
project_push.project = webhook.project
end
wait_until do
!smocker.history(session).empty?
end
events = smocker.history(session).map(&:as_hook_event)
aggregate_failures do
expect(events.size).to be(1), "Should have 1 event: \n#{events.map(&:raw).join("\n")}"
expect(events[0].project_name).to eql(webhook.project.name)
expect(events[0].push?).to be(true), "Not push event: \n#{events[0].raw}"
end
end
end
it 'sends a merge request event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349720' do
setup_webhook(merge_requests: true) do |webhook, smocker|
Resource::MergeRequest.fabricate_via_api! do |merge_request|
merge_request.project = webhook.project
end
wait_until do
!smocker.history(session).empty?
end
events = smocker.history(session).map(&:as_hook_event)
aggregate_failures do
expect(events.size).to be(1), "Should have 1 event: \n#{events.map(&:raw).join("\n")}"
expect(events[0].project_name).to eql(webhook.project.name)
expect(events[0].mr?).to be(true), "Not MR event: \n#{events[0].raw}"
end
end
end
it 'sends a wiki page event', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349722' do
setup_webhook(wiki_page: true) do |webhook, smocker|
Resource::Wiki::ProjectPage.fabricate_via_api! do |page|
page.project = webhook.project
end
wait_until do
!smocker.history(session).empty?
end
events = smocker.history(session).map(&:as_hook_event)
aggregate_failures do
expect(events.size).to be(1), "Should have 1 event: \n#{events.map(&:raw).join("\n")}"
expect(events[0].project_name).to eql(webhook.project.name)
expect(events[0].wiki?).to be(true), "Not wiki event: \n#{events[0].raw}"
end
end
end
it 'sends an issues and note event',
testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349723' do
setup_webhook(issues: true, note: true) do |webhook, smocker|
issue = Resource::Issue.fabricate_via_api! do |issue_init|
issue_init.project = webhook.project
end
Resource::ProjectIssueNote.fabricate_via_api! do |note|
note.project = issue.project
note.issue = issue
end
wait_until do
smocker.history(session).size > 1
end
events = smocker.history(session).map(&:as_hook_event)
aggregate_failures do
issue_event = events.find(&:issue?)
note_event = events.find(&:note?)
expect(events.size).to be(2), "Should have 2 events: \n#{events.map(&:raw).join("\n")}"
expect(issue_event).not_to be(nil), "Not issue event: \n#{events[0].raw}"
expect(note_event).not_to be(nil), "Not note event: \n#{events[1].raw}"
end
end
end
private
def setup_webhook(**event_args)
Vendor::Smocker::SmockerApi.init(wait: 10) do |smocker|
smocker.register(session: session)
webhook = Resource::ProjectWebHook.fabricate_via_api! do |hook|
hook.url = smocker.url
event_args.each do |event, bool|
hook.send("#{event}_events=", bool)
end
end
yield(webhook, smocker)
smocker.reset
end
end
def toggle_local_requests(on)
Runtime::ApplicationSettings.set_application_settings(allow_local_requests_from_web_hooks_and_services: on)
end
def wait_until(timeout = 120, &block)
Support::Waiter.wait_until(max_duration: timeout, reload_page: false, raise_on_failure: false, &block)
end
end
end
end
|