Commit 07381107 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'sh-simplify-system-hook-testing' into 'master'

Simplify system hook testing and guarantee test will fire

Closes #37067

See merge request !13858
parents 891d90a9 1e53f40c
...@@ -2,47 +2,16 @@ module TestHooks ...@@ -2,47 +2,16 @@ module TestHooks
class SystemService < TestHooks::BaseService class SystemService < TestHooks::BaseService
private private
def project
@project ||= begin
project = Project.first
throw(:validation_error, 'Ensure that at least one project exists.') unless project
project
end
end
def push_events_data def push_events_data
if project.empty_repo? Gitlab::DataBuilder::Push.sample_data
throw(:validation_error, "Ensure project \"#{project.human_name}\" has commits.")
end
Gitlab::DataBuilder::Push.build_sample(project, current_user)
end end
def tag_push_events_data def tag_push_events_data
if project.repository.tags.empty? Gitlab::DataBuilder::Push.sample_data
throw(:validation_error, "Ensure project \"#{project.human_name}\" has tags.")
end
Gitlab::DataBuilder::Push.build_sample(project, current_user)
end end
def repository_update_events_data def repository_update_events_data
commit = project.commit Gitlab::DataBuilder::Repository.sample_data
ref = "#{Gitlab::Git::BRANCH_REF_PREFIX}#{project.default_branch}"
unless commit
throw(:validation_error, "Ensure project \"#{project.human_name}\" has commits.")
end
change = Gitlab::DataBuilder::Repository.single_change(
commit.parent_id || Gitlab::Git::BLANK_SHA,
commit.id,
ref
)
Gitlab::DataBuilder::Repository.update(project, current_user, [change], [ref])
end end
end end
end end
...@@ -3,6 +3,35 @@ module Gitlab ...@@ -3,6 +3,35 @@ module Gitlab
module Push module Push
extend self extend self
SAMPLE_DATA =
{
object_kind: "push",
event_name: "push",
before: "95790bf891e76fee5e1747ab589903a6a1f80f22",
after: "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
ref: "refs/heads/master",
checkout_sha: "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
message: "Hello World",
user_id: 4,
user_name: "John Smith",
user_email: "john@example.com",
user_avatar: "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
project_id: 15,
commits: [
{
id: "c5feabde2d8cd023215af4d2ceeb7a64839fc428",
message: "Add simple search to projects in public area",
timestamp: "2013-05-13T18:18:08+00:00",
url: "https://test.example.com/gitlab/gitlabhq/commit/c5feabde2d8cd023215af4d2ceeb7a64839fc428",
author: {
name: "Test User",
email: "test@example.com"
}
}
],
total_commits_count: 1
}.freeze
# Produce a hash of post-receive data # Produce a hash of post-receive data
# #
# data = { # data = {
...@@ -74,6 +103,10 @@ module Gitlab ...@@ -74,6 +103,10 @@ module Gitlab
build(project, user, commits.last&.id, commits.first&.id, ref, commits) build(project, user, commits.last&.id, commits.first&.id, ref, commits)
end end
def sample_data
SAMPLE_DATA
end
private private
def checkout_sha(repository, newrev, ref) def checkout_sha(repository, newrev, ref)
......
...@@ -3,6 +3,23 @@ module Gitlab ...@@ -3,6 +3,23 @@ module Gitlab
module Repository module Repository
extend self extend self
SAMPLE_DATA = {
event_name: 'repository_update',
user_id: 10,
user_name: 'john.doe',
user_email: 'test@example.com',
user_avatar: 'http://example.com/avatar/user.png',
project_id: 40,
changes: [
{
before: "8205ea8d81ce0c6b90fbe8280d118cc9fdad6130",
after: "4045ea7a3df38697b3730a20fb73c8bed8a3e69e",
ref: "refs/heads/master"
}
],
"refs": ["refs/heads/master"]
}.freeze
# Produce a hash of post-receive data # Produce a hash of post-receive data
def update(project, user, changes, refs) def update(project, user, changes, refs)
{ {
...@@ -30,6 +47,10 @@ module Gitlab ...@@ -30,6 +47,10 @@ module Gitlab
ref: ref ref: ref
} }
end end
def sample_data
SAMPLE_DATA
end
end end
end end
end end
...@@ -7,7 +7,6 @@ describe TestHooks::SystemService do ...@@ -7,7 +7,6 @@ describe TestHooks::SystemService do
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
let(:hook) { create(:system_hook) } let(:hook) { create(:system_hook) }
let(:service) { described_class.new(hook, current_user, trigger) } let(:service) { described_class.new(hook, current_user, trigger) }
let(:sample_data) { { data: 'sample' }}
let(:success_result) { { status: :success, http_status: 200, message: 'ok' } } let(:success_result) { { status: :success, http_status: 200, message: 'ok' } }
before do before do
...@@ -26,18 +25,11 @@ describe TestHooks::SystemService do ...@@ -26,18 +25,11 @@ describe TestHooks::SystemService do
context 'push_events' do context 'push_events' do
let(:trigger) { 'push_events' } let(:trigger) { 'push_events' }
it 'returns error message if not enough data' do
allow(project).to receive(:empty_repo?).and_return(true)
expect(hook).not_to receive(:execute)
expect(service.execute).to include({ status: :error, message: "Ensure project \"#{project.human_name}\" has commits." })
end
it 'executes hook' do it 'executes hook' do
allow(project).to receive(:empty_repo?).and_return(false) allow(project).to receive(:empty_repo?).and_return(false)
allow(Gitlab::DataBuilder::Push).to receive(:build_sample).and_return(sample_data) expect(Gitlab::DataBuilder::Push).to receive(:sample_data).and_call_original
expect(hook).to receive(:execute).with(sample_data, trigger).and_return(success_result) expect(hook).to receive(:execute).with(Gitlab::DataBuilder::Push::SAMPLE_DATA, trigger).and_return(success_result)
expect(service.execute).to include(success_result) expect(service.execute).to include(success_result)
end end
end end
...@@ -45,18 +37,11 @@ describe TestHooks::SystemService do ...@@ -45,18 +37,11 @@ describe TestHooks::SystemService do
context 'tag_push_events' do context 'tag_push_events' do
let(:trigger) { 'tag_push_events' } let(:trigger) { 'tag_push_events' }
it 'returns error message if not enough data' do
allow(project.repository).to receive(:tags).and_return([])
expect(hook).not_to receive(:execute)
expect(service.execute).to include({ status: :error, message: "Ensure project \"#{project.human_name}\" has tags." })
end
it 'executes hook' do it 'executes hook' do
allow(project.repository).to receive(:tags).and_return(['tag']) allow(project.repository).to receive(:tags).and_return(['tag'])
allow(Gitlab::DataBuilder::Push).to receive(:build_sample).and_return(sample_data) expect(Gitlab::DataBuilder::Push).to receive(:sample_data).and_call_original
expect(hook).to receive(:execute).with(sample_data, trigger).and_return(success_result) expect(hook).to receive(:execute).with(Gitlab::DataBuilder::Push::SAMPLE_DATA, trigger).and_return(success_result)
expect(service.execute).to include(success_result) expect(service.execute).to include(success_result)
end end
end end
...@@ -64,17 +49,11 @@ describe TestHooks::SystemService do ...@@ -64,17 +49,11 @@ describe TestHooks::SystemService do
context 'repository_update_events' do context 'repository_update_events' do
let(:trigger) { 'repository_update_events' } let(:trigger) { 'repository_update_events' }
it 'returns error message if not enough data' do
allow(project).to receive(:commit).and_return(nil)
expect(hook).not_to receive(:execute)
expect(service.execute).to include({ status: :error, message: "Ensure project \"#{project.human_name}\" has commits." })
end
it 'executes hook' do it 'executes hook' do
allow(project).to receive(:empty_repo?).and_return(false) allow(project).to receive(:empty_repo?).and_return(false)
allow(Gitlab::DataBuilder::Repository).to receive(:update).and_return(sample_data) expect(Gitlab::DataBuilder::Repository).to receive(:sample_data).and_call_original
expect(hook).to receive(:execute).with(sample_data, trigger).and_return(success_result) expect(hook).to receive(:execute).with(Gitlab::DataBuilder::Repository::SAMPLE_DATA, trigger).and_return(success_result)
expect(service.execute).to include(success_result) expect(service.execute).to include(success_result)
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment