public async Task UpdateBestelStatus_ShouldRemoveBestellingFromSessionsWhenStatusIsVerzonden()
        {
            // Arrange
            var updateBestelStatus = new UpdateBestelStatus()
            {
                Status = BestelStatus.Verzonden,
            };

            var session = new MagazijnSessionEntity {
                Factuurnummer = 2
            };

            _commandPublisherMock.Setup(publisher => publisher.Publish <long>(It.Is <UpdateBestelStatusCommand>
                                                                                  (x => x.Factuurnummer == 1)))
            .ReturnsAsync(1);

            _magazijnSessionDataMapperMock.Setup(d => d.GetByFactuurnummer(1)).Returns(session);
            _magazijnSessionDataMapperMock.Setup(d => d.Delete(It.Is <MagazijnSessionEntity>(e =>
                                                                                             e.Factuurnummer == 2 && e.Id == session.GetKeyValue()
                                                                                             )));

            // Act
            var result = await _target.UpdateBestelStatus(1, updateBestelStatus);

            // Assert
            _commandPublisherMock.VerifyAll();
            _magazijnSessionDataMapperMock.VerifyAll();

            var requestResult = result as StatusCodeResult;

            Assert.IsNotNull(requestResult);
            Assert.AreEqual(200, requestResult.StatusCode);
        }
        public async Task UpdateBestelStatus_ShouldRemoveSessionFromDatabaseWhenBestelStatusIsVerzonden()
        {
            var factuurnummer = 10;
            var status        = new UpdateBestelStatus {
                Status = BestelStatus.Verzonden
            };

            var session = new MagazijnSessionEntity {
                MedewerkerEmail = "Email", Factuurnummer = factuurnummer
            };

            _dbContext.MagazijnSessions.Add(session);
            _dbContext.SaveChanges();

            var receiver = _nijnContext.CreateCommandReceiver(NameConstants.BestelServiceUpdateBestelStatusCommandQueue);

            receiver.DeclareCommandQueue();
            receiver.StartReceivingCommands(request => new ResponseCommandMessage("10", "Long", request.CorrelationId));

            var result = await _target.UpdateBestelStatus(factuurnummer, status);

            var queue = _nijnContext.CommandBus.Queues[NameConstants.BestelServiceUpdateBestelStatusCommandQueue];

            var okResult = result as OkResult;

            Assert.AreEqual(200, okResult.StatusCode);
            Assert.AreEqual(1, queue.CalledTimes);
            Assert.AreEqual(0, _dbContext.MagazijnSessions.Count());
        }
        public async Task UpdateBestelStatus_ShouldSendUpdateBestelStatusCommand()
        {
            var factuurnummer = 10;
            var status        = new UpdateBestelStatus {
                Status = BestelStatus.Afgerond
            };

            var receiver = _nijnContext.CreateCommandReceiver(NameConstants.BestelServiceUpdateBestelStatusCommandQueue);

            receiver.DeclareCommandQueue();
            receiver.StartReceivingCommands(request => new ResponseCommandMessage("10", "Long", request.CorrelationId));

            var result = await _target.UpdateBestelStatus(factuurnummer, status);

            var queue = _nijnContext.CommandBus.Queues[NameConstants.BestelServiceUpdateBestelStatusCommandQueue];

            var okResult = result as OkResult;

            Assert.AreEqual(200, okResult.StatusCode);
            Assert.AreEqual(1, queue.CalledTimes);
        }
        public async Task <IActionResult> UpdateBestelStatus(long factuurnummer, [FromBody] UpdateBestelStatus bestelStatus)
        {
            try
            {
                await VerstuurUpdateBestelStatus(factuurnummer, bestelStatus.Status);

                if (bestelStatus.Status == BffWebshopBestelStatus.Verzonden)
                {
                    var session = _magazijnSessionDataMapper.GetByFactuurnummer(factuurnummer);
                    _magazijnSessionDataMapper.Delete(session);
                }

                return(Ok());
            }
            catch (DatabaseException)
            {
                _logger.LogError("UpdateBestelStatusCommand resulted in a DatabaseException.");
                return(BadRequest("Factuurnummer is incorrect"));
            }
            catch (InvalidUpdateException e)
            {
                _logger.LogError("UpdateBestelStatusCommand resulted in a InvalidUpdateException");
                _logger.LogDebug("Exception message: {}", e.Message);
                return(BadRequest($"Update van bestelstatus naar: {bestelStatus.Status} is niet toegestaan"));
            }
            catch (TimeoutException)
            {
                _logger.LogError("UpdateBestelStatusCommand resulted in a TimeoutException.");
                return(StatusCode((int)HttpStatusCode.RequestTimeout, "Aanvraag kon niet worden verwerkt"));
            }
            catch (Exception ex)
            {
                _logger.LogError("UpdateBestelStatusCommand resulted in an internal server error.");
                _logger.LogDebug(
                    "Exception occured during execution of UpdateBestelStatusCommand {}, it threw exception: {}. Inner exception: {}",
                    bestelStatus.Status, ex.Message, ex.InnerException?.Message
                    );
                return(StatusCode((int)HttpStatusCode.InternalServerError));
            }
        }
        public async Task UpdateBestelStatus_Exception()
        {
            // Arrange
            var updateBestelStatus = new UpdateBestelStatus()
            {
                Status = BestelStatus.Goedgekeurd,
            };

            _commandPublisherMock.Setup(publisher => publisher.Publish <long>(It.Is <UpdateBestelStatusCommand>
                                                                                  (x => x.Factuurnummer == 1)))
            .ThrowsAsync(new Exception());

            // Act
            var result = await _target.UpdateBestelStatus(1, updateBestelStatus);

            // Assert
            _commandPublisherMock.VerifyAll();

            var requestResult = result as StatusCodeResult;

            Assert.IsNotNull(requestResult);
            Assert.AreEqual(500, requestResult.StatusCode);
        }
        public async Task UpdateBestelStatus_DatabaseException_ShouldReturnFactuurnummerError()
        {
            // Arrange
            var updateBestelStatus = new UpdateBestelStatus()
            {
                Status = BestelStatus.Goedgekeurd,
            };

            _commandPublisherMock.Setup(publisher => publisher.Publish <long>(It.Is <UpdateBestelStatusCommand>
                                                                                  (x => x.Factuurnummer == 1)))
            .ThrowsAsync(new DatabaseException("error"));

            // Act
            var result = await _target.UpdateBestelStatus(1, updateBestelStatus);

            // Assert
            _commandPublisherMock.VerifyAll();

            var badRequestResult = result as BadRequestObjectResult;

            Assert.IsNotNull(badRequestResult);
            Assert.AreEqual("Factuurnummer is incorrect", badRequestResult.Value);
        }
        public async Task UpdateBestelStatus_InvalidUpdateException()
        {
            // Arrange
            var updateBestelStatus = new UpdateBestelStatus()
            {
                Status = BestelStatus.Goedgekeurd,
            };

            _commandPublisherMock.Setup(publisher => publisher.Publish <long>(It.Is <UpdateBestelStatusCommand>
                                                                                  (x => x.Factuurnummer == 1)))
            .ThrowsAsync(new InvalidUpdateException());

            // Act
            var result = await _target.UpdateBestelStatus(1, updateBestelStatus);

            // Assert
            _commandPublisherMock.VerifyAll();

            var requestResult = result as ObjectResult;

            Assert.IsNotNull(requestResult);
            Assert.AreEqual(400, requestResult.StatusCode);
            Assert.AreEqual($"Update van bestelstatus naar: Goedgekeurd is niet toegestaan", requestResult.Value);
        }
        public async Task UpdateBestelStatus_TimeoutException()
        {
            // Arrange
            var updateBestelStatus = new UpdateBestelStatus()
            {
                Status = BestelStatus.Goedgekeurd,
            };

            _commandPublisherMock.Setup(publisher => publisher.Publish <long>(It.Is <UpdateBestelStatusCommand>
                                                                                  (x => x.Factuurnummer == 1)))
            .ThrowsAsync(new TimeoutException());

            // Act
            var result = await _target.UpdateBestelStatus(1, updateBestelStatus);

            // Assert
            _commandPublisherMock.VerifyAll();

            var requestResult = result as ObjectResult;

            Assert.IsNotNull(requestResult);
            Assert.AreEqual(408, requestResult.StatusCode);
            Assert.AreEqual("Aanvraag kon niet worden verwerkt", requestResult.Value);
        }