gitlab-ce/spec/models/ci/pipeline_creation/requests_spec.rb

124 lines
3.7 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Ci::PipelineCreation::Requests, :clean_gitlab_redis_shared_state, feature_category: :pipeline_composition do
let_it_be(:merge_request) { create(:merge_request) }
describe '.failed' do
context 'when given a pipeline creation key and ID' do
it 'sets the pipeline creation to the failed status' do
request = described_class.start_for_merge_request(merge_request)
described_class.failed(request)
expect(read(request)).to eq({ 'status' => 'failed' })
end
end
context 'when given nil' do
it 'returns nil' do
expect(described_class.failed(nil)).to be_nil
end
end
end
describe '.succeeded' do
context 'when given a pipeline creation key and ID' do
it 'sets the pipeline creation to the succeeded status' do
request = described_class.start_for_merge_request(merge_request)
described_class.succeeded(request)
expect(read(request)).to eq({ 'status' => 'succeeded' })
end
end
context 'when given nil' do
it 'returns nil' do
expect(described_class.succeeded(nil)).to be_nil
end
end
end
describe '.start_for_merge_request' do
it 'stores a pipeline creation for the merge request and returns its key and ID' do
allow(SecureRandom).to receive(:uuid).and_return('test-id')
request = described_class.start_for_merge_request(merge_request)
allow(SecureRandom).to receive(:uuid).and_return('test-id-2')
request2 = described_class.start_for_merge_request(merge_request)
described_class.succeeded(request)
expect(request).to eq({
'key' => described_class.merge_request_key(merge_request),
'id' => 'test-id'
})
expect(read(request)).to eq({ 'status' => 'succeeded' })
expect(read(request2)).to eq({ 'status' => 'in_progress' })
end
end
describe '.pipeline_creating_for_merge_request?' do
context 'when there are pipeline creations for the merge request' do
it 'returns true' do
described_class.start_for_merge_request(merge_request)
expect(described_class.pipeline_creating_for_merge_request?(merge_request)).to be_truthy
end
end
context 'when there are no pipeline creations for the merge request' do
it 'returns false' do
expect(described_class.pipeline_creating_for_merge_request?(merge_request)).to be_falsey
end
end
end
describe '.hset' do
it 'writes the pipeline creation to the Redis cache' do
request = { 'key' => 'test_key', 'id' => 'test_id' }
described_class.hset(request, 'status')
expect(read(request)).to eq({ 'status' => 'status' })
end
it 'expires the cache after 5 minutes' do
multi = instance_double(Redis::MultiConnection, hset: nil)
Gitlab::Redis::SharedState.with do |redis|
allow(redis).to receive(:multi).and_yield(multi)
expect(multi).to receive(:expire).with('test_key', described_class::REDIS_EXPIRATION_TIME)
request = { 'key' => 'test_key', 'id' => 'test_id' }
described_class.hset(request, 'status')
end
end
end
describe '.merge_request_key' do
it 'returns the Redis cache key for the project' do
expect(described_class.merge_request_key(merge_request)).to eq(
"pipeline_creation:projects:{#{merge_request.project.id}}:mrs:{#{merge_request.id}}"
)
end
end
describe '.generate_id' do
it 'creates a unique ID for the pipeline creation' do
expect(SecureRandom).to receive(:uuid)
described_class.generate_id
end
end
def read(request)
Gitlab::Redis::SharedState.with { |redis| Gitlab::Json.parse(redis.hget(request['key'], request['id'])) }
end
end