dbcf48af8b
When calling pre-receive, post-receive, and update hooks, add the GitLab username as the GL_USERNAME environment variable. This patch only handles cases where pushes are over http, or via the web interface. Later, we will address the ssh case.
97 lines
3.4 KiB
Ruby
97 lines
3.4 KiB
Ruby
require 'spec_helper'
|
|
require 'fileutils'
|
|
|
|
describe Gitlab::Git::Hook do
|
|
before do
|
|
# We need this because in the spec/spec_helper.rb we define it like this:
|
|
# allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil])
|
|
allow_any_instance_of(described_class).to receive(:trigger).and_call_original
|
|
end
|
|
|
|
describe "#trigger" do
|
|
let(:project) { create(:project, :repository) }
|
|
let(:repository) { project.repository.raw_repository }
|
|
let(:repo_path) { repository.path }
|
|
let(:user) { create(:user) }
|
|
let(:gl_id) { Gitlab::GlId.gl_id(user) }
|
|
let(:gl_username) { user.username }
|
|
|
|
def create_hook(name)
|
|
FileUtils.mkdir_p(File.join(repo_path, 'hooks'))
|
|
File.open(File.join(repo_path, 'hooks', name), 'w', 0755) do |f|
|
|
f.write('exit 0')
|
|
end
|
|
end
|
|
|
|
def create_failing_hook(name)
|
|
FileUtils.mkdir_p(File.join(repo_path, 'hooks'))
|
|
File.open(File.join(repo_path, 'hooks', name), 'w', 0755) do |f|
|
|
f.write(<<-HOOK)
|
|
echo 'regular message from the hook'
|
|
echo 'error message from the hook' 1>&2
|
|
echo 'error message from the hook line 2' 1>&2
|
|
exit 1
|
|
HOOK
|
|
end
|
|
end
|
|
|
|
['pre-receive', 'post-receive', 'update'].each do |hook_name|
|
|
context "when triggering a #{hook_name} hook" do
|
|
context "when the hook is successful" do
|
|
let(:hook_path) { File.join(repo_path, 'hooks', hook_name) }
|
|
let(:gl_repository) { Gitlab::GlRepository.gl_repository(project, false) }
|
|
let(:env) do
|
|
{
|
|
'GL_ID' => gl_id,
|
|
'GL_USERNAME' => gl_username,
|
|
'PWD' => repo_path,
|
|
'GL_PROTOCOL' => 'web',
|
|
'GL_REPOSITORY' => gl_repository
|
|
}
|
|
end
|
|
|
|
it "returns success with no errors" do
|
|
create_hook(hook_name)
|
|
hook = described_class.new(hook_name, repository)
|
|
blank = Gitlab::Git::BLANK_SHA
|
|
ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
|
|
|
|
if hook_name != 'update'
|
|
expect(Open3).to receive(:popen3)
|
|
.with(env, hook_path, chdir: repo_path).and_call_original
|
|
end
|
|
|
|
status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
|
|
expect(status).to be true
|
|
expect(errors).to be_blank
|
|
end
|
|
end
|
|
|
|
context "when the hook is unsuccessful" do
|
|
it "returns failure with errors" do
|
|
create_failing_hook(hook_name)
|
|
hook = described_class.new(hook_name, repository)
|
|
blank = Gitlab::Git::BLANK_SHA
|
|
ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
|
|
|
|
status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
|
|
expect(status).to be false
|
|
expect(errors).to eq("error message from the hook<br>error message from the hook line 2<br>")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when the hook doesn't exist" do
|
|
it "returns success with no errors" do
|
|
hook = described_class.new('unknown_hook', repository)
|
|
blank = Gitlab::Git::BLANK_SHA
|
|
ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
|
|
|
|
status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
|
|
expect(status).to be true
|
|
expect(errors).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|