public async Task WhenRequestIsGetThenParametersAreAddedToUrl()
        {
            var settings    = TestConfiguration.GetSettings();
            var credentials = TestConfiguration.GetCredentials();

            var query = new StubQuery
            {
                Item1 = "Value"
            };

            using (var testHttpListener = new TestHttpListener(settings.URL, HttpStatusCode.OK, null))
            {
                bool containsItemInUrl = false;
                testHttpListener.MessageReceived += (sender, requestEventArgs) =>
                {
                    var request = requestEventArgs.Request;
                    containsItemInUrl = request.Url.Query.Contains("Item1") &&
                                        request.Url.Query.Contains("Value");
                };

                OauthRequestSender oauthSender = new OauthRequestSender(credentials, settings.URL);
                var apiRequest = new Request <bool>
                {
                    Uri        = "/fake/api",
                    HTTPMethod = HttpMethod.Get,
                    Query      = query
                };
                var user = await oauthSender.SendRequestAsync(apiRequest);

                Assert.IsTrue(containsItemInUrl);
            }
        }
        public void WhenSentRequestAndUnauthorizedThenExceptionIsThrown()
        {
            var settings    = TestConfiguration.GetSettings();
            var credentials = new Credentials(
                settings.CONSUMER_KEY,
                settings.CONSUMER_SECRET,
                settings.TOKEN,
                settings.TOKEN_SECRET);

            using (var testHttpListener = new TestHttpListener(settings.URL, HttpStatusCode.Forbidden, null))
            {
                OauthRequestSender api = new OauthRequestSender(credentials, settings.URL);
                var apiRequest         = new Request <bool>
                {
                    Uri        = "/fake/api",
                    HTTPMethod = HttpMethod.Get
                };
                Assert.ThrowsAsync <HttpRequestException>(async() => await api.SendRequestAsync(apiRequest));
            }
        }
        public async Task WhenRequestSentThenResponseIsDeserializedToObject()
        {
            var settings    = TestConfiguration.GetSettings();
            var credentials = TestConfiguration.GetCredentials();

            using (var testHttpListener = new TestHttpListener(settings.URL, HttpStatusCode.OK, "HTTPResponses/User.txt"))
            {
                OauthRequestSender oauthSender = new OauthRequestSender(credentials, settings.URL);
                var apiRequest = new Request <User>
                {
                    Uri        = "/fake/api",
                    HTTPMethod = HttpMethod.Get
                };
                var user = await oauthSender.SendRequestAsync(apiRequest);

                Assert.IsNotNull(user);
                Assert.IsNotNull(user.TokenKey);
                Assert.IsNotNull(user.TokenSecret);
                Assert.IsNotNull(user.UserId);
            }
        }
        public async Task WhenSendRequestThenAuthHeaderIsAdded()
        {
            var settings    = TestConfiguration.GetSettings();
            var credentials = TestConfiguration.GetCredentials();

            using (var testHttpListener = new TestHttpListener(settings.URL, HttpStatusCode.OK, "HTTPResponses/User.txt"))
            {
                bool containsAuthHeader = false;
                testHttpListener.MessageReceived += (sender, requestEventArgs) =>
                {
                    containsAuthHeader = requestEventArgs.Request.Headers["Authorization"] != null;
                };

                OauthRequestSender oauthSender = new OauthRequestSender(credentials, settings.URL);
                var apiRequest = new Request <User>
                {
                    Uri        = "/fake/api",
                    HTTPMethod = HttpMethod.Get
                };
                var user = await oauthSender.SendRequestAsync(apiRequest);

                Assert.IsTrue(containsAuthHeader);
            }
        }