220 lines
6.2 KiB
Ruby
220 lines
6.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe PushEventPayloadService do
|
|
let(:event) { create(:push_event) }
|
|
|
|
describe '#execute' do
|
|
let(:push_data) do
|
|
{
|
|
commits: [
|
|
{
|
|
id: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
|
|
message: 'This is a commit'
|
|
}
|
|
],
|
|
before: '0000000000000000000000000000000000000000',
|
|
after: '1cf19a015df3523caf0a1f9d40c98a267d6a2fc2',
|
|
total_commits_count: 1,
|
|
ref: 'refs/heads/my-branch'
|
|
}
|
|
end
|
|
|
|
it 'creates a new PushEventPayload row' do
|
|
payload = described_class.new(event, push_data).execute
|
|
|
|
expect(payload.commit_count).to eq(1)
|
|
expect(payload.action).to eq('created')
|
|
expect(payload.ref_type).to eq('branch')
|
|
expect(payload.commit_from).to be_nil
|
|
expect(payload.commit_to).to eq(push_data[:after])
|
|
expect(payload.ref).to eq('my-branch')
|
|
expect(payload.commit_title).to eq('This is a commit')
|
|
expect(payload.event_id).to eq(event.id)
|
|
end
|
|
|
|
it 'sets the push_event_payload association of the used event' do
|
|
payload = described_class.new(event, push_data).execute
|
|
|
|
expect(event.push_event_payload).to eq(payload)
|
|
end
|
|
end
|
|
|
|
describe '#commit_title' do
|
|
it 'returns nil if no commits were pushed' do
|
|
service = described_class.new(event, commits: [])
|
|
|
|
expect(service.commit_title).to be_nil
|
|
end
|
|
|
|
it 'returns a String limited to 70 characters' do
|
|
service = described_class.new(event, commits: [{ message: 'a' * 100 }])
|
|
|
|
expect(service.commit_title).to eq(('a' * 67) + '...')
|
|
end
|
|
|
|
it 'does not truncate the commit message if it is shorter than 70 characters' do
|
|
service = described_class.new(event, commits: [{ message: 'Hello' }])
|
|
|
|
expect(service.commit_title).to eq('Hello')
|
|
end
|
|
|
|
it 'includes the first line of a commit message if the message spans multiple lines' do
|
|
service = described_class
|
|
.new(event, commits: [{ message: "Hello\n\nworld" }])
|
|
|
|
expect(service.commit_title).to eq('Hello')
|
|
end
|
|
end
|
|
|
|
describe '#commit_from_id' do
|
|
it 'returns nil when creating a new ref' do
|
|
service = described_class.new(event, before: Gitlab::Git::BLANK_SHA)
|
|
|
|
expect(service.commit_from_id).to be_nil
|
|
end
|
|
|
|
it 'returns the ID of the first commit when pushing to an existing ref' do
|
|
service = described_class.new(event, before: '123')
|
|
|
|
expect(service.commit_from_id).to eq('123')
|
|
end
|
|
end
|
|
|
|
describe '#commit_to_id' do
|
|
it 'returns nil when removing an existing ref' do
|
|
service = described_class.new(event, after: Gitlab::Git::BLANK_SHA)
|
|
|
|
expect(service.commit_to_id).to be_nil
|
|
end
|
|
end
|
|
|
|
describe '#commit_count' do
|
|
it 'returns the number of commits' do
|
|
service = described_class.new(event, total_commits_count: 1)
|
|
|
|
expect(service.commit_count).to eq(1)
|
|
end
|
|
|
|
it 'raises when the push data does not contain the commits count' do
|
|
service = described_class.new(event, {})
|
|
|
|
expect { service.commit_count }.to raise_error(KeyError)
|
|
end
|
|
end
|
|
|
|
describe '#ref' do
|
|
it 'returns the name of the ref' do
|
|
service = described_class.new(event, ref: 'refs/heads/foo')
|
|
|
|
expect(service.ref).to eq('refs/heads/foo')
|
|
end
|
|
|
|
it 'raises when the push data does not contain the ref name' do
|
|
service = described_class.new(event, {})
|
|
|
|
expect { service.ref }.to raise_error(KeyError)
|
|
end
|
|
end
|
|
|
|
describe '#revision_before' do
|
|
it 'returns the revision from before the push' do
|
|
service = described_class.new(event, before: 'foo')
|
|
|
|
expect(service.revision_before).to eq('foo')
|
|
end
|
|
|
|
it 'raises when the push data does not contain the before revision' do
|
|
service = described_class.new(event, {})
|
|
|
|
expect { service.revision_before }.to raise_error(KeyError)
|
|
end
|
|
end
|
|
|
|
describe '#revision_after' do
|
|
it 'returns the revision from after the push' do
|
|
service = described_class.new(event, after: 'foo')
|
|
|
|
expect(service.revision_after).to eq('foo')
|
|
end
|
|
|
|
it 'raises when the push data does not contain the after revision' do
|
|
service = described_class.new(event, {})
|
|
|
|
expect { service.revision_after }.to raise_error(KeyError)
|
|
end
|
|
end
|
|
|
|
describe '#trimmed_ref' do
|
|
it 'returns the ref name without its prefix' do
|
|
service = described_class.new(event, ref: 'refs/heads/foo')
|
|
|
|
expect(service.trimmed_ref).to eq('foo')
|
|
end
|
|
end
|
|
|
|
describe '#create?' do
|
|
it 'returns true when creating a new ref' do
|
|
service = described_class.new(event, before: Gitlab::Git::BLANK_SHA)
|
|
|
|
expect(service.create?).to eq(true)
|
|
end
|
|
|
|
it 'returns false when pushing to an existing ref' do
|
|
service = described_class.new(event, before: 'foo')
|
|
|
|
expect(service.create?).to eq(false)
|
|
end
|
|
end
|
|
|
|
describe '#remove?' do
|
|
it 'returns true when removing an existing ref' do
|
|
service = described_class.new(event, after: Gitlab::Git::BLANK_SHA)
|
|
|
|
expect(service.remove?).to eq(true)
|
|
end
|
|
|
|
it 'returns false pushing to an existing ref' do
|
|
service = described_class.new(event, after: 'foo')
|
|
|
|
expect(service.remove?).to eq(false)
|
|
end
|
|
end
|
|
|
|
describe '#action' do
|
|
it 'returns :created when creating a ref' do
|
|
service = described_class.new(event, before: Gitlab::Git::BLANK_SHA)
|
|
|
|
expect(service.action).to eq(:created)
|
|
end
|
|
|
|
it 'returns :removed when removing an existing ref' do
|
|
service = described_class.new(event,
|
|
before: '123',
|
|
after: Gitlab::Git::BLANK_SHA)
|
|
|
|
expect(service.action).to eq(:removed)
|
|
end
|
|
|
|
it 'returns :pushed when pushing to an existing ref' do
|
|
service = described_class.new(event, before: '123', after: '456')
|
|
|
|
expect(service.action).to eq(:pushed)
|
|
end
|
|
end
|
|
|
|
describe '#ref_type' do
|
|
it 'returns :tag for a tag' do
|
|
service = described_class.new(event, ref: 'refs/tags/1.2')
|
|
|
|
expect(service.ref_type).to eq(:tag)
|
|
end
|
|
|
|
it 'returns :branch for a branch' do
|
|
service = described_class.new(event, ref: 'refs/heads/master')
|
|
|
|
expect(service.ref_type).to eq(:branch)
|
|
end
|
|
end
|
|
end
|