diff options
author | Dirk Hörner <dirker@gmail.com> | 2016-09-09 13:57:21 +0200 |
---|---|---|
committer | Sean McGivern <sean@gitlab.com> | 2016-12-01 11:40:11 +0000 |
commit | c5cf54392a8853c07352a54f94a754a61259124f (patch) | |
tree | 0f9a85c3e5ac056fbc44196924f8682158bd0661 | |
parent | 0e409ee49b1d68ea949da2d0504f325439ad53b3 (diff) | |
download | gitlab-shell-c5cf54392a8853c07352a54f94a754a61259124f.tar.gz |
spec: add tests for global custom hooks
-rw-r--r-- | spec/gitlab_custom_hook_spec.rb | 174 | ||||
-rwxr-xr-x | spec/support/hook_fail | 3 | ||||
-rwxr-xr-x | spec/support/hook_ok | 3 |
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 |