public async Task AndUserDoesNotExist_NullIsReturnedAsync()
        {
            var loggerMock        = Mock.Of <ILogger <AccountManagerService> >();
            var clientFactoryMock = new Mock <IClientFactory>();
            var clientMock        = new Moq.Mock <ResourceAccess.ResourceAccessClient>();
            var expectedResponse  = new GetUserOnUserNameResponse
            {
                User = null
            };

            var fakeCall = TestCalls.AsyncUnaryCall <GetUserOnUserNameResponse>(Task.FromResult(new GetUserOnUserNameResponse()), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { });

            clientMock.Setup(m => m.GetUserOnUserNameAsync(Moq.It.IsAny <GetUserOnUserNameRequest>(), null, null, CancellationToken.None)).Returns(fakeCall);
            clientFactoryMock.Setup(c => c.AccountResourceAccessClient()).Returns(clientMock.Object);

            var appConfig = Mock.Of <IOptions <AppSettings> >();
            var service   = new AccountManagerService(loggerMock, clientFactoryMock.Object, appConfig);

            AuthenticateResponse authResponse = await service.Authenticate(new AuthenticateRequest { HashedPassword = "******", IpAddress = "123", UserName = "******" }, null);

            Assert.True(string.IsNullOrEmpty(authResponse.JwtToken));
            Assert.True(string.IsNullOrEmpty(authResponse.RefreshToken));
            Assert.True(string.IsNullOrEmpty(authResponse.Role));
            Assert.True(string.IsNullOrEmpty(authResponse.UserId));
            Assert.True(string.IsNullOrEmpty(authResponse.UserName));
        }
        public async Task ToAuthenticateAndUserExist_TokenIsReturnedAsync()
        {
            var loggerMock        = Mock.Of <ILogger <AccountManagerService> >();
            var clientFactoryMock = new Mock <IClientFactory>();
            var clientMock        = new Moq.Mock <ResourceAccess.ResourceAccessClient>();
            var expectedResponse  = new GetUserOnUserNameResponse
            {
                User = new UserMessage
                {
                    Firstname = "Firstname",
                    Lastname  = "Lastname",
                    UserId    = Guid.NewGuid().ToString(),
                    Role      = "User",
                    UserName  = "******",
                }
            };

            var fakeCall = TestCalls.AsyncUnaryCall <GetUserOnUserNameResponse>(Task.FromResult(expectedResponse), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { });

            clientMock.Setup(m => m.GetUserOnUserNameAsync(Moq.It.IsAny <GetUserOnUserNameRequest>(), null, null, CancellationToken.None)).Returns(fakeCall);

            var expectedUpdateResponse = new UpdateUserResponse
            {
                User = new UserMessage
                {
                    Firstname = "Firstname",
                    Lastname  = "Lastname",
                    UserId    = Guid.NewGuid().ToString(),
                    Role      = "User",
                    UserName  = "******"
                }
            };

            expectedUpdateResponse.User.RefreshTokens.Add(new RefreshTokenMessage
            {
                CreatedByIp = "123",
                Token       = "123123",
            });

            var fakeUIpdateCall = TestCalls.AsyncUnaryCall <UpdateUserResponse>(Task.FromResult(expectedUpdateResponse), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { });

            clientMock.Setup(m => m.UpdateUserAsync(Moq.It.IsAny <UpdateUserRequest>(), null, null, CancellationToken.None)).Returns(fakeUIpdateCall);

            clientFactoryMock.Setup(c => c.AccountResourceAccessClient()).Returns(clientMock.Object);

            var testoption = Options.Create(new AppSettings {
                SecretString = "secretStuff!ddddddddddddddddddddddddddddddddddddddddddddddddddddddgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"
            });
            var service = new AccountManagerService(loggerMock, clientFactoryMock.Object, testoption);

            AuthenticateResponse authResponse = await service.Authenticate(new AuthenticateRequest { HashedPassword = "******", IpAddress = "123", UserName = "******" }, null);

            Assert.False(string.IsNullOrEmpty(authResponse.JwtToken));
            Assert.False(string.IsNullOrEmpty(authResponse.RefreshToken));
            Assert.False(string.IsNullOrEmpty(authResponse.Role));
            Assert.False(string.IsNullOrEmpty(authResponse.UserId));
            Assert.False(string.IsNullOrEmpty(authResponse.UserName));
        }
        public override async Task <GetUserOnUserNameResponse> GetUserOnUserName(GetUserOnUserNameRequest request, ServerCallContext context)
        {
            _logger.LogInformation("Getting user on username  " + request.UserName);

            var currentUser = await Task.Run(() =>
            {
                return(_accountResource.GetAllUsers().SingleOrDefault(u => u.Username == request.UserName));
            });

            if (currentUser != null)
            {
                if (sha256_hash(currentUser.Password) == sha256_hash(request.HashedPassword))
                {
                    var result = new GetUserOnUserNameResponse
                    {
                        User = new UserMessage
                        {
                            UserId    = currentUser.Id.ToString(),
                            Firstname = currentUser.Firstname,
                            Lastname  = currentUser.Lastname,
                            Role      = currentUser.Role,
                            UserName  = currentUser.Username,
                        }
                    };
                    foreach (var token in currentUser.RefreshTokens)
                    {
                        result.User.RefreshTokens.Add(new RefreshTokenMessage {
                            Created        = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(token.Created),
                            CreatedByIp    = token.CreatedByIp,
                            Expires        = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(token.Expires),
                            Token          = token.Token,
                            Revoked        = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(token.Revoked ?? DateTime.MinValue),
                            RevokedByIp    = token.RevokedByIp,
                            RevokedByToken = token.RevokedByIp
                        });
                    }
                    return(result);
                }
            }

            return(new GetUserOnUserNameResponse());;
        }