2020-10-24 23:57:45 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
RSpec.describe 'Query.project.pipeline' do
|
2020-10-24 23:57:45 +05:30
|
|
|
include GraphqlHelpers
|
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
let_it_be(:project) { create(:project, :repository, :public) }
|
|
|
|
let_it_be(:user) { create(:user) }
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2021-03-08 18:12:59 +05:30
|
|
|
def all(*fields)
|
|
|
|
fields.flat_map { |f| [f, :nodes] }
|
2020-10-24 23:57:45 +05:30
|
|
|
end
|
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
describe '.stages.groups.jobs' do
|
|
|
|
let(:pipeline) do
|
|
|
|
pipeline = create(:ci_pipeline, project: project, user: user)
|
2021-03-08 18:12:59 +05:30
|
|
|
stage = create(:ci_stage_entity, project: project, pipeline: pipeline, name: 'first')
|
|
|
|
create(:ci_build, stage_id: stage.id, pipeline: pipeline, name: 'my test job')
|
2021-02-22 17:27:13 +05:30
|
|
|
|
|
|
|
pipeline
|
|
|
|
end
|
|
|
|
|
2021-03-08 18:12:59 +05:30
|
|
|
let(:jobs_graphql_data) { graphql_data_at(:project, :pipeline, *all(:stages, :groups, :jobs)) }
|
|
|
|
|
|
|
|
let(:first_n) { var('Int') }
|
2021-02-22 17:27:13 +05:30
|
|
|
|
|
|
|
let(:query) do
|
2021-03-08 18:12:59 +05:30
|
|
|
with_signature([first_n], wrap_fields(query_graphql_path([
|
|
|
|
[:project, { full_path: project.full_path }],
|
|
|
|
[:pipeline, { iid: pipeline.iid.to_s }],
|
|
|
|
[:stages, { first: first_n }]
|
|
|
|
], stage_fields)))
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:stage_fields) do
|
|
|
|
<<~FIELDS
|
|
|
|
nodes {
|
|
|
|
name
|
|
|
|
groups {
|
|
|
|
nodes {
|
2021-09-30 23:02:18 +05:30
|
|
|
detailedStatus {
|
|
|
|
id
|
|
|
|
}
|
2021-03-08 18:12:59 +05:30
|
|
|
name
|
|
|
|
jobs {
|
|
|
|
nodes {
|
2021-09-30 23:02:18 +05:30
|
|
|
detailedStatus {
|
|
|
|
id
|
|
|
|
}
|
2021-03-08 18:12:59 +05:30
|
|
|
name
|
|
|
|
needs {
|
|
|
|
nodes { #{all_graphql_fields_for('CiBuildNeed')} }
|
|
|
|
}
|
|
|
|
pipeline {
|
|
|
|
id
|
2020-10-24 23:57:45 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-03-08 18:12:59 +05:30
|
|
|
}
|
|
|
|
FIELDS
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there are build needs' do
|
|
|
|
before do
|
|
|
|
pipeline.statuses.each do |build|
|
|
|
|
create_list(:ci_build_need, 2, build: build)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'reports the build needs' do
|
|
|
|
post_graphql(query, current_user: user)
|
|
|
|
|
|
|
|
expect(jobs_graphql_data).to contain_exactly a_hash_including(
|
|
|
|
'needs' => a_hash_including(
|
|
|
|
'nodes' => contain_exactly(
|
|
|
|
a_hash_including('name' => String),
|
|
|
|
a_hash_including('name' => String)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
end
|
2021-02-22 17:27:13 +05:30
|
|
|
end
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
it 'returns the jobs of a pipeline stage' do
|
|
|
|
post_graphql(query, current_user: user)
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2021-02-22 17:27:13 +05:30
|
|
|
expect(jobs_graphql_data).to contain_exactly(a_hash_including('name' => 'my test job'))
|
|
|
|
end
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2021-03-08 18:12:59 +05:30
|
|
|
describe 'performance' do
|
|
|
|
before do
|
|
|
|
build_stage = create(:ci_stage_entity, position: 2, name: 'build', project: project, pipeline: pipeline)
|
|
|
|
test_stage = create(:ci_stage_entity, position: 3, name: 'test', project: project, pipeline: pipeline)
|
|
|
|
create(:commit_status, pipeline: pipeline, stage_id: build_stage.id, name: 'docker 1 2')
|
|
|
|
create(:commit_status, pipeline: pipeline, stage_id: build_stage.id, name: 'docker 2 2')
|
|
|
|
create(:commit_status, pipeline: pipeline, stage_id: test_stage.id, name: 'rspec 1 2')
|
|
|
|
create(:commit_status, pipeline: pipeline, stage_id: test_stage.id, name: 'rspec 2 2')
|
2020-10-24 23:57:45 +05:30
|
|
|
end
|
|
|
|
|
2021-03-08 18:12:59 +05:30
|
|
|
it 'can find the first stage' do
|
|
|
|
post_graphql(query, current_user: user, variables: first_n.with(1))
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2021-03-08 18:12:59 +05:30
|
|
|
expect(jobs_graphql_data).to contain_exactly(a_hash_including('name' => 'my test job'))
|
|
|
|
end
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2021-12-11 22:18:48 +05:30
|
|
|
it 'reports the build needs and previous stages with no duplicates', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/346433' do
|
|
|
|
post_graphql(query, current_user: user)
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2021-03-08 18:12:59 +05:30
|
|
|
expect(jobs_graphql_data).to contain_exactly(
|
|
|
|
a_hash_including('name' => 'my test job'),
|
|
|
|
a_hash_including('name' => 'docker 1 2'),
|
|
|
|
a_hash_including('name' => 'docker 2 2'),
|
|
|
|
a_hash_including('name' => 'rspec 1 2'),
|
|
|
|
a_hash_including('name' => 'rspec 2 2')
|
|
|
|
)
|
2020-10-24 23:57:45 +05:30
|
|
|
end
|
2021-03-08 18:12:59 +05:30
|
|
|
|
2021-10-27 15:23:28 +05:30
|
|
|
it 'does not generate N+1 queries', :request_store, :use_sql_query_cache do
|
|
|
|
post_graphql(query, current_user: user)
|
|
|
|
|
|
|
|
control = ActiveRecord::QueryRecorder.new(skip_cached: false) do
|
|
|
|
post_graphql(query, current_user: user)
|
2021-03-08 18:12:59 +05:30
|
|
|
end
|
|
|
|
|
2021-10-27 15:23:28 +05:30
|
|
|
create(:ci_build, name: 'test-a', pipeline: pipeline)
|
|
|
|
create(:ci_build, name: 'test-b', pipeline: pipeline)
|
|
|
|
|
2021-03-08 18:12:59 +05:30
|
|
|
expect do
|
2021-10-27 15:23:28 +05:30
|
|
|
post_graphql(query, current_user: user)
|
|
|
|
end.not_to exceed_all_query_limit(control)
|
2020-10-24 23:57:45 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2021-02-22 17:27:13 +05:30
|
|
|
|
|
|
|
describe '.jobs.artifacts' do
|
|
|
|
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
|
|
|
|
|
|
|
|
let(:query) do
|
|
|
|
%(
|
|
|
|
query {
|
|
|
|
project(fullPath: "#{project.full_path}") {
|
|
|
|
pipeline(iid: "#{pipeline.iid}") {
|
2021-10-27 15:23:28 +05:30
|
|
|
stages {
|
2021-02-22 17:27:13 +05:30
|
|
|
nodes {
|
2021-10-27 15:23:28 +05:30
|
|
|
groups{
|
2021-02-22 17:27:13 +05:30
|
|
|
nodes {
|
2021-10-27 15:23:28 +05:30
|
|
|
jobs {
|
|
|
|
nodes {
|
|
|
|
artifacts {
|
|
|
|
nodes {
|
|
|
|
downloadPath
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-02-22 17:27:13 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the job is a build' do
|
|
|
|
it "returns the build's artifacts" do
|
|
|
|
create(:ci_build, :artifacts, pipeline: pipeline)
|
|
|
|
|
|
|
|
post_graphql(query, current_user: user)
|
|
|
|
|
2021-10-27 15:23:28 +05:30
|
|
|
job_data = graphql_data_at(:project, :pipeline, :stages, :nodes, :groups, :nodes, :jobs, :nodes).first
|
2021-02-22 17:27:13 +05:30
|
|
|
expect(job_data.dig('artifacts', 'nodes').count).to be(2)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the job is not a build' do
|
|
|
|
it 'returns nil' do
|
|
|
|
create(:ci_bridge, pipeline: pipeline)
|
|
|
|
|
|
|
|
post_graphql(query, current_user: user)
|
|
|
|
|
2021-10-27 15:23:28 +05:30
|
|
|
job_data = graphql_data_at(:project, :pipeline, :stages, :nodes, :groups, :nodes, :jobs, :nodes).first
|
2021-02-22 17:27:13 +05:30
|
|
|
expect(job_data['artifacts']).to be_nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-10-24 23:57:45 +05:30
|
|
|
end
|