From 0ea3fcec397b69815975647f5e2aa5fe944a8486 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 20 Jun 2022 11:10:13 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-1-stable-ee --- ...statistics_refresh_conflicts_shared_examples.rb | 21 ++++++++ .../requests/api/pypi_packages_shared_examples.rb | 56 ++++++++++++++++++++++ ...environments_controller_spec_shared_examples.rb | 18 +++++++ 3 files changed, 95 insertions(+) create mode 100644 spec/support/shared_examples/requests/api/project_statistics_refresh_conflicts_shared_examples.rb create mode 100644 spec/support/shared_examples/requests/projects/environments_controller_spec_shared_examples.rb (limited to 'spec/support/shared_examples/requests') diff --git a/spec/support/shared_examples/requests/api/project_statistics_refresh_conflicts_shared_examples.rb b/spec/support/shared_examples/requests/api/project_statistics_refresh_conflicts_shared_examples.rb new file mode 100644 index 00000000000..7c3f4781472 --- /dev/null +++ b/spec/support/shared_examples/requests/api/project_statistics_refresh_conflicts_shared_examples.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'preventing request because of ongoing project stats refresh' do |entrypoint| + before do + create(:project_build_artifacts_size_refresh, :pending, project: project) + end + + it 'logs about the rejected request' do + expect(Gitlab::ProjectStatsRefreshConflictsLogger) + .to receive(:warn_request_rejected_during_stats_refresh) + .with(project.id) + + make_request + end + + it 'returns 409 error' do + make_request + + expect(response).to have_gitlab_http_status(:conflict) + end +end diff --git a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb index aff086d1ba3..795545e4ad1 100644 --- a/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb @@ -124,6 +124,23 @@ RSpec.shared_examples 'PyPI package versions' do |user_type, status, add_member end end +RSpec.shared_examples 'PyPI package index' do |user_type, status, add_member = true| + context "for user type #{user_type}" do + before do + project.send("add_#{user_type}", user) if add_member && user_type != :anonymous + group.send("add_#{user_type}", user) if add_member && user_type != :anonymous + end + + it 'returns the package index' do + subject + + expect(response.body).to match(package.name) + end + + it_behaves_like 'returning response status', status + end +end + RSpec.shared_examples 'PyPI package download' do |user_type, status, add_member = true| context "for user type #{user_type}" do before do @@ -259,6 +276,45 @@ RSpec.shared_examples 'pypi simple API endpoint' do end end +RSpec.shared_examples 'pypi simple index API endpoint' do + using RSpec::Parameterized::TableSyntax + + context 'with valid project' do + where(:visibility_level, :user_role, :member, :user_token, :shared_examples_name, :expected_status) do + :public | :developer | true | true | 'PyPI package index' | :success + :public | :guest | true | true | 'PyPI package index' | :success + :public | :developer | true | false | 'PyPI package index' | :success + :public | :guest | true | false | 'PyPI package index' | :success + :public | :developer | false | true | 'PyPI package index' | :success + :public | :guest | false | true | 'PyPI package index' | :success + :public | :developer | false | false | 'PyPI package index' | :success + :public | :guest | false | false | 'PyPI package index' | :success + :public | :anonymous | false | true | 'PyPI package index' | :success + :private | :developer | true | true | 'PyPI package index' | :success + :private | :guest | true | true | 'process PyPI api request' | :forbidden + :private | :developer | true | false | 'process PyPI api request' | :unauthorized + :private | :guest | true | false | 'process PyPI api request' | :unauthorized + :private | :developer | false | true | 'process PyPI api request' | :not_found + :private | :guest | false | true | 'process PyPI api request' | :not_found + :private | :developer | false | false | 'process PyPI api request' | :unauthorized + :private | :guest | false | false | 'process PyPI api request' | :unauthorized + :private | :anonymous | false | true | 'process PyPI api request' | :unauthorized + end + + with_them do + let(:token) { user_token ? personal_access_token.token : 'wrong' } + let(:headers) { user_role == :anonymous ? {} : basic_auth_header(user.username, token) } + + before do + project.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility_level.to_s)) + group.update_column(:visibility_level, Gitlab::VisibilityLevel.level_value(visibility_level.to_s)) + end + + it_behaves_like params[:shared_examples_name], params[:user_role], params[:expected_status], params[:member] + end + end +end + RSpec.shared_examples 'pypi file download endpoint' do using RSpec::Parameterized::TableSyntax diff --git a/spec/support/shared_examples/requests/projects/environments_controller_spec_shared_examples.rb b/spec/support/shared_examples/requests/projects/environments_controller_spec_shared_examples.rb new file mode 100644 index 00000000000..31218b104bd --- /dev/null +++ b/spec/support/shared_examples/requests/projects/environments_controller_spec_shared_examples.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'avoids N+1 queries on environment detail page' do + it 'avoids N+1 queries', :use_sql_query_cache do + create_deployment_with_associations(commit_depth: 19) + + control = ActiveRecord::QueryRecorder.new(skip_cached: false) do + get project_environment_path(project, environment), params: environment_params + end + + 18.downto(0).each { |n| create_deployment_with_associations(commit_depth: n) } + + # N+1s exist for loading commit emails and users + expect do + get project_environment_path(project, environment), params: environment_params + end.not_to exceed_all_query_limit(control).with_threshold(9) + end +end -- cgit v1.2.1