diff options
Diffstat (limited to 'spec/requests/api/graphql/project/environments_spec.rb')
-rw-r--r-- | spec/requests/api/graphql/project/environments_spec.rb | 133 |
1 files changed, 132 insertions, 1 deletions
diff --git a/spec/requests/api/graphql/project/environments_spec.rb b/spec/requests/api/graphql/project/environments_spec.rb index e5b6aebbf2c..618f591affa 100644 --- a/spec/requests/api/graphql/project/environments_spec.rb +++ b/spec/requests/api/graphql/project/environments_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Project Environments query' do +RSpec.describe 'Project Environments query', feature_category: :continuous_delivery do include GraphqlHelpers let_it_be(:project) { create(:project, :private, :repository) } @@ -47,6 +47,60 @@ RSpec.describe 'Project Environments query' do expect(environment_data['environmentType']).to eq(production.environment_type) end + describe 'user permissions' do + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + environment(name: "#{production.name}") { + userPermissions { + updateEnvironment + destroyEnvironment + stopEnvironment + } + } + } + } + ) + end + + it 'returns user permissions of the environment', :aggregate_failures do + subject + + permission_data = graphql_data.dig('project', 'environment', 'userPermissions') + expect(permission_data['updateEnvironment']).to eq(true) + expect(permission_data['destroyEnvironment']).to eq(false) + expect(permission_data['stopEnvironment']).to eq(true) + end + + context 'when fetching user permissions for multiple environments' do + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + environments { + nodes { + userPermissions { + updateEnvironment + destroyEnvironment + stopEnvironment + } + } + } + } + } + ) + end + + it 'limits the result', :aggregate_failures do + subject + + expect_graphql_errors_to_include('"userPermissions" field can be requested only ' \ + 'for 1 Environment(s) at a time.') + end + end + end + describe 'last deployments of environments' do ::Deployment.statuses.each do |status, _| let_it_be(:"production_#{status}_deployment") do @@ -130,4 +184,81 @@ RSpec.describe 'Project Environments query' do expect(multi).not_to exceed_query_limit(baseline) end end + + describe 'nested environments' do + let_it_be(:testing1) { create(:environment, name: 'testing/one', project: project) } + let_it_be(:testing2) { create(:environment, name: 'testing/two', project: project) } + + context 'with query' do + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + nestedEnvironments { + nodes { + name + size + environment { + name + path + } + } + } + } + } + ) + end + + it 'can fetch nested environments' do + subject + + nested_envs = graphql_data.dig('project', 'nestedEnvironments', 'nodes') + expect(nested_envs.count).to be(3) + expect(nested_envs.pluck('name')).to match_array(%w[production staging testing]) + expect(nested_envs.pluck('size')).to match_array([1, 1, 2]) + expect(nested_envs[0].dig('environment', 'name')).to eq(production.name) + end + + context 'when user is guest' do + let(:user) { create(:user).tap { |u| project.add_guest(u) } } + + it 'returns nothing' do + subject + + nested_envs = graphql_data.dig('project', 'nestedEnvironments', 'nodes') + + expect(nested_envs).to be_nil + end + end + end + + context 'when using pagination' do + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + nestedEnvironments(first: 1) { + nodes { + name + } + pageInfo { + hasPreviousPage + startCursor + endCursor + hasNextPage + } + } + } + } + ) + end + + it 'supports pagination' do + subject + nested_envs = graphql_data.dig('project', 'nestedEnvironments') + expect(nested_envs['nodes'].count).to eq(1) + expect(nested_envs.dig('pageInfo', 'hasNextPage')).to be_truthy + end + end + end end |