public async Task Activate_WhenCalledAndTokenNotExpired_FullAccountActivationExpected()
        {
            // ARRANGE
            _tokenProvider.IsTokenExpired(default(string), default(int)).ReturnsForAnyArgs(false);
            var actualUser = new User {
                Id = 99
            };
            var actualActivationToken = new AccountActivationToken
            {
                Token = "The token", UserId = actualUser.Id
            };

            _accountActivationTokenRepository
            .SingleOrDefaultAsync(Arg.Any <Expression <Func <AccountActivationToken, bool> > >())
            .Returns(x =>
            {
                var store = new List <AccountActivationToken> {
                    actualActivationToken
                };
                return(store.Single(x.ArgAt <Expression <Func <AccountActivationToken, bool> > >(0).Compile()));
            }
                     );
            actualUser.ActivationToken = actualActivationToken;
            AccountActivationToken tokenToDelete = null;

            _accountActivationTokenRepository.When(x => x.Delete(Arg.Any <AccountActivationToken>()))
            .Do(x => tokenToDelete = x.ArgAt <AccountActivationToken>(0));
            _userRepository.SingleOrDefaultAsync(Arg.Any <Expression <Func <User, bool> > >()).Returns(x =>
            {
                var store = new List <User> {
                    actualUser
                };
                return(store.Single(x.ArgAt <Expression <Func <User, bool> > >(0).Compile()));
            });
            _unitOfWork.When(x => x.CompleteAsync()).Do(x =>
            {
                if (tokenToDelete != null && tokenToDelete.UserId == actualActivationToken.UserId)
                {
                    actualUser.ActivationToken = null;
                }
            });
            var expected = new User {
                Id = 99, IsAccountActivated = true
            };

            // ACT
            await _sut.Activate(actualActivationToken.Token);

            // ASSERT
            actualUser.Should().BeEquivalentTo(expected);
        }
        public async Task Reregister_WhenCalledAndUserHasAlreadyToken_UpdatedTokenExpected()
        {
            // ARRANGE
            var actualUser = new User {
                Id = 99, Email = "*****@*****.**", IsAccountActivated = false
            };
            var newActivationToken = new AccountActivationToken {
                Token = "The new token"
            };

            _userRepository.SingleOrDefaultAsync(Arg.Any <Expression <Func <User, bool> > >()).Returns(x =>
            {
                var store = new List <User> {
                    actualUser
                };
                return(store.Single(x.ArgAt <Expression <Func <User, bool> > >(0).Compile()));
            });
            _tokenProvider.CreateToken().Returns(newActivationToken.Token);
            _accountActivationTokenRepository.SingleOrDefaultAsync(Arg.Any <Expression <Func <AccountActivationToken, bool> > >())
            .Returns(x =>
            {
                var store = new List <AccountActivationToken> {
                    new AccountActivationToken {
                        Token = "The old token", UserId = actualUser.Id
                    }
                };
                return(store.Single(x.ArgAt <Expression <Func <AccountActivationToken, bool> > >(0).Compile()));
            }
                     );
            AccountActivationToken accountActivationTokenToUpdate = null;

            _accountActivationTokenRepository.When(x => x.Update(Arg.Any <AccountActivationToken>())).Do(x =>
                                                                                                         accountActivationTokenToUpdate = x.ArgAt <AccountActivationToken>(0));
            var expected = new AccountActivationToken
            {
                UserId = actualUser.Id,
                Token  = newActivationToken.Token
            };
            var sut = _sut;

            // ACT
            await sut.Reregister(new UserForReregisterDto { Email = actualUser.Email });

            // ASSERT
            accountActivationTokenToUpdate.Should().BeEquivalentTo(expected);
            await _unitOfWork.Received().CompleteAsync();
        }
        public async Task Register_WhenCalled_ProperUserToAddExpected()
        {
            // ARRANGE
            var userForRegister = new UserForRegisterDto
            {
                Username = "******", Email = "*****@*****.**", Password = "******"
            };

            (string password, ComputedPassword computedPassword)password = (userForRegister.Password,
                                                                            ComputedPassword.Create(Encoding.ASCII.GetBytes("password hash"), Encoding.ASCII.GetBytes("password salt")));
            SetPasswordProvider(password);
            var newActivationToken = new AccountActivationToken {
                Token = "The token"
            };
            User userToAdd = null;

            _userRepository.When(x => x.AddAsync(Arg.Any <User>())).Do(x => { userToAdd = x.ArgAt <User>(0); });
            _tokenProvider.CreateToken().Returns(newActivationToken.Token);
            _accountActivationTokenRepository.SingleOrDefaultAsync(Arg.Any <Expression <Func <AccountActivationToken, bool> > >())
            .Returns((AccountActivationToken)null);
            var pendingUploadPhotosFolderName = Guid.NewGuid();

            SystemGuid.Set(() => pendingUploadPhotosFolderName);
            var expected = new User
            {
                Username        = userForRegister.Username,
                Email           = userForRegister.Email,
                ActivationToken = new AccountActivationToken {
                    Token = newActivationToken.Token
                },
                IsAccountActivated            = false,
                PendingUploadPhotosFolderName = pendingUploadPhotosFolderName.ToString("N"),
                PasswordHash = password.computedPassword.Hash,
                PasswordSalt = password.computedPassword.Salt
            };

            // ACT
            await _sut.Register(userForRegister);

            // ASSERT
            userToAdd.Should().BeEquivalentTo(expected);
            await _unitOfWork.Received().CompleteAsync();
        }