public void CancelsPurchaseApplication()
        {
            var request = BuildRequest();

            commandHandler
            .Setup(x => x.Cancel(It.IsAny <CancelPurchaseApplicationCommand>()))
            .Returns(PurchaseApplicationBuilder.Build());

            var response = controller.Cancel(request) as StatusCodeResult;

            response.StatusCode.Should().Be(StatusCodes.Status200OK);
            commandHandler
            .Verify(x => x.Cancel(It.Is <CancelPurchaseApplicationCommand>(y =>
                                                                           y.PurchaseApplicationId == Id.Create(request.PurchaseApplicationId).IfFail(() => null) &&
                                                                           y.RejectionReason == RejectionReason.Create(request.RejectionReason).IfFail(() => null))), Times.Once);
        }
        public void DoesNotCancelPurchaseApplicationIfIsAlreadyCancelled()
        {
            purchaseApplicationRepository
            .Setup(x => x.SearchBy(It.IsAny <Id>()))
            .Returns(PurchaseApplicationBuilder.Build(isRejected: true));
            timeService
            .Setup(x => x.UtcNow())
            .Returns(new DateTime(2020, 10, 10));

            var cancelledPurchaseApplication = commandHandler.Cancel(BuildCancelPurchaseApplicationCommand());

            cancelledPurchaseApplication.IsLeft.Should().BeTrue();
            cancelledPurchaseApplication.IfLeft(error =>
                                                error.Should().Be(CanaryDeliveries.PurchaseApplication.Domain.Cancel.Error.PurchaseApplicationIsAlreadyRejected));
            purchaseApplicationRepository
            .Verify(x => x.Update(It.IsAny <CanaryDeliveries.PurchaseApplication.Domain.PurchaseApplication>()),
                    Times.Never);
        }
        public void CancelsPurchaseApplication()
        {
            var command             = BuildCancelPurchaseApplicationCommand();
            var purchaseApplication = PurchaseApplicationBuilder.Build(id: command.PurchaseApplicationId.State.Value);

            purchaseApplicationRepository
            .Setup(x => x.SearchBy(command.PurchaseApplicationId))
            .Returns(purchaseApplication);
            var utcNow = new DateTime(2020, 10, 10);

            timeService
            .Setup(x => x.UtcNow())
            .Returns(utcNow);

            var cancelledPurchaseApplication = commandHandler.Cancel(command);

            cancelledPurchaseApplication.IsRight.Should().BeTrue();
            purchaseApplicationRepository
            .Verify(x => x.Update(It.Is <CanaryDeliveries.PurchaseApplication.Domain.PurchaseApplication>(y =>
                                                                                                          y.Id == purchaseApplication.Id &&
                                                                                                          y.Rejection.IsSome &&
                                                                                                          y.State == State.Rejected)), Times.Once);
        }
        public void CreatesPurchaseApplication()
        {
            var request = BuildPurchaseApplicationRequest();

            createPurchaseApplicationCommandHandler
            .Setup(x => x.Create(It.IsAny <CreatePurchaseApplicationCommand>()))
            .Returns(() => PurchaseApplicationBuilder.Build());

            var response = controller.Create(request) as StatusCodeResult;

            response.StatusCode.Should().Be(StatusCodes.Status200OK);
            createPurchaseApplicationCommandHandler
            .Verify(x => x.Create(It.Is <CreatePurchaseApplicationCommand>(y =>
                                                                           y.Products.Count == request.Products.Count &&
                                                                           y.Products.First().Link == Link.Create(request.Products.First().Link).IfFail(() => null) &&
                                                                           y.Products.First().Units == Units.Create(request.Products.First().Units).IfFail(() => null) &&
                                                                           y.Products.First().AdditionalInformation == AdditionalInformation.Create(request.Products.First().AdditionalInformation).IfFail(() => null) &&
                                                                           y.Products.First().PromotionCode == PromotionCode.Create(request.Products.First().PromotionCode).IfFail(() => null) &&
                                                                           y.ClientProp.Email == Email.Create(request.Client.Email).IfFail(() => null) &&
                                                                           y.ClientProp.PhoneNumber == PhoneNumber.Create(request.Client.PhoneNumber).IfFail(() => null) &&
                                                                           y.ClientProp.Name == Name.Create(request.Client.Name).IfFail(() => null) &&
                                                                           y.AdditionalInformation == AdditionalInformation.Create(request.AdditionalInformation).IfFail(() => null))),
                    Times.Once);
        }