shell_spec.rb 5.26 KB
Newer Older
1
require 'spec_helper'
2
require 'stringio'
3

Douwe Maan's avatar
Douwe Maan committed
4
describe Gitlab::Shell, lib: true do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
5
  let(:project) { double('Project', id: 7, path: 'diaspora') }
6
  let(:gitlab_shell) { Gitlab::Shell.new }
7 8

  before do
9
    allow(Project).to receive(:find).and_return(project)
10 11
  end

12 13 14 15 16
  it { is_expected.to respond_to :add_key }
  it { is_expected.to respond_to :remove_key }
  it { is_expected.to respond_to :add_repository }
  it { is_expected.to respond_to :remove_repository }
  it { is_expected.to respond_to :fork_repository }
17 18 19 20
  it { is_expected.to respond_to :add_namespace }
  it { is_expected.to respond_to :rm_namespace }
  it { is_expected.to respond_to :mv_namespace }
  it { is_expected.to respond_to :exists? }
21

22
  it { expect(gitlab_shell.url_to_repo('diaspora')).to eq(Gitlab.config.gitlab_shell.ssh_path_prefix + "diaspora.git") }
23

24
  describe 'memoized secret_token' do
25 26 27 28 29
    let(:secret_file) { 'tmp/tests/.secret_shell_test' }
    let(:link_file) { 'tmp/tests/shell-secret-test/.gitlab_shell_secret' }

    before do
      allow(Gitlab.config.gitlab_shell).to receive(:secret_file).and_return(secret_file)
30
      allow(Gitlab.config.gitlab_shell).to receive(:path).and_return('tmp/tests/shell-secret-test')
31
      FileUtils.mkdir('tmp/tests/shell-secret-test')
32
      Gitlab::Shell.ensure_secret_token!
33 34 35 36 37 38 39 40
    end

    after do
      FileUtils.rm_rf('tmp/tests/shell-secret-test')
      FileUtils.rm_rf(secret_file)
    end

    it 'creates and links the secret token file' do
41 42
      secret_token = Gitlab::Shell.secret_token

43
      expect(File.exist?(secret_file)).to be(true)
44
      expect(File.read(secret_file).chomp).to eq(secret_token)
45 46 47 48 49
      expect(File.symlink?(link_file)).to be(true)
      expect(File.readlink(link_file)).to eq(secret_file)
    end
  end

50 51 52 53 54 55 56
  describe 'projects commands' do
    let(:projects_path) { 'tmp/tests/shell-projects-test/bin/gitlab-projects' }

    before do
      allow(Gitlab.config.gitlab_shell).to receive(:path).and_return('tmp/tests/shell-projects-test')
    end

57
    describe '#mv_repository' do
58
      it 'executes the command' do
Douwe Maan's avatar
Douwe Maan committed
59 60
        expect(Gitlab::Utils).to receive(:system_silent)
          .with([projects_path, 'mv-project', 'storage/path', 'project/path.git', 'new/path.git'])
61 62 63 64
        gitlab_shell.mv_repository('storage/path', 'project/path', 'new/path')
      end
    end

65
    describe '#mv_storage' do
66
      it 'executes the command' do
Douwe Maan's avatar
Douwe Maan committed
67 68
        expect(Gitlab::Utils).to receive(:system_silent)
          .with([projects_path, 'mv-storage', 'current/storage', 'project/path.git', 'new/storage'])
69 70 71
        gitlab_shell.mv_storage('current/storage', 'project/path', 'new/storage')
      end
    end
72 73 74 75

    describe '#fetch_remote' do
      it 'executes the command' do
        expect(Gitlab::Popen).to receive(:popen)
76
          .with([projects_path, 'fetch-remote', 'current/storage', 'project/path.git', 'new/storage', '800']).and_return([nil, 0])
77 78 79 80 81 82

        expect(gitlab_shell.fetch_remote('current/storage', 'project/path', 'new/storage')).to be true
      end

      it 'fails to execute the command' do
        expect(Gitlab::Popen).to receive(:popen)
83
        .with([projects_path, 'fetch-remote', 'current/storage', 'project/path.git', 'new/storage', '800']).and_return(["error", 1])
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

        expect { gitlab_shell.fetch_remote('current/storage', 'project/path', 'new/storage') }.to raise_error(Gitlab::Shell::Error, "error")
      end
    end

    describe '#push_remote_branches' do
      it 'executes the command' do
        expect(Gitlab::Popen).to receive(:popen)
        .with([projects_path, 'push-branches', 'current/storage', 'project/path.git', 'new/storage', '600', 'master']).and_return([nil, 0])

        expect(gitlab_shell.push_remote_branches('current/storage', 'project/path', 'new/storage', ['master'])).to be true
      end

      it 'fails to execute the command' do
        expect(Gitlab::Popen).to receive(:popen)
        .with([projects_path, 'push-branches', 'current/storage', 'project/path.git', 'new/storage', '600', 'master']).and_return(["error", 1])

        expect { gitlab_shell.push_remote_branches('current/storage', 'project/path', 'new/storage', ['master']) }.to raise_error(Gitlab::Shell::Error, "error")
      end
    end
104 105
  end

106 107 108 109 110 111 112 113 114 115 116
  describe '#add_key' do
    it 'removes trailing garbage' do
      allow(gitlab_shell).to receive(:gitlab_shell_keys_path).and_return(:gitlab_shell_keys_path)
      expect(Gitlab::Utils).to receive(:system_silent).with(
        [:gitlab_shell_keys_path, 'add-key', 'key-123', 'ssh-rsa foobar']
      )

      gitlab_shell.add_key('key-123', 'ssh-rsa foobar trailing garbage')
    end
  end

Douwe Maan's avatar
Douwe Maan committed
117
  describe Gitlab::Shell::KeyAdder, lib: true do
118
    describe '#add_key' do
119 120
      it 'removes trailing garbage' do
        io = spy(:io)
121 122
        adder = described_class.new(io)

123 124 125 126 127 128 129 130 131 132
        adder.add_key('key-42', "ssh-rsa foo bar\tbaz")

        expect(io).to have_received(:puts).with("key-42\tssh-rsa foo")
      end

      it 'raises an exception if the key contains a tab' do
        expect do
          described_class.new(StringIO.new).add_key('key-42', "ssh-rsa\tfoobar")
        end.to raise_error(Gitlab::Shell::Error)
      end
133

134 135 136 137
      it 'raises an exception if the key contains a newline' do
        expect do
          described_class.new(StringIO.new).add_key('key-42', "ssh-rsa foobar\nssh-rsa pawned")
        end.to raise_error(Gitlab::Shell::Error)
138 139 140
      end
    end
  end
141
end