spec/gitlab/qa/component/project_importer_spec.rb (75 lines of code) (raw):

# frozen_string_literal: true # spec/lib/gitlab/qa/component/project_importer_spec.rb require 'spec_helper' module Gitlab module QA describe Component::ProjectImporter do let(:project_url) { 'https://example.com/project.git' } let(:project_name) { 'test-project' } let(:project_path) { 'custom-path' } 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") ) end subject { described_class.new(project_url, project_name, project_path: project_path) } describe '#initialize' do it 'sets instance variables correctly' do importer = described_class.new(project_url, project_name) expect(importer.instance_variable_get(:@project_url)).to eq(project_url) expect(importer.instance_variable_get(:@project_name)).to eq(project_name) expect(importer.instance_variable_get(:@project_path)).to eq(project_name) end it 'allows custom project path' do importer = described_class.new(project_url, project_name, project_path: project_path) expect(importer.instance_variable_get(:@project_path)).to eq(project_path) end end describe '#import_project' do before do allow(gitlab).to receive_messages(docker: docker, name: 'gitlab-instance') allow(docker).to receive(:exec).and_return('Import successful') end it 'executes import command via docker' do expected_command = subject.send(:build_import_command, subject.send(:create_import_script), project_url, project_name, project_path) expect(docker).to receive(:exec).with('gitlab-instance', expected_command) subject.import_project(gitlab) end end describe '#build_import_command' do let(:script) { "puts 'test'" } let(:expected_url) { 'https://example.com/test.git' } let(:expected_name) { 'foo' } let(:expected_path) { 'bar' } it 'builds correct import command' do command = subject.send(:build_import_command, script, expected_url, expected_name, expected_path) expect(command).to include("PROJECT_URL='#{expected_url}'") expect(command).to include("PROJECT_NAME='#{expected_name}'") expect(command).to include("PROJECT_PATH='#{expected_path}'") expect(command).to include('gitlab-rails runner') expect(command).to include(script.gsub("'", "\\\\'")) end it 'properly escapes single quotes' do script_with_quotes = "puts 'test's test'" command = subject.send(:build_import_command, script_with_quotes, expected_url, expected_name, expected_path) expect(command).to include("\\'test\\'s test\\'") end end describe '#create_import_script' do it 'generates a valid Ruby script' do script = subject.send(:create_import_script) expect(script).to include('require \'timeout\'') expect(script).to include('Projects::CreateService') expect(script).to include('Timeout.timeout(300)') end it 'includes error handling' do script = subject.send(:create_import_script) expect(script).to include('rescue Timeout::Error') end end end end end