diff options
Diffstat (limited to 'spec/requests/api/environments_spec.rb')
-rw-r--r-- | spec/requests/api/environments_spec.rb | 109 |
1 files changed, 91 insertions, 18 deletions
diff --git a/spec/requests/api/environments_spec.rb b/spec/requests/api/environments_spec.rb index aa1a4643593..5d40e8c529a 100644 --- a/spec/requests/api/environments_spec.rb +++ b/spec/requests/api/environments_spec.rb @@ -3,28 +3,18 @@ require 'spec_helper' RSpec.describe API::Environments do - let(:user) { create(:user) } - let(:non_member) { create(:user) } - let(:project) { create(:project, :private, :repository, namespace: user.namespace) } - let!(:environment) { create(:environment, project: project) } + let_it_be(:user) { create(:user) } + let_it_be(:non_member) { create(:user) } + let_it_be(:project) { create(:project, :private, :repository, namespace: user.namespace) } + let_it_be_with_reload(:environment) { create(:environment, project: project) } before do project.add_maintainer(user) end - describe 'GET /projects/:id/environments' do + describe 'GET /projects/:id/environments', :aggregate_failures do context 'as member of the project' do it 'returns project environments' do - project_data_keys = %w( - id description default_branch tag_list - ssh_url_to_repo http_url_to_repo web_url readme_url - name name_with_namespace - path path_with_namespace - star_count forks_count - created_at last_activity_at - avatar_url namespace - ) - get api("/projects/#{project.id}/environments", user) expect(response).to have_gitlab_http_status(:ok) @@ -33,12 +23,95 @@ RSpec.describe API::Environments do expect(json_response.size).to eq(1) expect(json_response.first['name']).to eq(environment.name) expect(json_response.first['external_url']).to eq(environment.external_url) - expect(json_response.first['project'].keys).to contain_exactly(*project_data_keys) - expect(json_response.first).not_to have_key("last_deployment") + expect(json_response.first['project']).to match_schema('public_api/v4/project') + expect(json_response.first['enable_advanced_logs_querying']).to eq(false) + expect(json_response.first).not_to have_key('last_deployment') + expect(json_response.first).not_to have_key('gitlab_managed_apps_logs_path') + end + + context 'when the user can read pod logs' do + context 'with successful deployment on cluster' do + let_it_be(:deployment) { create(:deployment, :on_cluster, :success, environment: environment, project: project) } + + it 'returns environment with enable_advanced_logs_querying and logs_api_path' do + get api("/projects/#{project.id}/environments", user) + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response.size).to eq(1) + expect(json_response.first['gitlab_managed_apps_logs_path']).to eq( + "/#{project.full_path}/-/logs/k8s.json?cluster_id=#{deployment.cluster_id}" + ) + end + end + + context 'when elastic stack is available' do + before do + allow_next_found_instance_of(Environment) do |env| + allow(env).to receive(:elastic_stack_available?).and_return(true) + end + end + + it 'returns environment with enable_advanced_logs_querying and logs_api_path' do + get api("/projects/#{project.id}/environments", user) + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response.size).to eq(1) + expect(json_response.first['enable_advanced_logs_querying']).to eq(true) + expect(json_response.first['logs_api_path']).to eq( + "/#{project.full_path}/-/logs/elasticsearch.json?environment_name=#{environment.name}" + ) + end + end + + context 'when elastic stack is not available' do + before do + allow_next_found_instance_of(Environment) do |env| + allow(env).to receive(:elastic_stack_available?).and_return(false) + end + end + + it 'returns environment with enable_advanced_logs_querying logs_api_path' do + get api("/projects/#{project.id}/environments", user) + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response.size).to eq(1) + expect(json_response.first['enable_advanced_logs_querying']).to eq(false) + expect(json_response.first['logs_api_path']).to eq( + "/#{project.full_path}/-/logs/k8s.json?environment_name=#{environment.name}" + ) + end + end + end + + context 'when the user cannot read pod logs' do + before do + allow_next_found_instance_of(User) do |user| + allow(user).to receive(:can?).and_call_original + allow(user).to receive(:can?).with(:read_pod_logs, project).and_return(false) + end + end + + it 'does not contain enable_advanced_logs_querying' do + get api("/projects/#{project.id}/environments", user) + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response.size).to eq(1) + expect(json_response.first).not_to have_key('enable_advanced_logs_querying') + expect(json_response.first).not_to have_key('logs_api_path') + expect(json_response.first).not_to have_key('gitlab_managed_apps_logs_path') + end end context 'when filtering' do - let!(:environment2) { create(:environment, project: project) } + let_it_be(:environment2) { create(:environment, project: project) } it 'returns environment by name' do get api("/projects/#{project.id}/environments?name=#{environment.name}", user) |