public void CreatesCommand()
        {
            var commandDto = BuildCreatePurchaseApplicationCommandDto();

            var result = CreatePurchaseApplicationCommand.Create(commandDto);

            result.IsSuccess.Should().BeTrue();
            result.IfSuccess(command =>
            {
                command.Products.Count.Should().Be(commandDto.Products.Count);
                var expectedLink = Link.Create(commandDto.Products.First().Link.ValueUnsafe()).IfFail(() => null);
                command.Products.First().Link.Should().Be(expectedLink);
                var expectedUnits = Units.Create(commandDto.Products.First().Units).IfFail(() => null);
                command.Products.First().Units.Should().Be(expectedUnits);
                var expectedAdditionalInformation = AdditionalInformation.Create(commandDto.Products.First().AdditionalInformation).IfFail(() => null);
                command.Products.First().AdditionalInformation.IsSome.Should().BeTrue();
                command.Products.First().AdditionalInformation.IfSome(x => x.Should().Be(expectedAdditionalInformation));
                var expectedPromotionCode = PromotionCode.Create(commandDto.Products.First().PromotionCode).IfFail(() => null);
                command.Products.First().PromotionCode.IsSome.Should().BeTrue();
                command.Products.First().PromotionCode.IfSome(x => x.Should().Be(expectedPromotionCode));
                var expectedClientName = Name.Create(commandDto.Client.Email).IfFail(() => null);
                command.ClientProp.Name.Should().Be(expectedClientName);
                var expectedClientPhoneNumber = PhoneNumber.Create(commandDto.Client.PhoneNumber).IfFail(() => null);
                command.ClientProp.PhoneNumber.Should().Be(expectedClientPhoneNumber);
                var expectedClientEmail = Email.Create(commandDto.Client.Email).IfFail(() => null);
                command.ClientProp.Email.Should().Be(expectedClientEmail);
                var expectedPurchaseApplicationAdditionalInformation = AdditionalInformation.Create(commandDto.AdditionalInformation).IfFail(() => null);
                command.AdditionalInformation.IsSome.Should().BeTrue();
                command.AdditionalInformation.IfSome(x => x.Should().Be(expectedPurchaseApplicationAdditionalInformation));
            });
        }
        public void DoesNotCreateCommandWhenAdditionalInformationHasValidationErrors()
        {
            var commandDto = BuildCreatePurchaseApplicationCommandDto(additionalInformation: new string('a', 1001));

            var result = CreatePurchaseApplicationCommand.Create(commandDto);

            result.IsFail.Should().BeTrue();
        }
        public void DoesNotCreateCommandWhenClientHasValidationErrors()
        {
            var commandDto = BuildCreatePurchaseApplicationCommandDto(clientName: null);

            var result = CreatePurchaseApplicationCommand.Create(commandDto);

            result.IsFail.Should().BeTrue();
        }
        public void DoesNotCreateCommandWhenProductsHaveValidationErrors()
        {
            var commandDto = BuildCreatePurchaseApplicationCommandDto(isProductListEmpty: true);

            var result = CreatePurchaseApplicationCommand.Create(commandDto);

            result.IsFail.Should().BeTrue();
        }
            CreatePurchaseApplicationCommand> BuildCreatePurchaseApplicationCommand(PurchaseApplicationCreationRequest creationRequest)
        {
            var commandDto = new CreatePurchaseApplicationCommand.Dto(
                products: creationRequest.Products.Map(product =>
                                                       new CanaryDeliveries.PurchaseApplication.Domain.Entities.Product.Dto(
                                                           link: product.Link,
                                                           units: product.Units,
                                                           additionalInformation: product.AdditionalInformation,
                                                           promotionCode: product.PromotionCode)).ToList(),
                client: new CanaryDeliveries.PurchaseApplication.Domain.Entities.Client.Dto(
                    name: creationRequest.Client.Name,
                    phoneNumber: creationRequest.Client.PhoneNumber,
                    email: creationRequest.Client.Email),
                additionalInformation: creationRequest.AdditionalInformation);

            return(CreatePurchaseApplicationCommand.Create(commandDto));
        }
        private static CreatePurchaseApplicationCommand BuildCreatePurchaseApplicationCommand()
        {
            var requestDto = new CreatePurchaseApplicationCommand.Dto(
                products: new List <Product.Dto>
            {
                new Product.Dto(
                    link: "https://addidas.com/any/product",
                    units: "1",
                    additionalInformation: "Product additional product",
                    promotionCode: "ADDIDAS-123")
            },
                client: new Client.Dto(
                    name: "Alfredo",
                    phoneNumber: "123123123",
                    email: "*****@*****.**"),
                additionalInformation: "Purchase application additional information");

            return(CreatePurchaseApplicationCommand
                   .Create(requestDto)
                   .IfFail(() => throw new InvalidOperationException()));
        }