public async Task ThenTheAuditCommandIsCalledWhenTheCommandIsValid()
        {
            //Arrange

            var command = new RemovePayeFromAccountCommand(HashedAccountId, PayeScheme, UserRef.ToString(), true, OrganisationName);


            //Act
            await _handler.Handle(command);

            //Assert
            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.ChangedProperties.SingleOrDefault(y => y.PropertyName.Equals("AccountId") && y.NewValue.Equals(AccountId.ToString())) != null &&
                                                                         c.EasAuditMessage.ChangedProperties.SingleOrDefault(y => y.PropertyName.Equals("UserId") && y.NewValue.Equals(UserRef.ToString())) != null &&
                                                                         c.EasAuditMessage.ChangedProperties.SingleOrDefault(y => y.PropertyName.Equals("PayeRef") && y.NewValue.Equals(PayeScheme)) != null)));

            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.Description.Equals($"User {UserRef.ToString()} has removed PAYE schema {PayeScheme} from account {AccountId}"))));

            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.RelatedEntities.SingleOrDefault(y => y.Id.Equals(AccountId.ToString()) && y.Type.Equals("Account")) != null)));

            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.AffectedEntity.Id.Equals(PayeScheme) &&
                                                                         c.EasAuditMessage.AffectedEntity.Type.Equals("Paye"))));
        }
        public async Task ThenTheAuditCommandIsCalledWhenTheCommandIsValid()
        {
            //Arrange
            var accountId = 123456;
            var command   = new RemovePayeFromAccountCommand
            {
                UserId          = "54256",
                HashedAccountId = "ABC123",
                PayeRef         = "3674826874623",
                RemoveScheme    = true
            };

            _hashingService.Setup(x => x.DecodeValue(It.IsAny <string>())).Returns(accountId);

            //Act
            await _handler.Handle(command);

            //Assert
            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.ChangedProperties.SingleOrDefault(y => y.PropertyName.Equals("AccountId") && y.NewValue.Equals(accountId.ToString())) != null &&
                                                                         c.EasAuditMessage.ChangedProperties.SingleOrDefault(y => y.PropertyName.Equals("UserId") && y.NewValue.Equals(command.UserId)) != null &&
                                                                         c.EasAuditMessage.ChangedProperties.SingleOrDefault(y => y.PropertyName.Equals("PayeRef") && y.NewValue.Equals(command.PayeRef)) != null)));

            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.Description.Equals($"User {command.UserId} has removed PAYE schema {command.PayeRef} from account {accountId}"))));

            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.RelatedEntities.SingleOrDefault(y => y.Id.Equals(accountId.ToString()) && y.Type.Equals("Account")) != null)));

            _mediator.Verify(x => x.SendAsync(It.Is <CreateAuditCommand>(c =>
                                                                         c.EasAuditMessage.AffectedEntity.Id.Equals(command.PayeRef) &&
                                                                         c.EasAuditMessage.AffectedEntity.Type.Equals("Paye"))));
        }
        public async Task ThenAnEventIsPublishedToNofifyThePayeSchemeHasBeenRemoved()
        {
            //Arrange
            var command = new RemovePayeFromAccountCommand(HashedAccountId, PayeScheme, UserRef.ToString(), true, OrganisationName);

            //Act
            await _handler.Handle(command);

            //Assert
            _payeSchemeEventFactory.Verify(x => x.CreatePayeSchemeRemovedEvent(command.HashedAccountId, command.PayeRef));
            _genericEventFactory.Verify(x => x.Create(It.IsAny <PayeSchemeRemovedEvent>()), Times.Once);
            _mediator.Verify(x => x.SendAsync(It.IsAny <PublishGenericEventCommand>()));
        }
        public async Task ThenAMessageIsQueuedForPayeSchemeRemoved()
        {
            //Arrange
            var command = new RemovePayeFromAccountCommand(HashedAccountId, PayeScheme, UserRef.ToString(), true, OrganisationName);

            //Act
            await _handler.Handle(command);

            //Assert
            _eventPublisher.Events.Should().HaveCount(1);

            var message = _eventPublisher.Events.OfType <DeletedPayeSchemeEvent>().Single();

            message.AccountId.Should().Be(AccountId);
            message.OrganisationName.Should().Be(OrganisationName);
            message.PayeRef.Should().Be(PayeScheme);
            message.UserName.Should().Be(UserName);
            message.UserRef.Should().Be(UserRef);
        }
        public async Task ThenAnEventIsPublishedToNofifyThePayeSchemeHasBeenRemoved()
        {
            //Arrange
            var command = new RemovePayeFromAccountCommand
            {
                UserId          = "54256",
                HashedAccountId = "ABC123",
                PayeRef         = "3674826874623",
                RemoveScheme    = true
            };

            //Act
            await _handler.Handle(command);

            //Assert
            _payeSchemeEventFactory.Verify(x => x.CreatePayeSchemeRemovedEvent(command.HashedAccountId, command.PayeRef));
            _genericEventFactory.Verify(x => x.Create(It.IsAny <PayeSchemeRemovedEvent>()), Times.Once);
            _mediator.Verify(x => x.SendAsync(It.IsAny <PublishGenericEventCommand>()));
        }