public async Task Should_UseSendEmailService_ToSend_AccountConfimationEmail()
        {
            var options = SqliteInMemory.CreateOptions <ApplicationDbContext>();

            using (var context = new ApplicationDbContext(options))
            {
                // Arrange
                context.Database.EnsureCreated();

                var accountToCreate = new RegisterDto
                {
                    FirstName = "Test",
                    LastName  = "User",
                    Email     = "*****@*****.**",
                    Password  = "******"
                };

                var confirmationEmail     = "Test Confirmation Email";
                var userId                = "0001";
                var emailConfirmationCode = "1234";


                var user = _fixture.UserMock;
                user.Setup(m => m.Id).Returns(userId);
                user.Setup(m => m.Email).Returns(accountToCreate.Email);

                var store           = new Mock <IUserStore <ApplicationUser> >();
                var userManagerMock = new Mock <UserManager <ApplicationUser> >(store.Object, null, null, null, null, null, null, null, null);
                userManagerMock.Setup(m => m.CreateAsync(user.Object, "Password123!")).Returns(Task.FromResult(IdentityResult.Success));
                userManagerMock.Setup(m => m.GenerateEmailConfirmationTokenAsync(user.Object))
                .Returns(Task.FromResult(emailConfirmationCode));

                var errorFactoryMock = _fixture.ErrorFactoryMock;

                var mapperMock = _fixture.MapperMock;
                mapperMock.Setup(m => m.Map <RegisterDto, ApplicationUser>(accountToCreate)).Returns(user.Object);

                var sendEmailServiceMock = new Mock <ISendEmailService>();
                sendEmailServiceMock.Setup(m => m.SendAsync(accountToCreate.Email, "Confirm your account", confirmationEmail, accountToCreate.FirstName));
                sendEmailServiceMock.Setup(m => m.Status).Returns(new StatusGenericHandler());

                var confirmationEmailServiceMock = _fixture.ConfirmationEmailServiceMock;
                confirmationEmailServiceMock.Setup(m => m.ConfirmationEmail(accountToCreate.FirstName, userId, emailConfirmationCode)).Returns(confirmationEmail);

                var sut = new RegisterAccountService(userManagerMock.Object, context,
                                                     errorFactoryMock.Object, mapperMock.Object, sendEmailServiceMock.Object,
                                                     confirmationEmailServiceMock.Object);

                // Act
                await sut.RegisterAccount(accountToCreate);

                //Assert
                sendEmailServiceMock.Verify(m => m.SendAsync(accountToCreate.Email, "Confirm your account", confirmationEmail, accountToCreate.FirstName), Times.Once);
            }
        }
        public async Task Should_HaveErrors_When_PasswordNotProvided()
        {
            var options = SqliteInMemory.CreateOptions <ApplicationDbContext>();

            using (var context = new ApplicationDbContext(options))
            {
                // Arrange
                context.Database.EnsureCreated();

                var accountToCreate = new RegisterDto
                {
                    FirstName = "Test",
                    LastName  = "User",
                    Email     = "*****@*****.**",
                    Password  = "******"
                };

                var user            = _fixture.UserMock;
                var store           = new Mock <IUserStore <ApplicationUser> >();
                var userManagerMock = new Mock <UserManager <ApplicationUser> >(store.Object, null, null, null, null, null, null, null, null);
                userManagerMock.Setup(m => m.CreateAsync(user.Object, null)).Returns(Task.FromResult(IdentityResult.Success));

                var errorFactoryMock = _fixture.ErrorFactoryMock;

                var mapperMock = _fixture.MapperMock;
                mapperMock.Setup(m => m.Map <RegisterDto, ApplicationUser>(accountToCreate)).Returns(user.Object);

                var sendEmailServiceMock         = new Mock <ISendEmailService>();
                var confirmationEmailServiceMock = _fixture.ConfirmationEmailServiceMock;

                var sut = new RegisterAccountService(userManagerMock.Object, context,
                                                     errorFactoryMock.Object, mapperMock.Object, sendEmailServiceMock.Object,
                                                     confirmationEmailServiceMock.Object);

                // Act
                await sut.RegisterAccount(accountToCreate);

                //Assert
                sut.Status.HasErrors.ShouldBeTrue();
            }
        }
 public AccountCommandHandler(ILockService lockService, RegisterAccountService registerAccountService)
 {
     _lockService            = lockService;
     _registerAccountService = registerAccountService;
 }