public void UpdatesAssignmentInRepository_RaisesIntegrationEvent()
        {
            var assignment = new Domain.AssignmentToPointOfSale(Id, Guid.Empty, DateTimeOffset.UtcNow, null, Guid.Empty);

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

            repository.Setup(r => r.GetAsync(Id)).Returns(Task.FromResult <Domain.Assignment>(assignment)).Verifiable();
            repository.Setup(r => r.UpdateAsync(assignment)).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 <IAssignmentToPointOfSaleUpdated>(It.Is <IAssignmentToPointOfSaleUpdated>(e => ValidateEquality(e)))).Returns(Task.CompletedTask).Verifiable();

            var meansVerifier = new Mock <IAuthenticationMeansVerifier>(MockBehavior.Strict);

            meansVerifier.Setup(v => v.AssertExists(OfMeans)).Returns(Task.CompletedTask).Verifiable();

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

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

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

            Assert.IsTrue(result.Successful);
            ValidateEquality(assignment);
            repository.Verify();
            busPublisher.Verify();
            meansVerifier.Verify();
            posVerifier.Verify();
        }
        public async Task <IIdentifierResult> HandleAsync(ICreateAssignmentToPointOfSale command, ICorrelationContext context)
        {
            await Task.WhenAll(
                _meansVerifier.AssertExists(command.MeansId),
                _posVerifier.AssertExists(command.PointOfSaleId)
                );

            var assignment = new Domain.AssignmentToPointOfSale(command.Id, command.MeansId, command.ValidSince, command.ValidUntil, command.PointOfSaleId);
            await _repository.AddAsync(assignment);

            try
            {
                await _repository.SaveChanges();
            }
            catch (EntityAlreadyExistsException)
            {
                throw new BaristaException("assignment_to_point_of_sale_already_exists", $"An assignment with the ID '{command.Id}' already exists.");
            }

            try
            {
                await _exclVerifier.VerifyAssignmentExclusivity(command.MeansId);
            }
            catch (BaristaException)
            {
                await _repository.DeleteAsync(assignment);

                await _repository.SaveChanges();

                throw;
            }

            await _busPublisher.Publish(new AssignmentToPointOfSaleCreated(command.Id, command.MeansId, command.ValidSince, command.ValidUntil, command.PointOfSaleId));

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