Пример #1
0
        /// <summary>
        /// Executes the create basket use case.
        /// This execution triggers a domain event BasketCreated in order to be consumed by the interested parties.
        /// </summary>
        /// <param name="request">The request with the new basket data.</param>
        public async Task <Basket> Execute(InsertBasketRequest request)
        {
            Basket result;

            try
            {
                Ensure.IsNotNull(request);
                Ensure.IsNotNullOrEmpty(request.CustomerEmail);

                var domainBasket = Domain.Model.Baskets.Basket.Create(request.CustomerEmail);
                await this.basketsRepository.Insert(domainBasket);

                await this.ProduceBasketCreated(domainBasket);

                result = this.basketsTypeAdapter.ToDto(domainBasket);
            }
            catch (Exception ex)
            {
                this.logger.Error(
                    $"{nameof(InsertBasket)}.{nameof(Execute)}",
                    ex);
                throw;
            }
            return(result);
        }
Пример #2
0
        public async Task InsertBasket_NullRequest_ThrowsException()
        {
            //Arrange
            var mock   = InsertBasketMock.Create();
            var target = mock.Target;
            InsertBasketRequest request = null;

            //Act
            async Task execute() => await target.Execute(request);

            //Assert
            await Assert.ThrowsAsync <ArgumentNullException>(execute);
        }
Пример #3
0
        public async Task InsertBasket_NullCustomerEmail_ThrowsException()
        {
            //Arrange
            string customerEmail = null;
            var    mock          = InsertBasketMock.Create();
            var    target        = mock.Target;
            var    request       = InsertBasketRequest.Create(customerEmail);

            //Act
            async Task execute() => await target.Execute(request);

            //Assert
            await Assert.ThrowsAsync <ArgumentException>(execute);
        }
Пример #4
0
        public async Task InsertBasket_ValidRequest_ProducerCalledOnce()
        {
            //Arrange
            var customerEmail = "*****@*****.**";
            var mock          = InsertBasketMock.Create();
            var target        = mock.Target;
            var request       = InsertBasketRequest.Create(customerEmail);

            //Act
            await target.Execute(request);

            //Assert
            mock.BasketCreatedProducerMock.Verify(x => x.ProduceBasketCreatedEventAsync(It.IsAny <string>()), Times.Once());
        }
Пример #5
0
        public async Task InsertBasket_ValidRequest_RepositoryCalledOnce()
        {
            //Arrange
            var customerEmail = "*****@*****.**";
            var mock          = InsertBasketMock.Create();
            var target        = mock.Target;
            var request       = InsertBasketRequest.Create(customerEmail);

            //Act
            await target.Execute(request);

            //Assert
            mock.BasketsRepositoryMock.Verify(rep => rep.Insert(It.IsAny <Basket>()), Times.Once());
        }
Пример #6
0
        public async Task <IActionResult> InsertBasket(string customerEmail)
        {
            if (string.IsNullOrEmpty(customerEmail))
            {
                return(this.BadRequest());
            }

            var result = await this.insertBasket
                         .Execute(InsertBasketRequest.Create(customerEmail));

            return(this.CreatedAtRoute(
                       routeName: nameof(GetBaskets),
                       routeValues: new { basketId = result.Id },
                       value: result));
        }