summaryrefslogtreecommitdiff
path: root/spec/presenters/projects/settings/deploy_keys_presenter_spec.rb
blob: 0d340c5e713bf08b6182c9f590d48b28f9175f21 (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Projects::Settings::DeployKeysPresenter do
  let_it_be(:project, refind: true) { create(:project) }
  let_it_be(:other_project) { create(:project) }
  let_it_be(:user) { create(:user) }

  subject(:presenter) do
    described_class.new(project, current_user: user)
  end

  before_all do
    project.add_maintainer(user)
    other_project.add_maintainer(user)
  end

  it 'inherits from Gitlab::View::Presenter::Simple' do
    expect(described_class.superclass).to eq(Gitlab::View::Presenter::Simple)
  end

  describe 'deploy key groups' do
    let_it_be(:deploy_key) { create(:deploy_key, projects: [project]) }
    let_it_be(:other_deploy_key) { create(:deploy_key, projects: [other_project]) }
    let_it_be(:public_deploy_key) { create(:deploy_key, public: true) }
    let_it_be(:unrelated_project) { create(:project, :private) }
    let_it_be(:unrelated_deploy_key) { create(:deploy_key, projects: [unrelated_project]) }

    context 'with enabled keys' do
      it 'returns correct deploy keys' do
        expect(presenter.enabled_keys).to eq([deploy_key])
        expect(presenter.enabled_keys_size).to eq(1)
      end
    end

    context 'with available keys' do
      it 'returns correct deploy keys' do
        expect(presenter.available_keys).to eq([other_deploy_key, public_deploy_key])
      end
    end

    context 'with available project keys' do
      it 'returns correct deploy keys' do
        expect(presenter.available_project_keys).to eq([other_deploy_key])
        expect(presenter.available_project_keys_size).to eq(1)
      end
    end

    context 'with available public keys' do
      it 'returns correct deploy keys' do
        expect(presenter.available_public_keys).to eq([public_deploy_key])
        expect(presenter.available_public_keys_size).to eq(1)
      end
    end
  end

  describe '#enabled_keys' do
    let!(:deploy_key) { create(:deploy_key, public: true) }

    let!(:deploy_keys_project) do
      create(:deploy_keys_project, project: project, deploy_key: deploy_key)
    end

    it 'returns currently enabled keys' do
      expect(presenter.enabled_keys).to eq [deploy_keys_project.deploy_key]
    end

    it 'does not contain enabled_keys inside available_keys' do
      expect(presenter.available_keys).not_to include deploy_key
    end

    it 'returns the enabled_keys size' do
      expect(presenter.enabled_keys_size).to eq(1)
    end
  end

  describe '#available_keys/#available_project_keys' do
    let(:other_deploy_key) { create(:another_deploy_key) }

    before do
      project_key = create(:deploy_keys_project, deploy_key: other_deploy_key)
      project_key.project.add_developer(user)
    end

    it 'returns the current available_keys' do
      expect(presenter.available_keys).not_to be_empty
    end

    it 'returns the current available_project_keys' do
      expect(presenter.available_project_keys).not_to be_empty
    end

    it 'returns the available_project_keys size' do
      expect(presenter.available_project_keys_size).to eq(1)
    end
  end

  context 'prevent N + 1 queries' do
    before do
      create_records

      project.add_maintainer(user)
    end

    def create_records
      other_project = create(:project)
      other_project.add_maintainer(user)

      create(:deploy_keys_project, project: project, deploy_key: create(:deploy_key))
      create(:deploy_keys_project, project: other_project, deploy_key: create(:deploy_key))
      create(:deploy_key, public: true)
    end

    def execute_with_query_count
      ActiveRecord::QueryRecorder.new { execute_presenter }.count
    end

    def execute_presenter
      described_class.new(project, current_user: user).as_json
    end

    it 'returns correct counts' do
      result = execute_presenter

      expect(result[:enabled_keys].size).to eq(1)
      expect(result[:available_project_keys].size).to eq(1)
      expect(result[:public_keys].size).to eq(1)
    end

    it 'does not increase the query count' do
      execute_presenter # make sure everything is cached

      count_before = execute_with_query_count

      3.times { create_records }

      count_after = execute_with_query_count

      expect(count_after).to eq(count_before)

      result = execute_presenter
      expect(result[:enabled_keys].size).to eq(4)
      expect(result[:available_project_keys].size).to eq(4)
      expect(result[:public_keys].size).to eq(4)
    end
  end
end