120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'spec_helper'
 | 
						|
 | 
						|
class TestHelpersTest
 | 
						|
  include Gitlab::TaskHelpers
 | 
						|
end
 | 
						|
 | 
						|
RSpec.describe Gitlab::TaskHelpers do
 | 
						|
  subject { TestHelpersTest.new }
 | 
						|
 | 
						|
  let(:repo) { 'https://gitlab.com/gitlab-org/gitlab-test.git' }
 | 
						|
  let(:clone_path) { Rails.root.join('tmp/tests/task_helpers_tests').to_s }
 | 
						|
  let(:version) { '1.1.0' }
 | 
						|
  let(:tag) { 'v1.1.0' }
 | 
						|
 | 
						|
  describe '#checkout_or_clone_version' do
 | 
						|
    before do
 | 
						|
      allow(subject).to receive(:run_command!)
 | 
						|
    end
 | 
						|
 | 
						|
    it 'checkout the version and reset to it' do
 | 
						|
      expect(subject).to receive(:get_version).with(version).and_call_original
 | 
						|
      expect(subject).to receive(:checkout_version).with(tag, clone_path)
 | 
						|
 | 
						|
      subject.checkout_or_clone_version(version: version, repo: repo, target_dir: clone_path)
 | 
						|
    end
 | 
						|
 | 
						|
    context "target_dir doesn't exist" do
 | 
						|
      it 'clones the repo' do
 | 
						|
        expect(subject).to receive(:clone_repo).with(repo, clone_path, clone_opts: [])
 | 
						|
 | 
						|
        subject.checkout_or_clone_version(version: version, repo: repo, target_dir: clone_path)
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    context 'target_dir exists' do
 | 
						|
      before do
 | 
						|
        expect(Dir).to receive(:exist?).and_return(true)
 | 
						|
      end
 | 
						|
 | 
						|
      it "doesn't clone the repository" do
 | 
						|
        expect(subject).not_to receive(:clone_repo)
 | 
						|
 | 
						|
        subject.checkout_or_clone_version(version: version, repo: repo, target_dir: clone_path)
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    it 'accepts clone_opts' do
 | 
						|
      expect(subject).to receive(:clone_repo).with(repo, clone_path, clone_opts: %w[--depth 1])
 | 
						|
 | 
						|
      subject.checkout_or_clone_version(version: version, repo: repo, target_dir: clone_path, clone_opts: %w[--depth 1])
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#clone_repo' do
 | 
						|
    it 'clones the repo in the target dir' do
 | 
						|
      expect(subject)
 | 
						|
        .to receive(:run_command!).with(%W[#{Gitlab.config.git.bin_path} clone -- #{repo} #{clone_path}])
 | 
						|
 | 
						|
      subject.clone_repo(repo, clone_path)
 | 
						|
    end
 | 
						|
 | 
						|
    it 'accepts clone_opts' do
 | 
						|
      expect(subject)
 | 
						|
        .to receive(:run_command!).with(%W[#{Gitlab.config.git.bin_path} clone --depth 1 -- #{repo} #{clone_path}])
 | 
						|
 | 
						|
      subject.clone_repo(repo, clone_path, clone_opts: %w[--depth 1])
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#checkout_version' do
 | 
						|
    it 'clones the repo in the target dir' do
 | 
						|
      expect(subject)
 | 
						|
        .to receive(:run_command!).with(%W[#{Gitlab.config.git.bin_path} -C #{clone_path} config protocol.version 2])
 | 
						|
      expect(subject)
 | 
						|
        .to receive(:run_command!).with(%W[#{Gitlab.config.git.bin_path} -C #{clone_path} fetch --quiet origin #{tag}])
 | 
						|
      expect(subject)
 | 
						|
        .to receive(:run_command!).with(%W[#{Gitlab.config.git.bin_path} -C #{clone_path} checkout -f --quiet FETCH_HEAD --])
 | 
						|
 | 
						|
      subject.checkout_version(tag, clone_path)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#run_command' do
 | 
						|
    it 'runs command and return the output' do
 | 
						|
      expect(subject.run_command(%w[echo it works!])).to eq("it works!\n")
 | 
						|
    end
 | 
						|
 | 
						|
    it 'returns empty string when command doesnt exist' do
 | 
						|
      expect(subject.run_command(%w[nonexistentcommand with arguments])).to eq('')
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#run_command!' do
 | 
						|
    it 'runs command and return the output' do
 | 
						|
      expect(subject.run_command!(%w[echo it works!])).to eq("it works!\n")
 | 
						|
    end
 | 
						|
 | 
						|
    it 'returns and exception when command exit with non zero code' do
 | 
						|
      expect { subject.run_command!(['bash', '-c', 'exit 1']) }.to raise_error Gitlab::TaskFailedError
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#get_version' do
 | 
						|
    using RSpec::Parameterized::TableSyntax
 | 
						|
 | 
						|
    where(:version, :result) do
 | 
						|
      '1.1.1'                                    | 'v1.1.1'
 | 
						|
      'master'                                   | 'master'
 | 
						|
      '12.4.0-rc7'                               | 'v12.4.0-rc7'
 | 
						|
      '594c3ea3e0e5540e5915bd1c49713a0381459dd6' | '594c3ea3e0e5540e5915bd1c49713a0381459dd6'
 | 
						|
    end
 | 
						|
 | 
						|
    with_them do
 | 
						|
      it { expect(subject.get_version(version)).to eq(result) }
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |