133 lines
4.4 KiB
Ruby
133 lines
4.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe 'Project Environments query' do
|
|
include GraphqlHelpers
|
|
|
|
let_it_be(:project) { create(:project, :private, :repository) }
|
|
let_it_be_with_refind(:production) { create(:environment, :production, project: project) }
|
|
let_it_be_with_refind(:staging) { create(:environment, :staging, project: project) }
|
|
let_it_be(:developer) { create(:user).tap { |u| project.add_developer(u) } }
|
|
|
|
subject { post_graphql(query, current_user: user) }
|
|
|
|
let(:user) { developer }
|
|
|
|
let(:query) do
|
|
%(
|
|
query {
|
|
project(fullPath: "#{project.full_path}") {
|
|
environment(name: "#{production.name}") {
|
|
slug
|
|
createdAt
|
|
updatedAt
|
|
autoStopAt
|
|
autoDeleteAt
|
|
tier
|
|
environmentType
|
|
}
|
|
}
|
|
}
|
|
)
|
|
end
|
|
|
|
it 'returns the specified fields of the environment', :aggregate_failures do
|
|
production.update!(auto_stop_at: 1.day.ago, auto_delete_at: 2.days.ago, environment_type: 'review')
|
|
|
|
subject
|
|
|
|
environment_data = graphql_data.dig('project', 'environment')
|
|
expect(environment_data['slug']).to eq(production.slug)
|
|
expect(environment_data['createdAt']).to eq(production.created_at.iso8601)
|
|
expect(environment_data['updatedAt']).to eq(production.updated_at.iso8601)
|
|
expect(environment_data['autoStopAt']).to eq(production.auto_stop_at.iso8601)
|
|
expect(environment_data['autoDeleteAt']).to eq(production.auto_delete_at.iso8601)
|
|
expect(environment_data['tier']).to eq(production.tier.upcase)
|
|
expect(environment_data['environmentType']).to eq(production.environment_type)
|
|
end
|
|
|
|
describe 'last deployments of environments' do
|
|
::Deployment.statuses.each do |status, _|
|
|
let_it_be(:"production_#{status}_deployment") do
|
|
create(:deployment, status.to_sym, environment: production, project: project)
|
|
end
|
|
|
|
let_it_be(:"staging_#{status}_deployment") do
|
|
create(:deployment, status.to_sym, environment: staging, project: project)
|
|
end
|
|
end
|
|
|
|
let(:query) do
|
|
%(
|
|
query {
|
|
project(fullPath: "#{project.full_path}") {
|
|
environments {
|
|
nodes {
|
|
name
|
|
lastSuccessDeployment: lastDeployment(status: SUCCESS) {
|
|
iid
|
|
}
|
|
lastRunningDeployment: lastDeployment(status: RUNNING) {
|
|
iid
|
|
}
|
|
lastBlockedDeployment: lastDeployment(status: BLOCKED) {
|
|
iid
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
)
|
|
end
|
|
|
|
it 'returns all last deployments of the environment' do
|
|
subject
|
|
|
|
environments_data = graphql_data_at(:project, :environments, :nodes)
|
|
|
|
environments_data.each do |environment_data|
|
|
name = environment_data['name']
|
|
success_deployment = public_send(:"#{name}_success_deployment")
|
|
running_deployment = public_send(:"#{name}_running_deployment")
|
|
blocked_deployment = public_send(:"#{name}_blocked_deployment")
|
|
|
|
expect(environment_data['lastSuccessDeployment']['iid']).to eq(success_deployment.iid.to_s)
|
|
expect(environment_data['lastRunningDeployment']['iid']).to eq(running_deployment.iid.to_s)
|
|
expect(environment_data['lastBlockedDeployment']['iid']).to eq(blocked_deployment.iid.to_s)
|
|
end
|
|
end
|
|
|
|
it 'executes the same number of queries in single environment and multiple environments' do
|
|
single_environment_query =
|
|
%(
|
|
query {
|
|
project(fullPath: "#{project.full_path}") {
|
|
environment(name: "#{production.name}") {
|
|
name
|
|
lastSuccessDeployment: lastDeployment(status: SUCCESS) {
|
|
iid
|
|
}
|
|
lastRunningDeployment: lastDeployment(status: RUNNING) {
|
|
iid
|
|
}
|
|
lastBlockedDeployment: lastDeployment(status: BLOCKED) {
|
|
iid
|
|
}
|
|
}
|
|
}
|
|
}
|
|
)
|
|
|
|
baseline = ActiveRecord::QueryRecorder.new do
|
|
run_with_clean_state(single_environment_query, context: { current_user: user })
|
|
end
|
|
|
|
multi = ActiveRecord::QueryRecorder.new do
|
|
run_with_clean_state(query, context: { current_user: user })
|
|
end
|
|
|
|
expect(multi).not_to exceed_query_limit(baseline)
|
|
end
|
|
end
|
|
end
|