public static HttpClient SetupHttpClient(FakeHttpMessageHandler fakeHttpMessageHandler, Uri baseUri = null)
 {
     return new HttpClient(fakeHttpMessageHandler)
     {
         BaseAddress = baseUri ?? new Uri("http://localhost/WebApi/")
     };
 }
        public async Task PutItemAsyncReturnsHttpResponseExceptionTest()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.NotFound, new JsonContent(new Object()));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler);
            var sut = new RestClient(httpClient);

            await sut.PutItem("PutItemAsync", new TestResponseClass());
        } 
        public async Task GetItemAsyncReturnsHttpResponseExceptionTest()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.NotFound, new StringContent(string.Empty));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler);
            var sut = new RestClient(httpClient);

            await sut.GetItemAsync<object>("GetItemAsync");
        }       
        public async Task GetAsyncReturnsHttpResponseExceptionTest()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.NotFound, new JsonContent(new List<TestResponseClass>()));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler);
            var sut = new RestClient(httpClient);

            await sut.GetAsync<object>("GetAsync");
        }
        public async Task GetItemAsyncReturnsCorrectPopulatedClassTest()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.OK, new JsonContent(new TestResponseClass { ResponseContent = "content" }));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler);
            var sut = new RestClient(httpClient);

            var result = await sut.GetItemAsync<TestResponseClass>("GetItemAsync");
            Assert.AreEqual("content", result.ResponseContent);
        }
        public async Task GetItemAsyncReturnsCorrectClassTypeTest()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.OK, new JsonContent(new object()));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler);
            var sut = new RestClient(httpClient);

            var result = await sut.GetItemAsync<TestResponseClass>("GetItemAsync");
            Assert.AreEqual(typeof(TestResponseClass), result.GetType());
        }
        public async Task PostItemAsyncReturnsCorrectResponseTest()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.OK, new JsonContent("Test response"));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler, new Uri("http://localhost/WebApi/"));
            var sut = new RestClient(httpClient);

            var result = await sut.PostItemAsync<TestResponseClass, string>("PostItemAsync", new TestResponseClass());
            Assert.AreEqual("Test response", result);
        }
        public async Task RestClientImplementsJson()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.OK, new JsonContent(new object()));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler);
            var sut = new RestClient(httpClient);

            await sut.GetItemAsync<TestResponseClass>("GetAsync");

            Assert.IsTrue(fakeMessageHandler.Request.Headers.Accept.Contains(new MediaTypeWithQualityHeaderValue("application/json")));
        }
        public async Task RestClientCallsCorrectRouteTest()
        {
            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.OK, new JsonContent(new object()));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler, new Uri("http://localhost/WebApi/"));
            var sut = new RestClient(httpClient);

            await sut.PutItem("PutItemAsync", new TestResponseClass());

            Assert.AreEqual(fakeMessageHandler.Request.RequestUri, "http://localhost/WebApi/PutItemAsync");
        }
        public async Task GetAsyncReturnsCorrectPopulatedClassTest()
        {
            var testResponseClassList = new List<TestResponseClass>
            {
                new TestResponseClass {ResponseContent = "content1"},
                new TestResponseClass {ResponseContent = "content2"},
                new TestResponseClass {ResponseContent = "content3"}
            };

            var responseMessage = HttpClientHelper.SetupHttpResponseMessage(HttpStatusCode.OK, new JsonContent(testResponseClassList));
            var fakeMessageHandler = new FakeHttpMessageHandler(responseMessage);
            var httpClient = HttpClientHelper.SetupHttpClient(fakeMessageHandler);
            var sut = new RestClient(httpClient);

            var result = await sut.GetAsync<TestResponseClass>("GetAsync");
            var resultList = result.ToList();

            Assert.AreEqual(testResponseClassList[0].ResponseContent, resultList[0].ResponseContent);
            Assert.AreEqual(testResponseClassList[1].ResponseContent, resultList[1].ResponseContent);
            Assert.AreEqual(testResponseClassList[2].ResponseContent, resultList[2].ResponseContent);
        }