summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Hörner <dirker@gmail.com>2016-09-09 13:57:21 +0200
committerSean McGivern <sean@gitlab.com>2016-12-01 11:40:11 +0000
commitc5cf54392a8853c07352a54f94a754a61259124f (patch)
tree0f9a85c3e5ac056fbc44196924f8682158bd0661
parent0e409ee49b1d68ea949da2d0504f325439ad53b3 (diff)
downloadgitlab-shell-c5cf54392a8853c07352a54f94a754a61259124f.tar.gz
spec: add tests for global custom hooks
-rw-r--r--spec/gitlab_custom_hook_spec.rb174
-rwxr-xr-xspec/support/hook_fail3
-rwxr-xr-xspec/support/hook_ok3
3 files changed, 165 insertions, 15 deletions
diff --git a/spec/gitlab_custom_hook_spec.rb b/spec/gitlab_custom_hook_spec.rb
index 328b925..a456709 100644
--- a/spec/gitlab_custom_hook_spec.rb
+++ b/spec/gitlab_custom_hook_spec.rb
@@ -1,33 +1,177 @@
# coding: utf-8
require 'spec_helper'
-require 'pry'
require 'gitlab_custom_hook'
describe GitlabCustomHook do
- let(:gitlab_custom_hook) { GitlabCustomHook.new('repo_path', 'key_1') }
- let(:hook_path) { File.join(ROOT_PATH, 'spec/support/gl_id_test_hook') }
+ let(:tmp_repo_path) { File.join(ROOT_PATH, 'tmp', 'repo.git') }
+ let(:tmp_root_path) { File.join(ROOT_PATH, 'tmp') }
+ let(:hook_ok) { File.join(ROOT_PATH, 'spec', 'support', 'hook_ok') }
+ let(:hook_fail) { File.join(ROOT_PATH, 'spec', 'support', 'hook_fail') }
- context 'pre_receive hook' do
- it 'passes GL_ID variable to hook' do
- allow(gitlab_custom_hook).to receive(:hook_file).and_return(hook_path)
+ let(:vars) { {"GL_ID" => "key_1"} }
+ let(:old_value) { "old-value" }
+ let(:new_value) { "new-value" }
+ let(:ref_name) { "name/of/ref" }
+ let(:changes) { "#{old_value} #{new_value} #{ref_name}\n" }
- expect(gitlab_custom_hook.pre_receive('changes')).to be_true
+ let(:gitlab_custom_hook) { GitlabCustomHook.new(tmp_repo_path, 'key_1') }
+
+ before do
+ FileUtils.mkdir_p(File.join(tmp_repo_path, 'custom_hooks'))
+ FileUtils.mkdir_p(File.join(tmp_root_path, 'custom_hooks'))
+ end
+
+ after do
+ FileUtils.rm_rf(File.join(tmp_repo_path, 'custom_hooks'))
+ FileUtils.rm_rf(File.join(tmp_root_path, 'custom_hooks'))
+ end
+
+ context 'with gl_id_test_hook' do
+ let(:hook_path) { File.join(ROOT_PATH, 'spec/support/gl_id_test_hook') }
+
+ context 'pre_receive hook' do
+ it 'passes GL_ID variable to hook' do
+ allow(gitlab_custom_hook).to receive(:hook_file).and_return(hook_path)
+
+ expect(gitlab_custom_hook.pre_receive(changes)).to be_true
+ end
+ end
+
+ context 'post_receive hook' do
+ it 'passes GL_ID variable to hook' do
+ allow(gitlab_custom_hook).to receive(:hook_file).and_return(hook_path)
+
+ expect(gitlab_custom_hook.post_receive(changes)).to be_true
+ end
+ end
+
+ context 'update hook' do
+ it 'passes GL_ID variable to hook' do
+ allow(gitlab_custom_hook).to receive(:hook_file).and_return(hook_path)
+
+ expect(gitlab_custom_hook.update(ref_name, old_value, new_value)).to be_true
+ end
+ end
+ end
+
+ context "having no hooks" do
+ it "returns true" do
+ stub_const("ROOT_PATH", tmp_root_path)
+ expect(gitlab_custom_hook.pre_receive(changes)).to eq(true)
+ expect(gitlab_custom_hook.update(ref_name, old_value, new_value)).to eq(true)
+ expect(gitlab_custom_hook.post_receive(changes)).to eq(true)
+ end
+ end
+
+ context "having only ok repo hooks" do
+ before do
+ create_hooks(tmp_repo_path, hook_ok)
+ end
+
+ it "returns true" do
+ stub_const("ROOT_PATH", tmp_root_path)
+ expect(gitlab_custom_hook.pre_receive(changes)).to eq(true)
+ expect(gitlab_custom_hook.update(ref_name, old_value, new_value)).to eq(true)
+ expect(gitlab_custom_hook.post_receive(changes)).to eq(true)
+ end
+ end
+
+ context "having both ok repo and global hooks" do
+ before do
+ create_hooks(tmp_repo_path, hook_ok)
+ create_hooks(tmp_root_path, hook_ok)
+ end
+
+ it "returns true" do
+ stub_const("ROOT_PATH", tmp_root_path)
+ expect(gitlab_custom_hook.pre_receive(changes)).to eq(true)
+ expect(gitlab_custom_hook.update(ref_name, old_value, new_value)).to eq(true)
+ expect(gitlab_custom_hook.post_receive(changes)).to eq(true)
end
end
- context 'post_receive hook' do
- it 'passes GL_ID variable to hook' do
- allow(gitlab_custom_hook).to receive(:hook_file).and_return(hook_path)
+ context "having failing repo and ok global hooks" do
+ before do
+ create_hooks(tmp_repo_path, hook_fail)
+ create_hooks(tmp_root_path, hook_ok)
+ end
+
+ it "returns false" do
+ stub_const("ROOT_PATH", tmp_root_path)
+ expect(gitlab_custom_hook.pre_receive(changes)).to eq(false)
+ expect(gitlab_custom_hook.update(ref_name, old_value, new_value)).to eq(false)
+ expect(gitlab_custom_hook.post_receive(changes)).to eq(false)
+ end
+
+ it "only executes the repo hook" do
+ expect(gitlab_custom_hook).to receive(:call_receive_hook)
+ .with(hook_path(tmp_repo_path, "pre-receive"), changes)
+ .and_call_original
+ expect(gitlab_custom_hook).to receive(:system)
+ .with(vars, hook_path(tmp_repo_path, "update"), ref_name, old_value, new_value)
+ .and_call_original
+ expect(gitlab_custom_hook).to receive(:call_receive_hook)
+ .with(hook_path(tmp_repo_path, "post-receive"), changes)
+ .and_call_original
- expect(gitlab_custom_hook.post_receive('changes')).to be_true
+ stub_const("ROOT_PATH", tmp_root_path)
+ gitlab_custom_hook.pre_receive(changes)
+ gitlab_custom_hook.update(ref_name, old_value, new_value)
+ gitlab_custom_hook.post_receive(changes)
end
end
- context 'update hook' do
- it 'passes GL_ID variable to hook' do
- allow(gitlab_custom_hook).to receive(:hook_file).and_return(hook_path)
+ context "having ok repo but failing global hooks" do
+ before do
+ create_hooks(tmp_repo_path, hook_ok)
+ create_hooks(tmp_root_path, hook_fail)
+ end
- expect(gitlab_custom_hook.update('master', '', '')).to be_true
+ it "returns false" do
+ stub_const("ROOT_PATH", tmp_root_path)
+ expect(gitlab_custom_hook.pre_receive(changes)).to eq(false)
+ expect(gitlab_custom_hook.update(ref_name, old_value, new_value)).to eq(false)
+ expect(gitlab_custom_hook.post_receive(changes)).to eq(false)
end
+
+ it "executes the relevant hooks" do
+ expect(gitlab_custom_hook).to receive(:call_receive_hook)
+ .with(hook_path(tmp_repo_path, "pre-receive"), changes)
+ .and_call_original
+ expect(gitlab_custom_hook).to receive(:call_receive_hook)
+ .with(hook_path(tmp_root_path, "pre-receive"), changes)
+ .and_call_original
+ expect(gitlab_custom_hook).to receive(:system)
+ .with(vars, hook_path(tmp_repo_path, "update"), ref_name, old_value, new_value)
+ .and_call_original
+ expect(gitlab_custom_hook).to receive(:system)
+ .with(vars, hook_path(tmp_root_path, "update"), ref_name, old_value, new_value)
+ .and_call_original
+ expect(gitlab_custom_hook).to receive(:call_receive_hook)
+ .with(hook_path(tmp_repo_path, "post-receive"), changes)
+ .and_call_original
+ expect(gitlab_custom_hook).to receive(:call_receive_hook)
+ .with(hook_path(tmp_root_path, "post-receive"), changes)
+ .and_call_original
+
+ stub_const("ROOT_PATH", tmp_root_path)
+ gitlab_custom_hook.pre_receive(changes)
+ gitlab_custom_hook.update(ref_name, old_value, new_value)
+ gitlab_custom_hook.post_receive(changes)
+ end
+ end
+
+ def hook_path(path, name)
+ File.join(path, 'custom_hooks', name)
+ end
+
+ def create_hook(path, name, which)
+ FileUtils.ln_sf(which, hook_path(path, name))
+ end
+
+ def create_hooks(path, which)
+ create_hook(path, 'pre-receive', which)
+ create_hook(path, 'update', which)
+ create_hook(path, 'post-receive', which)
end
end
diff --git a/spec/support/hook_fail b/spec/support/hook_fail
new file mode 100755
index 0000000..4420796
--- /dev/null
+++ b/spec/support/hook_fail
@@ -0,0 +1,3 @@
+#!/bin/bash
+#echo "fail: $0"
+exit 1
diff --git a/spec/support/hook_ok b/spec/support/hook_ok
new file mode 100755
index 0000000..eb1e3bc
--- /dev/null
+++ b/spec/support/hook_ok
@@ -0,0 +1,3 @@
+#!/bin/bash
+#echo "ok: $0"
+exit 0