private async Task VerstuurUpdateBestelStatus(long factuurnummer, BffWebshopBestelStatus newStatus)
        {
            var status = newStatus.CastTo <DsBestelServiceBestelStatus>();

            var updateBestelStatusCommand = new UpdateBestelStatusCommand(
                factuurnummer: factuurnummer,
                bestelstatus: status,
                routingKey: NameConstants.BestelServiceUpdateBestelStatusCommandQueue
                );

            await _commandPublisher.Publish <long>(updateBestelStatusCommand);
        }
        public async Task HandleUpdateBestelStatus_ShouldThrowAnExcpetionWhenFindBestellingFailed()
        {
            // Arrange
            var bestelStatusCommand = new UpdateBestelStatusCommand(1, BestelStatus.Geplaatst, NameConstants.BestelServiceUpdateBestelStatusCommandQueue);

            _bestellingDataMapperMock.Setup(m => m.GetByFactuurnummer(1)).Throws(new Exception());

            // Act
            Func <Task> action = async() => await _target.HandleUpdateBestelStatus(bestelStatusCommand);

            // Assert
            var ex = await Assert.ThrowsExceptionAsync <DatabaseException>(action);

            Assert.AreEqual("Something unexpected happend while find bestelling in the database", ex.Message);
        }
        public async Task HandleUpdateBestelStatus_ShouldLowerStockWhenBestelStatusVerzonden()
        {
            // Arrange
            var artikel = new ArtikelBuilder()
                          .SetArtikelNummer(1)
                          .SetLeveranciercode("1-abc-xyz")
                          .SetNaam("Fietsband")
                          .SetPrijs(12.99m)
                          .Create();

            var existing = new Bestelling
            {
                Klantnummer  = 1234,
                BestelStatus = BestelStatus.WordtIngepakt,
                ContactInfo  = new ContactInfo(),
                Afleveradres = new Afleveradres(),
                BestelRegels = new List <BestelRegel>
                {
                    new BestelRegel {
                        Artikelnummer = 1, Aantal = 2
                    },
                }
            };

            var bestelStatusCommand = new UpdateBestelStatusCommand(1, BestelStatus.Verzonden, NameConstants.BestelServiceUpdateBestelStatusCommandQueue);

            _bestellingDataMapperMock.Setup(m => m.GetByFactuurnummer(1)).Returns(existing);
            _bestellingDataMapperMock.Setup(m => m.Update(It.IsAny <Bestelling>()));

            _eventPublisherMock.Setup(publisher => publisher.Publish(It.IsAny <DomainEvent>()));

            var response = new ResponseCommandMessage(JsonConvert.SerializeObject(true), "type", "correlationId");

            _commandSenderMock.Setup(sendr => sendr.SendCommandAsync(It.Is <RequestCommandMessage>(cm =>
                                                                                                   cm.RoutingKey == NameConstants.MagazijnServiceCommandQueue && cm.Type == NameConstants.MagazijnServiceHaalVoorraadUitMagazijnCommand
                                                                                                   ))).ReturnsAsync(response);

            // Act
            await _target.HandleUpdateBestelStatus(bestelStatusCommand);

            // Assert
            _nijnContextMock.VerifyAll();
            _bestellingDataMapperMock.VerifyAll();
            _eventPublisherMock.VerifyAll();
            _commandSenderMock.VerifyAll();
        }
        public async Task <long> HandleUpdateBestelStatus(UpdateBestelStatusCommand request)
        {
            var bestelling = GetBestellingByFactuurNummer(request.Factuurnummer);

            if (!bestelling.BestelStatus.UpdateIsAllowed(request.BestelStatus))
            {
                _logger.LogError("Invalid BestelStatus update, cannot update status {from} to {to}", bestelling.BestelStatus, request.BestelStatus);
                throw new InvalidUpdateException("BestelStatus update not allowed");
            }

            bestelling.BestelStatus = request.BestelStatus;
            UpdateBestelling(bestelling);

            if (bestelling.BestelStatus == BestelStatus.Verzonden)
            {
                await VerlaagVoorraad(bestelling);
            }

            _eventPublish.Publish(new BestelStatusBijgewerktEvent(bestelling, NameConstants.BestelServiceBestelStatusUpgedateEvent));
            return(request.Factuurnummer);
        }
        public async Task HandleUpdateBestelStatus_ShouldThrowAnExceptionWhenBestelStatusUpdateIsNotAllowed()
        {
            // Arrange
            var bestelStatusCommand = new UpdateBestelStatusCommand(1, BestelStatus.Afgerond, NameConstants.BestelServiceUpdateBestelStatusCommandQueue);

            var existing = new Bestelling {
                BestelStatus = BestelStatus.Geplaatst
            };

            _bestellingDataMapperMock.Setup(m => m.GetByFactuurnummer(1)).Returns(existing);
            _bestellingDataMapperMock.Setup(m => m.Update(It.IsAny <Bestelling>()))
            .Throws(new Exception());

            // Act
            Func <Task> action = async() => await _target.HandleUpdateBestelStatus(bestelStatusCommand);

            // Assert
            var ex = await Assert.ThrowsExceptionAsync <InvalidUpdateException>(action);

            Assert.AreEqual("BestelStatus update not allowed", ex.Message);
        }
        public async Task HandleUpdateBestelStatus_ShouldCallUpdateOnDataMapper()
        {
            // Arrange
            Bestelling bestelling          = null;
            var        bestelStatusCommand = new UpdateBestelStatusCommand(1, BestelStatus.Goedgekeurd, NameConstants.BestelServiceUpdateBestelStatusCommandQueue);

            _bestellingDataMapperMock.Setup(m => m.GetByFactuurnummer(1)).Returns(new Bestelling {
                BestelStatus = BestelStatus.Geplaatst
            });
            _bestellingDataMapperMock.Setup(m => m.Update(It.IsAny <Bestelling>()))
            .Callback <Bestelling>(b => bestelling = b);

            _eventPublisherMock.Setup(publisher => publisher.Publish(It.IsAny <DomainEvent>()));

            // Act
            var result = await _target.HandleUpdateBestelStatus(bestelStatusCommand);

            // Assert
            _bestellingDataMapperMock.VerifyAll();
            Assert.AreEqual(1, result);
            Assert.AreEqual(BestelStatus.Goedgekeurd, bestelling.BestelStatus);
        }