spec/gitlab/qa/component/runner_ops_spec.rb (119 lines of code) (raw):
# frozen_string_literal: true
# spec/lib/gitlab/qa/component/runner_ops_spec.rb
require 'spec_helper'
require 'securerandom'
require 'gitlab/qa/component/gitlab'
module Gitlab
module QA
describe Component::RunnerOps do
let(:runner_ops) { described_class.new }
let(:docker) { instance_double(Gitlab::QA::Docker::Engine) }
let(:gitlab) do
instance_double(
Gitlab::QA::Component::Gitlab,
address: "http://gitlab.example.com",
class: Struct.new(:name).new("Gitlab::QA::Component::Gitlab")
).tap do |gitlab|
allow(gitlab).to receive_messages(docker: docker, name: 'gitlab-instance', network: 'test-network', address: 'http://gitlab.example.com')
end
end
let(:token) { 'abc123def456' }
before do
allow(SecureRandom).to receive(:hex).and_return(token)
end
describe '#setup_runner' do
it 'sets up a runner by generating token and performing required operations' do
expect(runner_ops).to receive(:add_runner_to_gitlab).with(gitlab, token)
expect(runner_ops).to receive(:register_docker_runner).with(gitlab, token)
runner_ops.setup_runner(gitlab)
end
end
describe '#add_runner_to_gitlab' do
it 'executes runner creation command in gitlab container' do
expected_command = runner_ops.send(:create_runner_command, token)
expect(gitlab.docker).to receive(:exec).with(
gitlab.name,
expected_command,
mask_secrets: token
)
runner_ops.send(:add_runner_to_gitlab, gitlab, token)
end
end
describe '#create_runner_command' do
it 'generates correct runner creation command' do
command = runner_ops.send(:create_runner_command, token)
expect(command).to include(described_class::RUNNER_DESCRIPTION)
expect(command).to include(token)
expect(command).to include('runner_type: :instance_type')
end
end
describe '#register_docker_runner' do
let(:runner_name) { 'test-runner-1234' }
before do
allow(runner_ops).to receive(:generate_runner_name).and_return(runner_name)
allow(runner_ops).to receive(:shell)
end
it 'executes docker command with correct parameters' do
expected_command = runner_ops.send(:build_docker_command,
runner_name: runner_name,
network: gitlab.network,
address: gitlab.address,
token: token
)
expect(runner_ops).to receive(:shell).with(expected_command, mask_secrets: [token])
runner_ops.send(:register_docker_runner, gitlab, token)
end
end
describe '#build_docker_command' do
let(:runner_name) { 'test-runner-1234' }
it 'builds correct docker command' do
command = runner_ops.send(:build_docker_command,
runner_name: runner_name,
network: gitlab.network,
address: gitlab.address,
token: token
)
expect(command).to include(described_class::DOCKER_IMAGE)
expect(command).to include(runner_name)
expect(command).to include(gitlab.network)
end
end
describe '#build_registration_args' do
let(:runner_name) { 'test-runner-1234' }
it 'builds registration arguments with correct parameters' do
args = runner_ops.send(:build_registration_args,
name: runner_name,
address: gitlab.address,
token: token,
network: gitlab.network
)
expect(args).to include("--name #{runner_name}")
expect(args).to include("--url #{gitlab.address}")
expect(args).to include("--token #{token}")
expect(args).to include("--docker-image #{described_class::BUILD_IMAGE}")
expect(args).to include("--docker-network-mode=#{gitlab.network}")
end
end
describe '#runner_config' do
it 'generates valid runner configuration' do
config = runner_ops.send(:runner_config)
expect(config).to include('concurrent = 1')
expect(config).to include('check_interval = 0')
expect(config).to include('session_timeout = 1800')
end
end
describe '#register_command' do
let(:runner_name) { 'test-runner-1234' }
it 'generates valid registration command' do
command = runner_ops.send(:register_command,
runner_name,
gitlab.address,
token,
gitlab.network
)
expect(command).to include('gitlab-runner register')
expect(command).to include('gitlab-runner run')
expect(command).to include("printf 'concurrent = 1\\ncheck_interval = 0\\n\\n[session_server]\\n session_timeout = 1800' > /etc/gitlab-runner/config.toml")
end
end
end
end
end