From 3ec23111f8f28a7c5e9fed4ada538aee546bfce8 Mon Sep 17 00:00:00 2001 From: Riccardo Torsoli <122275960+nttdata-rtorsoli@users.noreply.github.com> Date: Mon, 18 Mar 2024 08:50:05 +0100 Subject: [PATCH] PIN-4667 - Allow agreement archiving only on Active or Suspended state (#259) --- .../api/impl/AgreementApiServiceImpl.scala | 1 + .../api/impl/ResponseHandlers.scala | 9 ++-- .../AgreementArchiviationSpec.scala | 43 +++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/AgreementApiServiceImpl.scala b/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/AgreementApiServiceImpl.scala index 7d7c69f7..4e6358f0 100644 --- a/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/AgreementApiServiceImpl.scala +++ b/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/AgreementApiServiceImpl.scala @@ -1347,6 +1347,7 @@ final case class AgreementApiServiceImpl( agreementUUID <- agreementId.toFutureUUID agreement <- agreementManagementService.getAgreementById(agreementUUID) _ <- assertRequesterIsConsumer(requesterOrgId, agreement) + _ <- agreement.assertArchivableState.toFuture updated <- archive(agreement.toManagement) _ <- archivingPurposesQueueService.send[ArchiveEvent](ArchiveEvent(updated.id, offsetDateTimeSupplier.get())) _ <- archivingEservicesQueueService.send[ArchiveEvent](ArchiveEvent(updated.id, offsetDateTimeSupplier.get())) diff --git a/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/ResponseHandlers.scala b/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/ResponseHandlers.scala index 8964295b..f0e855c5 100644 --- a/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/ResponseHandlers.scala +++ b/src/main/scala/it/pagopa/interop/agreementprocess/api/impl/ResponseHandlers.scala @@ -72,10 +72,11 @@ object ResponseHandlers extends AkkaResponses { success: T => Route )(result: Try[T])(implicit contexts: Seq[(String, String)], logger: LoggerTakingImplicit[ContextFieldsToLog]): Route = result match { - case Success(s) => success(s) - case Failure(ex: AgreementNotFound) => notFound(ex, logMessage) - case Failure(ex: OperationNotAllowed) => forbidden(ex, logMessage) - case Failure(ex) => internalServerError(ex, logMessage) + case Success(s) => success(s) + case Failure(ex: AgreementNotFound) => notFound(ex, logMessage) + case Failure(ex: AgreementNotInExpectedState) => badRequest(ex, logMessage) + case Failure(ex: OperationNotAllowed) => forbidden(ex, logMessage) + case Failure(ex) => internalServerError(ex, logMessage) } def suspendAgreementResponse[T](logMessage: String)( diff --git a/src/test/scala/it/pagopa/interop/agreementprocess/AgreementArchiviationSpec.scala b/src/test/scala/it/pagopa/interop/agreementprocess/AgreementArchiviationSpec.scala index ae2df95e..6c442d0e 100644 --- a/src/test/scala/it/pagopa/interop/agreementprocess/AgreementArchiviationSpec.scala +++ b/src/test/scala/it/pagopa/interop/agreementprocess/AgreementArchiviationSpec.scala @@ -64,5 +64,48 @@ class AgreementArchiviationSpec extends AnyWordSpecLike with SpecHelper with Sca status shouldEqual StatusCodes.NotFound } } + "fail if agreement is in Pending state" in { + val agreement = + SpecData.agreement.copy(state = AgreementManagement.AgreementState.PENDING, consumerId = requesterOrgId) + + mockAgreementRetrieve(agreement.toPersistent) + + Get() ~> service.archiveAgreement(agreement.id.toString) ~> check { + status shouldEqual StatusCodes.BadRequest + } + } + "fail if agreement is in Draft state" in { + val agreement = + SpecData.agreement.copy(state = AgreementManagement.AgreementState.DRAFT, consumerId = requesterOrgId) + + mockAgreementRetrieve(agreement.toPersistent) + + Get() ~> service.archiveAgreement(agreement.id.toString) ~> check { + status shouldEqual StatusCodes.BadRequest + } + } + "fail if agreement is in MissingCertifiedAttributes state" in { + val agreement = + SpecData.agreement.copy( + state = AgreementManagement.AgreementState.MISSING_CERTIFIED_ATTRIBUTES, + consumerId = requesterOrgId + ) + + mockAgreementRetrieve(agreement.toPersistent) + + Get() ~> service.archiveAgreement(agreement.id.toString) ~> check { + status shouldEqual StatusCodes.BadRequest + } + } + "fail if agreement is in Rejected state" in { + val agreement = + SpecData.agreement.copy(state = AgreementManagement.AgreementState.REJECTED, consumerId = requesterOrgId) + + mockAgreementRetrieve(agreement.toPersistent) + + Get() ~> service.archiveAgreement(agreement.id.toString) ~> check { + status shouldEqual StatusCodes.BadRequest + } + } } }