/// <summary>
        /// Returns info about the logged user
        /// according to logon request scope
        /// </summary>
        public MeResult GetMe(string accessToken)
        {
            int statusCode = 0;
            var res        = new MeResult();
            var serializer = new JavaScriptSerializer();

            try
            {
                string reqUri = (MeEndpoint
                                 + "?access_token={access_token}")
                                .Replace("{access_token}", accessToken);

                HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(reqUri);
                wr.AllowAutoRedirect = false;
                wr.KeepAlive         = true;
                HttpWebResponse retreiveResponse = (HttpWebResponse)wr.GetResponse();
                statusCode = (int)retreiveResponse.StatusCode;
                Stream       objStream = retreiveResponse.GetResponseStream();
                StreamReader objReader = new StreamReader(objStream);
                string       json      = objReader.ReadToEnd();
                retreiveResponse.Close();

                res = serializer.Deserialize <MeResult>(json);
            }
            catch (WebException wex)
            {
                HttpWebResponse wrs = (HttpWebResponse)wex.Response;
                throw new LogMeBotException((int)wrs.StatusCode, wex.Message);
            }
            catch (Exception ex)
            {
                throw new LogMeBotException(statusCode, ex.Message);
            }
            return(res);
        }
            public void GivenValidCredentials_AuthenticateClient_ReturnsAnAuthenticatedClientWithUserInformation()
            {
                // Arrange.
                var mockRestResponseAccessToken = new Mock <IRestResponse>();

                mockRestResponseAccessToken.Setup(x => x.StatusCode).Returns(HttpStatusCode.OK);
                mockRestResponseAccessToken.Setup(x => x.Content).Returns("access_token=foo&expires=1000");

                var meResult = new MeResult
                {
                    Id        = 1,
                    FirstName = "some firstname",
                    LastName  = "some lastname",
                    Link      = "http://whatever",
                    Locale    = "en-au",
                    Name      = "Hi there",
                    Timezone  = 10,
                    Username  = "******",
                    Verified  = true
                };

                var mockRestResponseApiMe = new Mock <IRestResponse <MeResult> >();

                mockRestResponseApiMe.Setup(x => x.StatusCode).Returns(HttpStatusCode.OK);
                mockRestResponseApiMe.Setup(x => x.Data).Returns(meResult);

                var mockRestClient = new Mock <IRestClient>();

                mockRestClient.Setup(x => x.Execute(It.IsAny <IRestRequest>()))
                .Returns(mockRestResponseAccessToken.Object);
                mockRestClient.Setup(x => x.Execute <MeResult>(It.IsAny <IRestRequest>()))
                .Returns(mockRestResponseApiMe.Object);

                var facebookProvider = new FacebookProvider(new ProviderParams {
                    Key = "a", Secret = "b"
                })
                {
                    RestClientFactory = new RestClientFactory(mockRestClient.Object)
                };
                const string existingState         = "Oops! - Tasselhoff Burrfoot";
                var          queryStringParameters = new NameValueCollection
                {
                    { "state", existingState },
                    { "code", "whatever" }
                };
                var facebookAuthenticationSettings = new FacebookAuthenticationServiceSettings
                {
                    State       = existingState,
                    CallBackUri = new Uri("http://2p1s.com")
                };

                // Act.
                var result =
                    facebookProvider.AuthenticateClient(facebookAuthenticationSettings, queryStringParameters);

                // Assert.
                Assert.NotNull(result);
                Assert.Equal("facebook", result.ProviderName);
                Assert.NotNull(result.AccessToken);
                Assert.NotNull(result.UserInformation);
                Assert.False(string.IsNullOrEmpty(result.UserInformation.Id));
                Assert.NotNull(result.UserInformation.Name);
                Assert.NotNull(result.UserInformation.UserName);
            }