public async Task Handle(ReserveRenewed msg, IMessageMetadata metadata = null) { using (var context = _contextFactory()) { var skuStock = await context.SkuStocks.FindAsync(msg.SourceId); if (skuStock == null) { throw new SkuStockEntryNotFoundException(msg.SourceId); } var reserve = await context.StockReserves.FindAsync(msg.SourceId, msg.ReserveId); if (reserve == null) { throw new ReserveEntryNotFoundException(msg.SourceId); } var history = CreateHistory(skuStock, StockOperation.ReserveRenewed, reserve.Quantity); skuStock.ReservedQuantity -= reserve.Quantity; skuStock.AvailableQuantity += reserve.Quantity; skuStock.LastModified = msg.CreatedTime; skuStock.CustomersReservationsTotal--; FillNewQuantities(history, skuStock); context.StockReserves.Remove(reserve); context.StockHistory.Add(history); await context.SaveChangesAsync(); } }
public async Task Given_no_reserve_When_reserve_renewed_projected_Then_error_occurs() { var stockId = Guid.NewGuid(); var stockCreatedEvent = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2)); var reserveRenewed = new ReserveRenewed(stockId, Guid.NewGuid()); await ProjectionBuilder.Handle(stockCreatedEvent); await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveRenewed)); }
public SkuStock_renewed_tests()// Given_sku_created_and_reserved_and_reserve_expired_messages_When_projected() { var stockId = Guid.NewGuid(); _stockCreatedEvent = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2)); _stockReservedEvent = new StockReserved(stockId, Guid.NewGuid(), DateTime.Now.AddDays(1), 7); _stockReserveRenewedEvent = new ReserveRenewed(stockId, _stockReservedEvent.ReserveId); ProjectionBuilder.Handle(_stockCreatedEvent).Wait(); ProjectionBuilder.Handle(_stockReservedEvent).Wait(); ProjectionBuilder.Handle(_stockReserveRenewedEvent).Wait(); }
public async Task Given_sku_created_and_reserved_and_renewed_messages_When_projected() { var stockId = Guid.NewGuid(); var stockCreatedEvent = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2)); var stockReservedEvent = new StockReserved(stockId, Guid.NewGuid(), DateTime.Now.AddDays(1), 7); var reserveRenewed = new ReserveRenewed(stockId, stockReservedEvent.ReserveId); await ProjectionBuilder.Handle(stockCreatedEvent); await ProjectionBuilder.Handle(stockReservedEvent); await ProjectionBuilder.Handle(reserveRenewed); await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveRenewed)); }
public async Task Given_no_stock_When_reserve_taken_projected_Then_error_occurs() { var reserveRenewed = new ReserveRenewed(Guid.NewGuid(), Guid.NewGuid()); await Assert.ThrowsAsync <SkuStockEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveRenewed)); }