Ejemplo n.º 1
0
        /// <summary>
        /// Executes the InsertBasketItem use case.
        /// This execution triggers a domain event BasketItemCreated in order to be consumed by the interested parties.
        /// </summary>
        /// <param name="request">The request with the basket item data.</param>
        public async Task <Item> Execute(InsertBasketItemRequest request)
        {
            Item result;

            try
            {
                Ensure.IsNotNull(request);
                Ensure.IsNotNullOrEmpty(request.BasketId);
                Ensure.IsNotNullOrEmpty(request.ItemVariant);

                var domainItem = Domain.Model.Baskets.Item.Create(request.ItemVariant, request.Quantity);
                await this.basketsRepository.InsertItem(request.BasketId, domainItem);

                await this.PublishBasketItemCreated(request.BasketId);

                result = this.basketsTypeAdapter.ToDto(domainItem);
            }
            catch (Exception ex)
            {
                this.logger.Error(
                    $"{nameof(InsertBasket)}.{nameof(Execute)}",
                    ex);
                throw;
            }
            return(result);
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> AddItemToBasket(string basketId, string itemVariant, int quantity)
        {
            try
            {
                if (string.IsNullOrEmpty(basketId) || string.IsNullOrEmpty(itemVariant) || quantity <= 0)
                {
                    return(BadRequest());
                }

                var result = await this.insertBasketItem
                             .Execute(InsertBasketItemRequest.Create(basketId, itemVariant, quantity));

                return(this.CreatedAtRoute(
                           routeName: nameof(GetBasketItemById),
                           routeValues:
                           new
                {
                    basketId = basketId,
                    itemId = result.ItemId
                },
                           value: result));
            }
            catch (Exception e)
            {
                this.logger.Error(e.Message);
                return(BadRequest());
            }
        }
Ejemplo n.º 3
0
        public async Task InsertBasketItem_NullRequest_ThrowsException()
        {
            //Arrange
            var mock   = InsertBasketItemMock.Create();
            var target = mock.Target;
            InsertBasketItemRequest request = null;

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

            //Assert
            await Assert.ThrowsAsync <ArgumentNullException>(execute);
        }
Ejemplo n.º 4
0
        public async Task InsertBasketItem_NullVariant_ThrowsException()
        {
            //Arrange
            var    fixture     = new Fixture();
            var    basketId    = fixture.Create <string>();
            string itemVariant = null;
            var    quantity    = fixture.Create <int>();
            var    mock        = InsertBasketItemMock.Create();
            var    target      = mock.Target;
            var    request     = InsertBasketItemRequest.Create(basketId, itemVariant, quantity);

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

            //Assert
            await Assert.ThrowsAsync <ArgumentException>(execute);
        }
Ejemplo n.º 5
0
        public async Task InsertBasketItem_ValidRequest_ProducerCalledOnce()
        {
            //Arrange
            var fixture     = new Fixture();
            var basketId    = fixture.Create <string>();
            var itemVariant = fixture.Create <string>();
            var quantity    = fixture.Create <int>();
            var mock        = InsertBasketItemMock.Create();
            var target      = mock.Target;
            var request     = InsertBasketItemRequest.Create(basketId, itemVariant, quantity);

            //Act
            await target.Execute(request);

            //Assert
            mock.BasketUpdatedProducerMock.Verify(x => x.ProduceBasketUpdatedEventAsync(It.IsAny <string>()), Times.Once());
        }
Ejemplo n.º 6
0
        public async Task InsertBasketItem_ValidRequest_RepositoryCalledOnce()
        {
            //Arrange
            var fixture     = new Fixture();
            var basketId    = fixture.Create <string>();
            var itemVariant = fixture.Create <string>();
            var quantity    = 2;
            var mock        = InsertBasketItemMock.Create();
            var target      = mock.Target;
            var request     = InsertBasketItemRequest.Create(basketId, itemVariant, quantity);

            //Act
            await target.Execute(request);

            //Assert
            mock.BasketsRepositoryMock.Verify(rep => rep.InsertItem(basketId, It.IsAny <Item>()), Times.Once());
        }