public async Task Handle(ReserveExpired 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.ReserveExpired, reserve.Quantity);

                skuStock.AvailableQuantity += reserve.Quantity;
                skuStock.ReservedQuantity  -= reserve.Quantity;
                skuStock.LastModified       = msg.CreatedTime;
                skuStock.CustomersReservationsTotal--;

                FillNewQuantities(history, skuStock);

                context.StockReserves.Remove(reserve);
                context.StockHistory.Add(history);

                await context.SaveChangesAsync();
            }
        }
Ejemplo n.º 2
0
        public async Task Given_no_stock_When_reserve_cancel_projected_Then_error_occurs()
        {
            var stockId = Guid.NewGuid();

            var reserveExpired = new ReserveExpired(stockId, Guid.NewGuid());
            await Assert.ThrowsAsync <SkuStockEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveExpired));
        }
Ejemplo n.º 3
0
        public async Task Given_no_reserve_When_reserve_expires_projected_Then_error_occurs()
        {
            var stockId = Guid.NewGuid();

            var stockCreatedEvent = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2));
            var reserveExpired    = new ReserveExpired(stockId, Guid.NewGuid());

            await ProjectionBuilder.Handle(stockCreatedEvent);

            await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveExpired));
        }
Ejemplo n.º 4
0
        public SkuStock_reserve_expired_tests()// Given_sku_created_and_stock_added_and_stock_reserved_messages_When_projected()
        {
            var stockId = Guid.NewGuid();

            _stockCreatedEvent    = new SkuStockCreated(stockId, Guid.NewGuid(), 1, TimeSpan.FromDays(2));
            _stockAddedEvent      = new StockAdded(stockId, 15, "test pack");
            _stockReservedEvent   = new StockReserved(stockId, Guid.NewGuid(), DateTime.Now.AddDays(1), 7);
            _reserveCanceledEvent = new ReserveExpired(stockId, _stockReservedEvent.ReserveId);

            ProjectionBuilder.Handle(_stockCreatedEvent).Wait();
            ProjectionBuilder.Handle(_stockAddedEvent).Wait();
            ProjectionBuilder.Handle(_stockReservedEvent).Wait();
            ProjectionBuilder.Handle(_reserveCanceledEvent).Wait();
        }
Ejemplo n.º 5
0
        public async Task Given_sku_created_and_stock_added_and_stock_reserved_messages_When_stock_expires_projected_twice()
        {
            var stockId = Guid.NewGuid();

            var stockCreatedEvent   = new SkuStockCreated(stockId, Guid.NewGuid(), 10, TimeSpan.FromDays(2));
            var stockReservedEvent  = new StockReserved(stockId, Guid.NewGuid(), DateTime.Now.AddDays(1), 7);
            var reserveExpiredEvent = new ReserveExpired(stockId, stockReservedEvent.ReserveId);

            await ProjectionBuilder.Handle(stockCreatedEvent);

            await ProjectionBuilder.Handle(stockReservedEvent);

            await ProjectionBuilder.Handle(reserveExpiredEvent);

            await Assert.ThrowsAsync <ReserveEntryNotFoundException>(() => ProjectionBuilder.Handle(reserveExpiredEvent));
        }