debian-mirror-gitlab/spec/requests/api/graphql/project/commit_references_spec.rb
2023-07-09 08:55:56 +05:30

240 lines
6.9 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Query.project(fullPath).commitReferences(commitSha)', feature_category: :source_code_management do
include GraphqlHelpers
include Presentable
let_it_be(:project) { create(:project, :repository) }
let_it_be(:repository) { project.repository.raw }
let_it_be(:current_user) { project.first_owner }
let_it_be(:branches_names) { %w[master not-merged-branch v1.1.0] }
let_it_be(:tag_name) { 'v1.0.0' }
let_it_be(:commit_sha) { repository.commit.id }
let(:post_query) { post_graphql(query, current_user: current_user) }
let(:data) { graphql_data.dig(*path) }
let(:base_args) { {} }
let(:args) { base_args }
shared_context 'with the limit argument' do
context 'with limit of 2' do
let(:args) { { limit: 2 } }
it 'returns the right amount of refs' do
post_query
expect(data.count).to be <= 2
end
end
context 'with limit of -2' do
let(:args) { { limit: -2 } }
it 'casts an argument error "limit must be greater then 0"' do
post_query
expect(graphql_errors).to include(custom_graphql_error(path - ['names'],
'limit must be within 1..1000'))
end
end
context 'with limit of 1001' do
let(:args) { { limit: 1001 } }
it 'casts an argument error "limit must be greater then 0"' do
post_query
expect(graphql_errors).to include(custom_graphql_error(path - ['names'],
'limit must be within 1..1000'))
end
end
end
describe 'the path commitReferences should return nil' do
let(:path) { %w[project commitReferences] }
let(:query) do
graphql_query_for(:project, { fullPath: project.full_path },
query_graphql_field(
:commitReferences,
{ commitSha: commit_sha },
query_graphql_field(:tippingTags, :names)
)
)
end
context 'when commit does not exist' do
let(:commit_sha) { '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff4' }
it 'commitReferences returns nil' do
post_query
expect(data).to eq(nil)
end
end
context 'when sha length is incorrect' do
let(:commit_sha) { 'foo' }
it 'commitReferences returns nil' do
post_query
expect(data).to eq(nil)
end
end
context 'when user is not authorized' do
let(:commit_sha) { repository.commit.id }
let(:current_user) { create(:user) }
it 'commitReferences returns nil' do
post_query
expect(data).to eq(nil)
end
end
end
context 'with containing refs' do
let(:base_args) { { excludeTipped: false } }
let(:excluded_tipped_args) do
hash = base_args.dup
hash[:excludeTipped] = true
hash
end
context 'with path Query.project(fullPath).commitReferences(commitSha).containingTags' do
let_it_be(:commit_sha) { repository.find_tag(tag_name).target_commit.sha }
let_it_be(:path) { %w[project commitReferences containingTags names] }
let(:query) do
graphql_query_for(
:project,
{ fullPath: project.full_path },
query_graphql_field(
:commitReferences,
{ commitSha: commit_sha },
query_graphql_field(:containingTags, args, :names)
)
)
end
context 'without excludeTipped argument' do
it 'returns tags names containing the commit' do
post_query
expect(data).to eq(%w[v1.0.0 v1.1.0 v1.1.1])
end
end
context 'with excludeTipped argument' do
let_it_be(:ref_prefix) { Gitlab::Git::TAG_REF_PREFIX }
let(:args) { excluded_tipped_args }
it 'returns tags names containing the commit without the tipped tags' do
excluded_refs = project.repository
.refs_by_oid(oid: commit_sha, ref_patterns: [ref_prefix])
.map { |n| n.delete_prefix(ref_prefix) }
post_query
expect(data).to eq(%w[v1.0.0 v1.1.0 v1.1.1] - excluded_refs)
end
end
include_context 'with the limit argument'
end
context 'with path Query.project(fullPath).commitReferences(commitSha).containingBranches' do
let_it_be(:ref_prefix) { Gitlab::Git::BRANCH_REF_PREFIX }
let_it_be(:path) { %w[project commitReferences containingBranches names] }
let(:query) do
graphql_query_for(
:project,
{ fullPath: project.full_path },
query_graphql_field(
:commitReferences,
{ commitSha: commit_sha },
query_graphql_field(:containingBranches, args, :names)
)
)
end
context 'without excludeTipped argument' do
it 'returns branch names containing the commit' do
refs = project.repository.branch_names_contains(commit_sha)
post_query
expect(data).to eq(refs)
end
end
context 'with excludeTipped argument' do
let(:args) { excluded_tipped_args }
it 'returns branch names containing the commit without the tipped branch' do
refs = project.repository.branch_names_contains(commit_sha)
excluded_refs = project.repository
.refs_by_oid(oid: commit_sha, ref_patterns: [ref_prefix])
.map { |n| n.delete_prefix(ref_prefix) }
post_query
expect(data).to eq(refs - excluded_refs)
end
end
include_context 'with the limit argument'
end
end
context 'with tipping refs' do
context 'with path Query.project(fullPath).commitReferences(commitSha).tippingTags' do
let(:commit_sha) { repository.find_tag(tag_name).dereferenced_target.sha }
let(:path) { %w[project commitReferences tippingTags names] }
let(:query) do
graphql_query_for(
:project,
{ fullPath: project.full_path },
query_graphql_field(
:commitReferences,
{ commitSha: commit_sha },
query_graphql_field(:tippingTags, args, :names)
)
)
end
context 'with authorized user' do
it 'returns tags names tipping the commit' do
post_query
expect(data).to eq([tag_name])
end
end
include_context 'with the limit argument'
end
context 'with path Query.project(fullPath).commitReferences(commitSha).tippingBranches' do
let(:path) { %w[project commitReferences tippingBranches names] }
let(:query) do
graphql_query_for(
:project,
{ fullPath: project.full_path },
query_graphql_field(
:commitReferences,
{ commitSha: commit_sha },
query_graphql_field(:tippingBranches, args, :names)
)
)
end
it 'returns branches names tipping the commit' do
post_query
expect(data).to eq(branches_names)
end
include_context 'with the limit argument'
end
end
end