public void Should_create_a_new_user()
        {
            const int    LOGIN_ID      = 123;
            const string USERNAME      = "******";
            const string FIRST_NAME    = "first_name";
            const string LAST_NAME     = "last_name";
            const string EMAIL_ADDRESS = "email";
            var          externalId    = Guid.NewGuid().ToString();
            var          builder       = AccountCreated.CreateBuilder();

            builder
            .SetInternalId(LOGIN_ID.ToString())
            .SetUsername(USERNAME)
            .SetFirstName(FIRST_NAME)
            .SetLastName(LAST_NAME)
            .SetEmailAddress(EMAIL_ADDRESS)
            .SetSource(SourceSystem.STARCHEF)
            .SetExternalId(externalId);
            var payload = builder.Build();

            var validator = new Mock <IEventValidator>();

            validator.Setup(m => m.IsAllowedEvent(It.IsAny <object>())).Returns(true);
            validator.Setup(m => m.IsValidPayload(It.IsAny <object>())).Returns(true);

            var messagingLogger = new Mock <IMessagingLogger>();

            var dbCommands = new Mock <IDatabaseCommands>();

            dbCommands.Setup(m => m.IsUserExists(It.IsAny <int?>(), It.IsAny <string>(), It.IsAny <string>())).Returns(Task.FromResult(false)); // user is not exists

            var config  = new Mock <IConfiguration>();
            var handler = new AccountCreatedEventHandler(dbCommands.Object, validator.Object, config.Object, messagingLogger.Object);

            // act
            var result = handler.HandleAsync(payload, "1").Result;

            // assertions
            Assert.Equal(MessageHandlerResult.Success, result);
            // while check loginId AND loginName are used
            dbCommands.Verify(m => m.IsUserExists(It.Is <int?>(p => p.Value == LOGIN_ID), It.Is <string>(p => p == null), It.Is <string>(p => p == USERNAME)), Times.Once);
            dbCommands.Verify(m => m.AddUser(It.Is <AccountCreatedTransferObject>(p =>
                                                                                  p.EmailAddress == EMAIL_ADDRESS &&
                                                                                  p.Username == USERNAME &&
                                                                                  p.FirstName == FIRST_NAME &&
                                                                                  p.LastName == LAST_NAME &&
                                                                                  p.ExternalLoginId == externalId
                                                                                  )), Times.Once);
        }
        public void Should_updated_valid_data_and_log_to_messaging_events()
        {
            const int    LOGIN_ID      = 123;
            const string USERNAME      = "******";
            const string FIRST_NAME    = "first_name";
            const string LAST_NAME     = "last_name";
            const string EMAIL_ADDRESS = "email";
            var          externalId    = Guid.NewGuid().ToString();
            var          builder       = AccountCreated.CreateBuilder();

            builder
            .SetInternalId(LOGIN_ID.ToString())
            .SetUsername(USERNAME)
            .SetFirstName(FIRST_NAME)
            .SetLastName(LAST_NAME)
            .SetEmailAddress(EMAIL_ADDRESS)
            .SetSource(SourceSystem.STARCHEF)
            .SetExternalId(externalId);

            builder.AddPermissionSets("Star_Chef");

            var payload = builder.Build();

            var dbCommands = new Mock <IDatabaseCommands>();

            dbCommands.Setup(m => m.IsUserExists(It.IsAny <int?>(), It.IsAny <string>(), It.IsAny <string>())).Returns(Task.FromResult(true));
            dbCommands.Setup(m => m.OriginateLoginId(It.IsAny <int>(), It.IsAny <string>())).Returns(Task.FromResult(LOGIN_ID));

            var validator       = new AccountCreatedValidator(dbCommands.Object);
            var messagingLogger = new Mock <IMessagingLogger>();
            var config          = new Mock <IConfiguration>();
            var handler         = new AccountCreatedEventHandler(dbCommands.Object, validator, config.Object, messagingLogger.Object);

            var result = handler.HandleAsync(payload, "1").Result;

            // assertions
            Assert.Equal(MessageHandlerResult.Success, result);
            dbCommands.Verify(m => m.UpdateExternalId(It.Is <AccountCreatedTransferObject>(p =>
                                                                                           p.InternalLoginId == LOGIN_ID &&
                                                                                           p.ExternalLoginId == externalId
                                                                                           )), Times.Once);
            messagingLogger.Verify(m => m.MessageProcessedSuccessfully(It.Is <object>(p => ReferenceEquals(p, payload)), It.IsAny <string>()), Times.Once);
        }