diff options
Diffstat (limited to 'spec/support/shared_examples/requests')
5 files changed, 128 insertions, 106 deletions
diff --git a/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb index 6a77de4266f..7e0efd05dd7 100644 --- a/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb @@ -1,42 +1,45 @@ # frozen_string_literal: true -RSpec.shared_context 'Composer user type' do |user_type, add_member| +RSpec.shared_context 'Composer user type' do |member_role: nil| before do - group.send("add_#{user_type}", user) if add_member && user_type != :anonymous - project.send("add_#{user_type}", user) if add_member && user_type != :anonymous + if member_role + group.send("add_#{member_role}", user) + project.send("add_#{member_role}", user) + end end end -RSpec.shared_examples 'Composer package index with version' do |schema_path| +RSpec.shared_examples 'Composer package index with version' do |schema_path, expected_status| it 'returns the package index' do subject - expect(response).to have_gitlab_http_status(status) + expect(response).to have_gitlab_http_status(expected_status) - if status == :success + if expected_status == :success expect(response).to match_response_schema(schema_path) expect(json_response).to eq presenter.root end end end -RSpec.shared_examples 'Composer package index' do |user_type, status, add_member, include_package| - include_context 'Composer user type', user_type, add_member do - let(:expected_packages) { include_package == :include_package ? [package] : [] } - let(:presenter) { ::Packages::Composer::PackagesPresenter.new(group, expected_packages ) } +RSpec.shared_examples 'Composer package index' do |member_role:, expected_status:, package_returned:| + include_context 'Composer user type', member_role: member_role do + let_it_be(:expected_packages) { package_returned ? [package] : [] } + let_it_be(:presenter) { ::Packages::Composer::PackagesPresenter.new(group, expected_packages ) } - it_behaves_like 'Composer package index with version', 'public_api/v4/packages/composer/index' + it_behaves_like 'Composer package index with version', 'public_api/v4/packages/composer/index', expected_status context 'with version 2' do + let_it_be(:presenter) { ::Packages::Composer::PackagesPresenter.new(group, expected_packages, true ) } let(:headers) { super().merge('User-Agent' => 'Composer/2.0.9 (Darwin; 19.6.0; PHP 7.4.8; cURL 7.71.1)') } - it_behaves_like 'Composer package index with version', 'public_api/v4/packages/composer/index_v2' + it_behaves_like 'Composer package index with version', 'public_api/v4/packages/composer/index_v2', expected_status end end end -RSpec.shared_examples 'Composer empty provider index' do |user_type, status, add_member = true| - include_context 'Composer user type', user_type, add_member do +RSpec.shared_examples 'Composer empty provider index' do |member_role:, expected_status:| + include_context 'Composer user type', member_role: member_role do it 'returns the package index' do subject @@ -47,24 +50,24 @@ RSpec.shared_examples 'Composer empty provider index' do |user_type, status, add end end -RSpec.shared_examples 'Composer provider index' do |user_type, status, add_member = true| - include_context 'Composer user type', user_type, add_member do +RSpec.shared_examples 'Composer provider index' do |member_role:, expected_status:| + include_context 'Composer user type', member_role: member_role do it 'returns the package index' do subject - expect(response).to have_gitlab_http_status(status) + expect(response).to have_gitlab_http_status(expected_status) expect(response).to match_response_schema('public_api/v4/packages/composer/provider') expect(json_response['providers']).to include(package.name) end end end -RSpec.shared_examples 'Composer package api request' do |user_type, status, add_member = true| - include_context 'Composer user type', user_type, add_member do +RSpec.shared_examples 'Composer package api request' do |member_role:, expected_status:| + include_context 'Composer user type', member_role: member_role do it 'returns the package index' do subject - expect(response).to have_gitlab_http_status(status) + expect(response).to have_gitlab_http_status(expected_status) expect(response).to match_response_schema('public_api/v4/packages/composer/package') expect(json_response['packages']).to include(package.name) expect(json_response['packages'][package.name]).to include(package.version) @@ -72,18 +75,13 @@ RSpec.shared_examples 'Composer package api request' do |user_type, status, add_ end end -RSpec.shared_examples 'Composer package creation' do |user_type, status, add_member = true| - context "for user type #{user_type}" do - before do - group.send("add_#{user_type}", user) if add_member && user_type != :anonymous - project.send("add_#{user_type}", user) if add_member && user_type != :anonymous - end - +RSpec.shared_examples 'Composer package creation' do |expected_status:, member_role: nil| + include_context 'Composer user type', member_role: member_role do it 'creates package files' do expect { subject } .to change { project.packages.composer.count }.by(1) - expect(response).to have_gitlab_http_status(status) + expect(response).to have_gitlab_http_status(expected_status) end it_behaves_like 'a package tracking event', described_class.name, 'push_package' @@ -100,42 +98,38 @@ RSpec.shared_examples 'Composer package creation' do |user_type, status, add_mem end end -RSpec.shared_examples 'process Composer api request' do |user_type, status, add_member = true| - context "for user type #{user_type}" do - before do - group.send("add_#{user_type}", user) if add_member && user_type != :anonymous - project.send("add_#{user_type}", user) if add_member && user_type != :anonymous - end - - it_behaves_like 'returning response status', status - it_behaves_like 'bumping the package last downloaded at field' if status == :success +RSpec.shared_examples 'process Composer api request' do |expected_status:, member_role: nil, **extra| + include_context 'Composer user type', member_role: member_role do + it_behaves_like 'returning response status', expected_status + it_behaves_like 'bumping the package last downloaded at field' if expected_status == :success end end -RSpec.shared_context 'Composer auth headers' do |user_role, user_token, auth_method = :token| - let(:token) { user_token ? personal_access_token.token : 'wrong' } - +RSpec.shared_context 'Composer auth headers' do |token_type:, valid_token:, auth_method: :token| let(:headers) do - if user_role == :anonymous - {} - elsif auth_method == :token - { 'Private-Token' => token } + if token_type == :user + token = valid_token ? personal_access_token.token : 'wrong' + auth_method == :token ? { 'Private-Token' => token } : basic_auth_header(user.username, token) + elsif token_type == :job && valid_token + auth_method == :token ? { 'Job-Token' => job.token } : job_basic_auth_header(job) else - basic_auth_header(user.username, token) + {} # Anonymous user end end end -RSpec.shared_context 'Composer api project access' do |project_visibility_level, user_role, user_token, auth_method| - include_context 'Composer auth headers', user_role, user_token, auth_method do +RSpec.shared_context 'Composer api project access' do |auth_method:, project_visibility_level:, token_type:, + valid_token: true| + include_context 'Composer auth headers', auth_method: auth_method, token_type: token_type, valid_token: valid_token do before do project.update!(visibility_level: Gitlab::VisibilityLevel.const_get(project_visibility_level, false)) end end end -RSpec.shared_context 'Composer api group access' do |project_visibility_level, user_role, user_token| - include_context 'Composer auth headers', user_role, user_token do +RSpec.shared_context 'Composer api group access' do |auth_method:, project_visibility_level:, token_type:, + valid_token: true| + include_context 'Composer auth headers', auth_method: auth_method, token_type: token_type, valid_token: valid_token do before do project.update!(visibility_level: Gitlab::VisibilityLevel.const_get(project_visibility_level, false)) group.update!(visibility_level: Gitlab::VisibilityLevel.const_get(project_visibility_level, false)) @@ -148,13 +142,13 @@ RSpec.shared_examples 'rejects Composer access with unknown group id' do let(:group) { double(id: non_existing_record_id) } context 'as anonymous' do - it_behaves_like 'process Composer api request', :anonymous, :not_found + it_behaves_like 'process Composer api request', expected_status: :unauthorized end context 'as authenticated user' do subject { get api(url), headers: basic_auth_header(user.username, personal_access_token.token) } - it_behaves_like 'process Composer api request', :anonymous, :not_found + it_behaves_like 'process Composer api request', expected_status: :not_found end end end @@ -164,13 +158,13 @@ RSpec.shared_examples 'rejects Composer access with unknown project id' do let(:project) { double(id: non_existing_record_id) } context 'as anonymous' do - it_behaves_like 'process Composer api request', :anonymous, :unauthorized + it_behaves_like 'process Composer api request', expected_status: :unauthorized end context 'as authenticated user' do subject { get api(url), params: params, headers: basic_auth_header(user.username, personal_access_token.token) } - it_behaves_like 'process Composer api request', :anonymous, :not_found + it_behaves_like 'process Composer api request', expected_status: :not_found end end end @@ -191,7 +185,7 @@ RSpec.shared_examples 'Composer access with deploy tokens' do context 'invalid token' do let(:headers) { basic_auth_header(deploy_token.username, 'bar') } - it_behaves_like 'returning response status', :not_found + it_behaves_like 'returning response status', :unauthorized end end end diff --git a/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb index 04f340fef37..c6e4aba6968 100644 --- a/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb @@ -408,28 +408,6 @@ RSpec.shared_examples 'graphql issue list request spec' do include_examples 'N+1 query check' end - context 'when requesting participants' do - let(:search_params) { { iids: [issue_a.iid.to_s, issue_c.iid.to_s] } } - let(:requested_fields) { 'participants { nodes { name } }' } - - before do - create(:award_emoji, :upvote, awardable: issue_a) - create(:award_emoji, :upvote, awardable: issue_b) - create(:award_emoji, :upvote, awardable: issue_c) - - note_with_emoji_a = create(:note_on_issue, noteable: issue_a, project: issue_a.project) - note_with_emoji_b = create(:note_on_issue, noteable: issue_b, project: issue_b.project) - note_with_emoji_c = create(:note_on_issue, noteable: issue_c, project: issue_c.project) - - create(:award_emoji, :upvote, awardable: note_with_emoji_a) - create(:award_emoji, :upvote, awardable: note_with_emoji_b) - create(:award_emoji, :upvote, awardable: note_with_emoji_c) - end - - # Executes 3 extra queries to fetch participant_attrs - include_examples 'N+1 query check', threshold: 3 - end - context 'when requesting labels', :use_sql_query_cache do let(:requested_fields) { 'labels { nodes { id } }' } let(:extra_iid_for_second_query) { same_project_issue2.iid.to_s } diff --git a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb index 5f043cdd996..a4091d6bceb 100644 --- a/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/npm_packages_shared_examples.rb @@ -68,22 +68,22 @@ RSpec.shared_examples 'handling get metadata requests' do |scope: :project| nil | :unscoped | false | :public | nil | :accept | :ok nil | :non_existing | true | :public | nil | :redirect | :redirected nil | :non_existing | false | :public | nil | :reject | :not_found - nil | :scoped_naming_convention | true | :private | nil | :reject | :not_found - nil | :scoped_naming_convention | false | :private | nil | :reject | :not_found - nil | :scoped_no_naming_convention | true | :private | nil | :reject | :not_found - nil | :scoped_no_naming_convention | false | :private | nil | :reject | :not_found - nil | :unscoped | true | :private | nil | :reject | :not_found - nil | :unscoped | false | :private | nil | :reject | :not_found + nil | :scoped_naming_convention | true | :private | nil | :reject | :unauthorized + nil | :scoped_naming_convention | false | :private | nil | :reject | :unauthorized + nil | :scoped_no_naming_convention | true | :private | nil | :reject | :unauthorized + nil | :scoped_no_naming_convention | false | :private | nil | :reject | :unauthorized + nil | :unscoped | true | :private | nil | :reject | :unauthorized + nil | :unscoped | false | :private | nil | :reject | :unauthorized nil | :non_existing | true | :private | nil | :redirect | :redirected - nil | :non_existing | false | :private | nil | :reject | :not_found - nil | :scoped_naming_convention | true | :internal | nil | :reject | :not_found - nil | :scoped_naming_convention | false | :internal | nil | :reject | :not_found - nil | :scoped_no_naming_convention | true | :internal | nil | :reject | :not_found - nil | :scoped_no_naming_convention | false | :internal | nil | :reject | :not_found - nil | :unscoped | true | :internal | nil | :reject | :not_found - nil | :unscoped | false | :internal | nil | :reject | :not_found + nil | :non_existing | false | :private | nil | :reject | :unauthorized + nil | :scoped_naming_convention | true | :internal | nil | :reject | :unauthorized + nil | :scoped_naming_convention | false | :internal | nil | :reject | :unauthorized + nil | :scoped_no_naming_convention | true | :internal | nil | :reject | :unauthorized + nil | :scoped_no_naming_convention | false | :internal | nil | :reject | :unauthorized + nil | :unscoped | true | :internal | nil | :reject | :unauthorized + nil | :unscoped | false | :internal | nil | :reject | :unauthorized nil | :non_existing | true | :internal | nil | :redirect | :redirected - nil | :non_existing | false | :internal | nil | :reject | :not_found + nil | :non_existing | false | :internal | nil | :reject | :unauthorized :oauth | :scoped_naming_convention | true | :public | :guest | :accept | :ok :oauth | :scoped_naming_convention | true | :public | :reporter | :accept | :ok @@ -280,11 +280,15 @@ RSpec.shared_examples 'handling get metadata requests' do |scope: :project| end end - if (scope == :group && params[:package_name_type] == :non_existing) && - (!params[:request_forward] || (!params[:auth] && params[:request_forward] && params[:visibility] != :public)) + if scope == :group && params[:package_name_type] == :non_existing && !params[:request_forward] && params[:auth] status = :not_found end + if scope == :group && params[:package_name_type] == :non_existing && params[:request_forward] && !params[:auth] && params[:visibility] != :public + example_name = 'reject metadata request' + status = :unauthorized + end + # Check the error message for :not_found example_name = 'returning response status with error' if status == :not_found @@ -522,14 +526,14 @@ RSpec.shared_examples 'handling get dist tags requests' do |scope: :project| nil | :scoped_no_naming_convention | :public | nil | :accept | :ok nil | :unscoped | :public | nil | :accept | :ok nil | :non_existing | :public | nil | :reject | :not_found - nil | :scoped_naming_convention | :private | nil | :reject | :not_found - nil | :scoped_no_naming_convention | :private | nil | :reject | :not_found - nil | :unscoped | :private | nil | :reject | :not_found - nil | :non_existing | :private | nil | :reject | :not_found - nil | :scoped_naming_convention | :internal | nil | :reject | :not_found - nil | :scoped_no_naming_convention | :internal | nil | :reject | :not_found - nil | :unscoped | :internal | nil | :reject | :not_found - nil | :non_existing | :internal | nil | :reject | :not_found + nil | :scoped_naming_convention | :private | nil | :reject | :unauthorized + nil | :scoped_no_naming_convention | :private | nil | :reject | :unauthorized + nil | :unscoped | :private | nil | :reject | :unauthorized + nil | :non_existing | :private | nil | :reject | :unauthorized + nil | :scoped_naming_convention | :internal | nil | :reject | :unauthorized + nil | :scoped_no_naming_convention | :internal | nil | :reject | :unauthorized + nil | :unscoped | :internal | nil | :reject | :unauthorized + nil | :non_existing | :internal | nil | :reject | :unauthorized :oauth | :scoped_naming_convention | :public | :guest | :accept | :ok :oauth | :scoped_naming_convention | :public | :reporter | :accept | :ok diff --git a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb index 1be99040ae5..f8e78c8c9b1 100644 --- a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb @@ -357,12 +357,7 @@ RSpec.shared_examples 'process nuget download content request' do |user_type, st end context 'with normalized package version' do - let(:normalized_version) { '0.1.0' } - let(:url) { "/projects/#{target.id}/packages/nuget/download/#{package.name}/#{normalized_version}/#{package.name}.#{package.version}.#{format}" } - - before do - package.nuget_metadatum.update_column(:normalized_version, normalized_version) - end + let(:package_version) { '0.1.0' } it_behaves_like 'returning response status', status @@ -737,3 +732,19 @@ RSpec.shared_examples 'nuget upload endpoint' do |symbol_package: false| end end end + +RSpec.shared_examples 'process nuget delete request' do |user_type, status| + context "for user type #{user_type}" do + before do + target.send("add_#{user_type}", user) if user_type + end + + it_behaves_like 'returning response status', status + + it_behaves_like 'a package tracking event', 'API::NugetPackages', 'delete_package' + + it 'marks package for deletion' do + expect { subject }.to change { package.reset.status }.from('default').to('pending_destruction') + end + end +end diff --git a/spec/support/shared_examples/requests/organizations_shared_examples.rb b/spec/support/shared_examples/requests/organizations_shared_examples.rb new file mode 100644 index 00000000000..78e7c3c6bde --- /dev/null +++ b/spec/support/shared_examples/requests/organizations_shared_examples.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'organization - successful response' do + it 'renders 200 OK' do + gitlab_request + + expect(response).to have_gitlab_http_status(:ok) + end +end + +RSpec.shared_examples 'organization - not found response' do + it 'renders 404 NOT_FOUND' do + gitlab_request + + expect(response).to have_gitlab_http_status(:not_found) + end +end + +RSpec.shared_examples 'organization - redirects to sign in page' do + it 'redirects to sign in page' do + gitlab_request + + expect(response).to redirect_to(new_user_session_path) + end +end + +RSpec.shared_examples 'organization - action disabled by `ui_for_organizations` feature flag' do + context 'when `ui_for_organizations` feature flag is disabled' do + before do + stub_feature_flags(ui_for_organizations: false) + end + + it_behaves_like 'organization - not found response' + end +end |