public void BeUpdated_WhenClearingBasketWithItems()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(_addItemCommand);
            basketAggregate.HasBeenUpdated = false;

            basketAggregate.Apply(new ClearItemsCommand());

            basketAggregate.HasBeenUpdated.Should().BeTrue();
            basketAggregate.Items.Should().BeEmpty();
        }
        public void BeUpdated_WhenUpdatingExistingItem()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(_addItemCommand);
            basketAggregate.HasBeenUpdated = false;

            basketAggregate.Apply(_updateItemCommand);

            basketAggregate.HasBeenUpdated.Should().BeTrue();
            basketAggregate.Items.Should().ContainSingle(
                item => item.Sku == _addItemCommand.Sku && item.Quantity == _updateItemCommand.Quantity);
        }
        public void BeIdempotent_WhenAddingExistingItem()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(_addItemCommand);
            basketAggregate.HasBeenUpdated = false;

            basketAggregate.Apply(_addItemCommand);

            basketAggregate.Items.Should()
            .ContainSingle(item => item.Quantity == 1);
            basketAggregate.HasBeenUpdated.Should().BeFalse();
        }
        public void BeIdempotent_WhenUpdatingToTheSameQuantity()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(_addItemCommand);
            basketAggregate.Apply(_updateItemCommand);
            basketAggregate.HasBeenUpdated = false;

            basketAggregate.Apply(_updateItemCommand);

            basketAggregate.HasBeenUpdated.Should().BeFalse();
            basketAggregate.Items.Should().ContainSingle(
                item => item.Sku == _addItemCommand.Sku && item.Quantity == _updateItemCommand.Quantity);
        }
        public void ThrowException_WhenUpdatingNonExistingItem()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(_addItemCommand);
            basketAggregate.HasBeenUpdated = false;

            Action action = () => basketAggregate.Apply(new UpdateItemCommand
            {
                Sku      = "54321",
                Quantity = 2
            });

            action.Should().Throw <BasketDoesNotContainProductException>();
        }
        public void BeUpdated_WhenRemovingAnExistingItem()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(_addItemCommand);
            basketAggregate.HasBeenUpdated = false;

            basketAggregate.Apply(new RemoveItemCommand
            {
                Sku = _addItemCommand.Sku
            });

            basketAggregate.HasBeenUpdated.Should().BeTrue();
            basketAggregate.Items.Should().NotContain(item => item.Sku == _addItemCommand.Sku);
        }
        public async Task DispatchUpdateItemCommandToAggregate()
        {
            _basketAggregate.Apply(new AddItemCommand {
                Sku = "sku", Description = "desc"
            });

            var result = await _controller.UpdateItem(Id, new UpdateItemCommand()
            {
                Sku = "sku", Quantity = 3
            },
                                                      CancellationToken.None);

            result.Should().BeOfType <OkResult>();

            _repositoryMock.Verify(r =>
                                   r.Save(It.Is <BasketAggregate>(a => a.Id == Id && a.Items.FirstOrDefault().Quantity == 3),
                                          It.IsAny <CancellationToken>()));
        }
        public void BeIdempotent_WhenClearingEmptyBasket()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(new ClearItemsCommand());

            basketAggregate.HasBeenUpdated.Should().BeFalse();
            basketAggregate.Items.Should().BeEmpty();
        }
        public void BeUpdated_WhenAddingNewItem()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(_addItemCommand);

            basketAggregate.HasBeenUpdated.Should().BeTrue();
            basketAggregate.Items.Should()
            .ContainSingle(item => item.Quantity == 1)
            .And.AllBeEquivalentTo(_addItemCommand);
        }
        public void BeIdempotent_WhenRemovingNonExistingProduct()
        {
            var basketAggregate = new BasketAggregate(AggregateId);

            basketAggregate.Apply(new RemoveItemCommand
            {
                Sku = _addItemCommand.Sku
            });

            basketAggregate.HasBeenUpdated.Should().BeFalse();
            basketAggregate.Items.Should().NotContain(item => item.Sku == _addItemCommand.Sku);
        }