150 lines
4 KiB
Ruby
150 lines
4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Git::TagHooksService, :service do
|
|
let(:user) { create(:user) }
|
|
let(:project) { create(:project, :repository) }
|
|
|
|
let(:oldrev) { Gitlab::Git::BLANK_SHA }
|
|
let(:newrev) { "8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b" } # gitlab-test: git rev-parse refs/tags/v1.1.0
|
|
let(:ref) { "refs/tags/#{tag_name}" }
|
|
let(:tag_name) { 'v1.1.0' }
|
|
|
|
let(:tag) { project.repository.find_tag(tag_name) }
|
|
let(:commit) { tag.dereferenced_target }
|
|
|
|
let(:service) do
|
|
described_class.new(project, user, change: { oldrev: oldrev, newrev: newrev, ref: ref })
|
|
end
|
|
|
|
describe 'System hooks' do
|
|
it 'executes system hooks' do
|
|
push_data = service.send(:push_data)
|
|
expect(project).to receive(:has_active_hooks?).and_return(true)
|
|
|
|
expect_next_instance_of(SystemHooksService) do |system_hooks_service|
|
|
expect(system_hooks_service)
|
|
.to receive(:execute_hooks)
|
|
.with(push_data, :tag_push_hooks)
|
|
end
|
|
|
|
service.execute
|
|
end
|
|
end
|
|
|
|
describe "Webhooks" do
|
|
it "executes hooks on the project" do
|
|
expect(project).to receive(:has_active_hooks?).and_return(true)
|
|
expect(project).to receive(:execute_hooks)
|
|
|
|
service.execute
|
|
end
|
|
end
|
|
|
|
describe "Pipelines" do
|
|
before do
|
|
stub_ci_pipeline_to_return_yaml_file
|
|
project.add_developer(user)
|
|
end
|
|
|
|
it "creates a new pipeline" do
|
|
expect { service.execute }.to change { Ci::Pipeline.count }
|
|
|
|
expect(Ci::Pipeline.last).to be_push
|
|
end
|
|
end
|
|
|
|
describe 'Push data' do
|
|
shared_examples_for 'tag push data expectations' do
|
|
subject(:push_data) { service.send(:push_data) }
|
|
|
|
it 'has expected push data attributes' do
|
|
is_expected.to match a_hash_including(
|
|
object_kind: 'tag_push',
|
|
ref: ref,
|
|
before: oldrev,
|
|
after: newrev,
|
|
message: tag.message,
|
|
user_id: user.id,
|
|
user_name: user.name,
|
|
project_id: project.id
|
|
)
|
|
end
|
|
|
|
context "with repository data" do
|
|
subject { push_data[:repository] }
|
|
|
|
it 'has expected repository attributes' do
|
|
is_expected.to match a_hash_including(
|
|
name: project.name,
|
|
url: project.url_to_repo,
|
|
description: project.description,
|
|
homepage: project.web_url
|
|
)
|
|
end
|
|
end
|
|
|
|
context "with commits" do
|
|
subject { push_data[:commits] }
|
|
|
|
it { is_expected.to be_an(Array) }
|
|
|
|
it 'has 1 element' do
|
|
expect(subject.size).to eq(1)
|
|
end
|
|
|
|
context "the commit" do
|
|
subject { push_data[:commits].first }
|
|
|
|
it { is_expected.to include(timestamp: commit.date.xmlschema) }
|
|
|
|
it 'has expected commit attributes' do
|
|
is_expected.to match a_hash_including(
|
|
id: commit.id,
|
|
message: commit.safe_message,
|
|
url: [
|
|
Gitlab.config.gitlab.url,
|
|
project.namespace.to_param,
|
|
project.to_param,
|
|
'-',
|
|
'commit',
|
|
commit.id
|
|
].join('/')
|
|
)
|
|
end
|
|
|
|
context "with an author" do
|
|
subject { push_data[:commits].first[:author] }
|
|
|
|
it 'has expected author attributes' do
|
|
is_expected.to match a_hash_including(
|
|
name: commit.author_name,
|
|
email: commit.author_email
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'annotated tag' do
|
|
include_examples 'tag push data expectations'
|
|
end
|
|
|
|
context 'lightweight tag' do
|
|
let(:tag_name) { 'light-tag' }
|
|
let(:newrev) { '5937ac0a7beb003549fc5fd26fc247adbce4a52e' }
|
|
|
|
before do
|
|
# Create the lightweight tag
|
|
rugged_repo(project.repository).tags.create(tag_name, newrev)
|
|
|
|
# Clear tag list cache
|
|
project.repository.expire_tags_cache
|
|
end
|
|
|
|
include_examples 'tag push data expectations'
|
|
end
|
|
end
|
|
end
|