public void UpdatesStockItemInRepository_RaisesIntegrationEvent()
        {
            var stockItem = new Domain.StockItem(Id, "Old Display Name", Guid.Empty);

            var repository = new Mock <IStockItemRepository>(MockBehavior.Strict);

            repository.Setup(r => r.GetAsync(stockItem.Id)).Returns(Task.FromResult(stockItem)).Verifiable();
            repository.Setup(r => r.UpdateAsync(stockItem)).Returns(Task.CompletedTask).Verifiable();
            repository.Setup(r => r.SaveChanges()).Returns(Task.CompletedTask).Verifiable();

            var busPublisher = new Mock <IBusPublisher>(MockBehavior.Strict);

            busPublisher.Setup(p => p.Publish(It.Is <IStockItemUpdated>(e => ValidateEquality(e)))).Returns(Task.CompletedTask).Verifiable();

            var posVerifier = new Mock <IPointOfSaleVerifier>(MockBehavior.Strict);

            posVerifier.Setup(v => v.AssertExists(PosId)).Returns(Task.CompletedTask).Verifiable();

            var handler = new UpdateStockItemHandler(repository.Object, busPublisher.Object, posVerifier.Object);
            var result  = handler.HandleAsync(Cmd, new Mock <ICorrelationContext>().Object).GetAwaiter().GetResult();

            Assert.IsTrue(result.Successful);
            repository.Verify();
            busPublisher.Verify();
            posVerifier.Verify();
            ValidateEquality(stockItem);
        }
Example #2
0
        public async Task <IIdentifierResult> HandleAsync(ICreateStockItem command, ICorrelationContext context)
        {
            await _posVerifier.AssertExists(command.PointOfSaleId);

            var stockItem = new Domain.StockItem(command.Id, command.DisplayName, command.PointOfSaleId);
            await _repository.AddAsync(stockItem);

            try
            {
                await _repository.SaveChanges();
            }
            catch (EntityAlreadyExistsException)
            {
                throw new BaristaException("stock_item_already_exists", $"A stock item with the ID '{command.Id}' already exists.");
            }


            await _busPublisher.Publish(new StockItemCreated(stockItem.Id, stockItem.DisplayName, stockItem.PointOfSaleId));

            return(new IdentifierResult(stockItem.Id));
        }