spec/lib/jenkinsfile_runner/commands/init_spec.rb (179 lines of code) (raw):

require 'spec_helper' require 'securerandom' RSpec.describe JenkinsfileRunner::Commands::Init do before(:example, :filesystem) do @filesystem_dir = Pathname("/tmp/#{SecureRandom.uuid}").tap(&:mkpath) end after(:example, :filesystem) do @filesystem_dir.rmtree if @filesystem_dir.exist? end subject(:init) { described_class.new(argv) } let(:argv) { [] } it { is_expected.to respond_to(:run) } context 'with known arguments' do let(:argv) do [ '--jfr-version', '1.2.3', '--jenkins-home', '/var/jenkins_home', '--jenkins-war', '/usr/share/jenkins/jenkins.war', '--jenkins-plugins', '/app/jenkins_home/plugins/plugins.txt', '--agent-type', 'docker', '--build-output', 'path/to/output', ] end it 'parses configuration' do expect(subject.configuration) .to have_attributes( jfr_version: '1.2.3', jenkins_home: '/var/jenkins_home', jenkins_war: '/usr/share/jenkins/jenkins.war', jenkins_plugins: '/app/jenkins_home/plugins/plugins.txt', agent_type: :docker, build_output: 'path/to/output') end end context 'with unknown arguments' do let(:argv) do ['--errors', 'no'] end it 'raises an exception' do expect { subject}.to raise_error(OptionParser::InvalidOption) end end describe '#run' do describe 'output directory', :filesystem do subject(:create_output_directory) { init.send(:create_output_directory) } let(:path) { build_dir } let(:argv) { [ '--build-output', path.to_s ] } it 'creates the output directory' do expect { create_output_directory }.to change { path.exist? } end end describe '/app/bin/jenkinsfile-runner', :filesystem do let(:path) { create_dir } let(:destination_file) { path.join('jenkinsfile-runner') } let(:argv) { [ '--build-output', path.to_s ] } subject(:create_jenkinsfile_runner_executable) do init.send(:create_jenkinsfile_runner_executable) end it 'creates jenkinsfile-runner file' do expect { create_jenkinsfile_runner_executable }.to change { destination_file.exist? } end context 'with default jenkins plugins settings' do it 'uses the default path' do create_jenkinsfile_runner_executable expect(destination_file.read).to include('--plugins /app/jenkins_home/plugins/') end end context 'with custom jenkins plugins file', :filesystem do let(:input_path) { create_dir } let(:plugins_path) { create_file('file.txt', dir: input_path) } let(:argv) { [ '--build-output', path.to_s, '--jenkins-plugins', plugins_path.to_s ] } it 'uses the custom file' do create_jenkinsfile_runner_executable expect(destination_file.read).to include('--plugins /app/jenkins_plugins/file.txt') end end context 'with custom jenkins plugins directory' do let(:argv) { [ '--build-output', path.to_s, '--jenkins-plugins', '/tmp/plugins_dir' ] } it 'uses the custom directory' do create_jenkinsfile_runner_executable expect(destination_file.read).to include('--plugins /app/jenkins_plugins') end end end describe '/app/jenkins_home', :filesystem do subject(:copy_jenkins_home_directory) { init.send(:copy_jenkins_home_directory) } let(:home_path) { create_dir } let(:out_path) { create_dir } let(:argv) { [ '--jenkins-home', home_path.to_s, '--build-output', out_path.to_s ] } it 'copies the home directory' do expect { copy_jenkins_home_directory }.to change { out_path.join('jenkins_home').exist? } end end describe '/app/bin/jenkins.war', :filesystem do subject(:copy_jenkins_war_file) { init.send(:copy_jenkins_war_file) } let(:home_path) { create_dir } let(:out_path) { create_dir } let(:war_path) { create_file('jenkins.war', dir: home_path) } let(:argv) { [ '--jenkins-war', war_path.to_s, '--build-output', out_path.to_s ] } it 'copies the home directory' do expect { copy_jenkins_war_file }.to change { out_path.join('jenkins.war').exist? } end end describe 'custom jenkins plugins', :filesystem do subject(:copy_jenkins_plugins_file) { init.send(:copy_jenkins_plugins_file) } let(:home_path) { create_dir } let(:out_path) { create_dir } let(:argv) { [ '--jenkins-plugins', plugins_path.to_s, '--build-output', out_path.to_s ] } context 'with plugins file' do let(:plugins_path) { create_file('plugins.txt', dir: home_path) } it 'copies the plugins file' do expect { copy_jenkins_plugins_file }.to change { out_path.join('jenkins_plugins', 'plugins.txt').exist? } end end context 'with plugins directory' do let(:plugins_path) { home_path.join('plugins_dir').tap(&:mkpath) } before do 3.times { |index| create_file("plugin_#{index}.txt", dir: plugins_path) } end it 'copies the plugins directory' do expect { copy_jenkins_plugins_file }.to change { out_path.join('jenkins_plugins').exist? } end it 'copies the plugins files', :aggregate_failures do copy_jenkins_plugins_file 3.times do |index| expect(out_path.join('jenkins_plugins', "plugin_#{index}.txt")).to be_exist end end end end describe 'Dockerfile', :filesystem do let(:path) { create_dir } let(:dockerfile_path) { path.join('Dockerfile') } let(:argv) { [ '--build-output', path.to_s, '--jfr-version', '1.2.3' ] } subject(:create_docker_file) do init.send(:create_docker_file) end it 'creates Dockerfile' do expect { create_docker_file }.to change { dockerfile_path.exist? } end context 'with --agent-type docker' do let(:argv) { ['--build-output', path.to_s, '--agent-type', 'docker', '--jfr-version', '1.2.3'] } it 'creates jenkinsfile-runner file' do create_docker_file expect(dockerfile_path.read).to include('apt install -y docker-ce-cli') end end context 'with --jfr-version 1.2.3' do let(:argv) { ['--build-output', path.to_s, '--jfr-version', '1.2.3'] } it 'creates jenkinsfile-runner file' do create_docker_file expect(dockerfile_path.read).to include('jenkinsfile-runner/1.2.3/jenkinsfile-runner-1.2.3.jar') end end end describe 'ignore files', :filesystem do let(:out_path) { create_dir } let(:argv) { ['--build-output', out_path.to_s] } subject(:create_ignore_files) do init.send(:create_ignore_files) end it 'creates a dockerignore file' do expect { create_ignore_files }.to change { out_path.join('.dockerignore').exist? } end it 'creates a gitignore file' do expect { create_ignore_files }.to change { out_path.join('.gitignore').exist? } end end end def build_dir(name = SecureRandom.uuid) @filesystem_dir.join(name) end def create_dir(name = SecureRandom.uuid) build_dir(name).tap(&:mkpath) end def create_file(name, body: "", dir:) dir.join(name).tap { |path| path.write(body) } end end