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