summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/gitaly_client/remote_service_spec.rb
blob: 70fc4fe4416749e08c1f8d49911fcc3d5956a393 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::GitalyClient::RemoteService do
  let(:project) { create(:project) }
  let(:storage_name) { project.repository_storage }
  let(:relative_path) { project.disk_path + '.git' }
  let(:remote_name) { 'my-remote' }
  let(:client) { described_class.new(project.repository) }

  describe '#add_remote' do
    let(:url) { 'http://my-repo.git' }
    let(:mirror_refmap) { :all_refs }

    it 'sends an add_remote message' do
      expect_any_instance_of(Gitaly::RemoteService::Stub)
        .to receive(:add_remote)
        .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
        .and_return(double(:add_remote_response))

      client.add_remote(remote_name, url, mirror_refmap)
    end
  end

  describe '#remove_remote' do
    it 'sends an remove_remote message and returns the result value' do
      expect_any_instance_of(Gitaly::RemoteService::Stub)
        .to receive(:remove_remote)
        .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
        .and_return(double(result: true))

      expect(client.remove_remote(remote_name)).to be(true)
    end
  end

  describe '#find_remote_root_ref' do
    let(:remote) { 'origin' }
    let(:url) { 'http://git.example.com/my-repo.git' }
    let(:auth) { 'Basic secret' }

    shared_examples 'a find_remote_root_ref call' do
      it 'sends an find_remote_root_ref message and returns the root ref' do
        expect_any_instance_of(Gitaly::RemoteService::Stub)
          .to receive(:find_remote_root_ref)
          .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
          .with(gitaly_request_with_params(expected_params), kind_of(Hash))
          .and_return(double(ref: 'master'))

        expect(client.find_remote_root_ref(remote, url, auth)).to eq 'master'
      end

      it 'ensure ref is a valid UTF-8 string' do
        expect_any_instance_of(Gitaly::RemoteService::Stub)
          .to receive(:find_remote_root_ref)
          .with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
          .with(gitaly_request_with_params(expected_params), kind_of(Hash))
          .and_return(double(ref: "an_invalid_ref_\xE5"))

        expect(client.find_remote_root_ref(remote, url, auth)).to eq "an_invalid_ref_å"
      end
    end

    context 'with inmemory feature enabled' do
      before do
        stub_feature_flags(find_remote_root_refs_inmemory: true)
      end

      it_behaves_like 'a find_remote_root_ref call' do
        let(:expected_params) { { remote_url: url, http_authorization_header: auth } }
      end
    end

    context 'with inmemory feature disabled' do
      before do
        stub_feature_flags(find_remote_root_refs_inmemory: false)
      end

      it_behaves_like 'a find_remote_root_ref call' do
        let(:expected_params) { { remote: remote } }
      end
    end
  end

  describe '#update_remote_mirror' do
    let(:ref_name) { 'remote_mirror_1' }
    let(:only_branches_matching) { %w[my-branch master] }
    let(:ssh_key) { 'KEY' }
    let(:known_hosts) { 'KNOWN HOSTS' }

    it 'sends an update_remote_mirror message' do
      expect_any_instance_of(Gitaly::RemoteService::Stub)
        .to receive(:update_remote_mirror)
        .with(kind_of(Enumerator), kind_of(Hash))
        .and_return(double(:update_remote_mirror_response))

      client.update_remote_mirror(ref_name, only_branches_matching, ssh_key: ssh_key, known_hosts: known_hosts, keep_divergent_refs: true)
    end
  end

  describe '.exists?' do
    context "when the remote doesn't exist" do
      let(:url) { 'https://gitlab.com/gitlab-org/ik-besta-niet-of-ik-word-geplaagd.git' }
      let(:storage_name) { 'default' }

      it 'returns false' do
        expect(Gitaly::FindRemoteRepositoryRequest).to receive(:new).with(remote: url, storage_name: storage_name).and_call_original

        expect(described_class.exists?(url)).to be(false)
      end
    end
  end
end