diff --git a/app/serializers/deployment_entity.rb b/app/serializers/deployment_entity.rb index 7a2fba73f3ac9f26b9ef694b82427916699422cc..020c66af777a580cfbe7bb78e08f539b4870faa1 100644 --- a/app/serializers/deployment_entity.rb +++ b/app/serializers/deployment_entity.rb @@ -73,3 +73,5 @@ def project request.try(:project) || options[:project] end end + +DeploymentEntity.prepend_mod diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb index 6105b52fbda373135211a005380dc93a473bb366..d484f60ed8fda6ad17845f17cb230a4a37052de8 100644 --- a/app/serializers/environment_entity.rb +++ b/app/serializers/environment_entity.rb @@ -20,6 +20,7 @@ class EnvironmentEntity < Grape::Entity expose :last_deployment, using: DeploymentEntity expose :stop_action_available?, as: :has_stop_action expose :rollout_status, if: -> (*) { can_read_deploy_board? }, using: RolloutStatusEntity + expose :tier expose :upcoming_deployment, if: -> (environment) { environment.upcoming_deployment } do |environment, ops| DeploymentEntity.represent(environment.upcoming_deployment, diff --git a/ee/app/serializers/ee/deployment_entity.rb b/ee/app/serializers/ee/deployment_entity.rb new file mode 100644 index 0000000000000000000000000000000000000000..54453d34d4eb0f2e0ecee388db09771c762ef977 --- /dev/null +++ b/ee/app/serializers/ee/deployment_entity.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module EE + module DeploymentEntity + extend ActiveSupport::Concern + + prepended do + expose :pending_approval_count + end + end +end diff --git a/ee/app/serializers/ee/environment_entity.rb b/ee/app/serializers/ee/environment_entity.rb index c3f3085c17c8b56d2172e06c79bfc085ede64a95..f33fd5d7dc2aab4cb41edfc16941f671150a45c4 100644 --- a/ee/app/serializers/ee/environment_entity.rb +++ b/ee/app/serializers/ee/environment_entity.rb @@ -7,6 +7,7 @@ module EnvironmentEntity prepended do expose :has_opened_alert?, if: -> (*) { can_read_alert_management_alert? }, expose_nil: false, as: :has_opened_alert + expose :required_approval_count end private diff --git a/ee/spec/fixtures/api/schemas/deployment.json b/ee/spec/fixtures/api/schemas/deployment.json new file mode 100644 index 0000000000000000000000000000000000000000..3568c2b4c260a8dbf2a63e057728a152a173ad84 --- /dev/null +++ b/ee/spec/fixtures/api/schemas/deployment.json @@ -0,0 +1,15 @@ +{ + "type": "object", + "allOf": [ + { + "$ref": "../../../../../spec/fixtures/api/schemas/deployment.json" + }, + { + "properties": { + "pending_approval_count": { + "type": "integer" + } + } + } + ] +} diff --git a/ee/spec/fixtures/api/schemas/environment.json b/ee/spec/fixtures/api/schemas/environment.json index 7b9e106f46b1ecc5c3a7bd4b4cd967255ca14ea3..3c26e6c5c83c8cc2b2a34f934bec66894c194021 100644 --- a/ee/spec/fixtures/api/schemas/environment.json +++ b/ee/spec/fixtures/api/schemas/environment.json @@ -80,6 +80,8 @@ }, "delete_path": { "type": "string" - } + }, + "tier": { "type": "string" }, + "required_approval_count": { "type": "integer" } } } diff --git a/ee/spec/serializers/ee/deployment_entity_spec.rb b/ee/spec/serializers/ee/deployment_entity_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..a4026210390710d22cd03cb1847998577c72ccc0 --- /dev/null +++ b/ee/spec/serializers/ee/deployment_entity_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe DeploymentEntity do + let_it_be(:project) { create(:project, :repository) } + let_it_be(:environment) { create(:environment, project: project) } + let_it_be(:deployment) { create(:deployment, :blocked, project: project, environment: environment) } + let_it_be(:request) { EntityRequest.new(project: project, current_user: create(:user)) } + + subject { described_class.new(deployment, request: request).as_json } + + before do + stub_licensed_features(protected_environments: true) + create(:protected_environment, name: environment.name, project: project, required_approval_count: 3) + create(:deployment_approval, deployment: deployment) + end + + describe '#pending_approval_count' do + it 'exposes pending_approval_count' do + expect(subject[:pending_approval_count]).to eq(2) + end + end +end diff --git a/ee/spec/serializers/environment_entity_spec.rb b/ee/spec/serializers/environment_entity_spec.rb index fef7a3579cbd48a26ba8ca08a35b2075c0b6ee85..b85ad47eae0bbcdfcc02ba2d9f3e309ed102ca74 100644 --- a/ee/spec/serializers/environment_entity_spec.rb +++ b/ee/spec/serializers/environment_entity_spec.rb @@ -4,7 +4,7 @@ RSpec.describe EnvironmentEntity do let(:user) { create(:user) } - let(:environment) { create(:environment) } + let(:environment) { create(:environment, project: project) } let(:project) { create(:project) } let(:entity) do @@ -76,5 +76,16 @@ it_behaves_like 'protected environments access', developer_access: false end end + + context 'required_approval_count' do + before do + stub_licensed_features(protected_environments: true) + create(:protected_environment, name: environment.name, project: project, required_approval_count: 2) + end + + it 'exposes required_approval_count' do + expect(subject[:required_approval_count]).to eq(2) + end + end end end diff --git a/spec/fixtures/api/schemas/deployment.json b/spec/fixtures/api/schemas/deployment.json index fa34a61c7d3d146d8effd06b848a05455ea483a3..7d96147314cacab1de97a0f97609aba6102e0815 100644 --- a/spec/fixtures/api/schemas/deployment.json +++ b/spec/fixtures/api/schemas/deployment.json @@ -64,6 +64,5 @@ "items": { "$ref": "job/job.json" } }, "status": { "type": "string" } - }, - "additionalProperties": false + } } diff --git a/spec/fixtures/api/schemas/environment.json b/spec/fixtures/api/schemas/environment.json index 4f54a77e6b2a0ee84f65b700de7411bfa55027e6..87b6e5da370116afcc590fe249e8e519c62d9e3c 100644 --- a/spec/fixtures/api/schemas/environment.json +++ b/spec/fixtures/api/schemas/environment.json @@ -35,6 +35,8 @@ "auto_stop_at": { "type": "string", "format": "date-time" }, "can_stop": { "type": "boolean" }, "has_opened_alert": { "type": "boolean" }, + "tier": { "type": "string" }, + "required_approval_count": { "type": "integer" }, "cluster_type": { "type": "types/nullable_string.json" }, "terminal_path": { "type": "types/nullable_string.json" }, "rollout_status": { diff --git a/spec/serializers/environment_entity_spec.rb b/spec/serializers/environment_entity_spec.rb index a6101f825e9ae76592cc3af3a6cb77da378b1fd3..a59107ad3095ff5122d10ae50179a74c2aef3dc7 100644 --- a/spec/serializers/environment_entity_spec.rb +++ b/spec/serializers/environment_entity_spec.rb @@ -31,7 +31,7 @@ end it 'exposes core elements of environment' do - expect(subject).to include(:id, :global_id, :name, :state, :environment_path) + expect(subject).to include(:id, :global_id, :name, :state, :environment_path, :tier) end it 'exposes folder path' do