241 lines
6.9 KiB
Ruby
241 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
|