1# frozen_string_literal: true
2
3require 'spec_helper'
4
5RSpec.describe Projects::Settings::DeployKeysPresenter do
6  let_it_be(:project, refind: true) { create(:project) }
7  let_it_be(:other_project) { create(:project) }
8  let_it_be(:user) { create(:user) }
9
10  subject(:presenter) do
11    described_class.new(project, current_user: user)
12  end
13
14  before_all do
15    project.add_maintainer(user)
16    other_project.add_maintainer(user)
17  end
18
19  it 'inherits from Gitlab::View::Presenter::Simple' do
20    expect(described_class.superclass).to eq(Gitlab::View::Presenter::Simple)
21  end
22
23  describe 'deploy key groups' do
24    let_it_be(:deploy_key) { create(:deploy_key, projects: [project]) }
25    let_it_be(:other_deploy_key) { create(:deploy_key, projects: [other_project]) }
26    let_it_be(:public_deploy_key) { create(:deploy_key, public: true) }
27    let_it_be(:unrelated_project) { create(:project, :private) }
28    let_it_be(:unrelated_deploy_key) { create(:deploy_key, projects: [unrelated_project]) }
29
30    context 'with enabled keys' do
31      it 'returns correct deploy keys' do
32        expect(presenter.enabled_keys).to eq([deploy_key])
33        expect(presenter.enabled_keys_size).to eq(1)
34      end
35    end
36
37    context 'with available keys' do
38      it 'returns correct deploy keys' do
39        expect(presenter.available_keys).to eq([other_deploy_key, public_deploy_key])
40      end
41    end
42
43    context 'with available project keys' do
44      it 'returns correct deploy keys' do
45        expect(presenter.available_project_keys).to eq([other_deploy_key])
46        expect(presenter.available_project_keys_size).to eq(1)
47      end
48    end
49
50    context 'with available public keys' do
51      it 'returns correct deploy keys' do
52        expect(presenter.available_public_keys).to eq([public_deploy_key])
53        expect(presenter.available_public_keys_size).to eq(1)
54      end
55    end
56  end
57
58  describe '#enabled_keys' do
59    let!(:deploy_key) { create(:deploy_key, public: true) }
60
61    let!(:deploy_keys_project) do
62      create(:deploy_keys_project, project: project, deploy_key: deploy_key)
63    end
64
65    it 'returns currently enabled keys' do
66      expect(presenter.enabled_keys).to eq [deploy_keys_project.deploy_key]
67    end
68
69    it 'does not contain enabled_keys inside available_keys' do
70      expect(presenter.available_keys).not_to include deploy_key
71    end
72
73    it 'returns the enabled_keys size' do
74      expect(presenter.enabled_keys_size).to eq(1)
75    end
76  end
77
78  describe '#available_keys/#available_project_keys' do
79    let(:other_deploy_key) { create(:another_deploy_key) }
80
81    before do
82      project_key = create(:deploy_keys_project, deploy_key: other_deploy_key)
83      project_key.project.add_developer(user)
84    end
85
86    it 'returns the current available_keys' do
87      expect(presenter.available_keys).not_to be_empty
88    end
89
90    it 'returns the current available_project_keys' do
91      expect(presenter.available_project_keys).not_to be_empty
92    end
93
94    it 'returns the available_project_keys size' do
95      expect(presenter.available_project_keys_size).to eq(1)
96    end
97  end
98
99  context 'prevent N + 1 queries' do
100    before do
101      create_records
102
103      project.add_maintainer(user)
104    end
105
106    def create_records
107      other_project = create(:project)
108      other_project.add_maintainer(user)
109
110      create(:deploy_keys_project, project: project, deploy_key: create(:deploy_key))
111      create(:deploy_keys_project, project: other_project, deploy_key: create(:deploy_key))
112      create(:deploy_key, public: true)
113    end
114
115    def execute_with_query_count
116      ActiveRecord::QueryRecorder.new { execute_presenter }.count
117    end
118
119    def execute_presenter
120      described_class.new(project, current_user: user).as_json
121    end
122
123    it 'returns correct counts' do
124      result = execute_presenter
125
126      expect(result[:enabled_keys].size).to eq(1)
127      expect(result[:available_project_keys].size).to eq(1)
128      expect(result[:public_keys].size).to eq(1)
129    end
130
131    it 'does not increase the query count' do
132      execute_presenter # make sure everything is cached
133
134      count_before = execute_with_query_count
135
136      3.times { create_records }
137
138      count_after = execute_with_query_count
139
140      expect(count_after).to eq(count_before)
141
142      result = execute_presenter
143      expect(result[:enabled_keys].size).to eq(4)
144      expect(result[:available_project_keys].size).to eq(4)
145      expect(result[:public_keys].size).to eq(4)
146    end
147  end
148end
149