public async Task GetAsync_String_Success_Returns_Null_WhenNoSuccessCode()
        {
            // Arrange
            var url             = "https://api.github.com/users/test";
            var baseUrl         = "https://api.github.com";
            var mediaTypeHeader = "application/json";
            var userAgent       = "mvc-github-api-client";

            var mockMessageHandler = new Mock <HttpMessageHandler>();

            mockMessageHandler.Protected()
            .Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>())
            .ReturnsAsync(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.NotFound
            });

            var httpClient = new HttpClient(mockMessageHandler.Object);

            var httpClientFactoryMock = new Mock <IHttpClientFactory>(MockBehavior.Strict);

            httpClientFactoryMock.Setup(f => f.CreateHttpClient(baseUrl, mediaTypeHeader, userAgent)).Returns(httpClient);
            GithubApiClient githubApiClient = new GithubApiClient(httpClientFactoryMock.Object);

            // Act
            string result = await githubApiClient.GetAsync(url);

            // Assert
            Assert.Null(result);
        }
        public async Task GetAsync_String_Fail_ThrowsException()
        {
            // Arrange
            var url             = "https://api.github.com/users/test";
            var baseUrl         = "https://api.github.com";
            var mediaTypeHeader = "application/json";
            var userAgent       = "mvc-github-api-client";

            var mockMessageHandler = new Mock <HttpMessageHandler>();

            mockMessageHandler.Protected()
            .Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>())
            .Throws <HttpRequestException>();

            var httpClient = new HttpClient(mockMessageHandler.Object);

            var httpClientFactoryMock = new Mock <IHttpClientFactory>(MockBehavior.Strict);

            httpClientFactoryMock.Setup(f => f.CreateHttpClient(baseUrl, mediaTypeHeader, userAgent)).Returns(httpClient);
            GithubApiClient githubApiClient = new GithubApiClient(httpClientFactoryMock.Object);

            // Act & Assert
            await Assert.ThrowsAsync <HttpRequestException>(async() =>
            {
                await githubApiClient.GetAsync(url);
            });
        }
        public async Task GetAsync_Object_Success_Returns_Result()
        {
            // Arrange
            var url             = "https://api.github.com/users/test";
            var baseUrl         = "https://api.github.com";
            var mediaTypeHeader = "application/json";
            var userAgent       = "mvc-github-api-client";
            var responseJson    = "{\"login\":\"test\"}";
            var userResult      = new GithubUser
            {
                UserName = "******"
            };

            var mockMessageHandler = new Mock <HttpMessageHandler>();

            mockMessageHandler.Protected()
            .Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>())
            .ReturnsAsync(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent(responseJson)
            });

            var httpClient = new HttpClient(mockMessageHandler.Object);

            var httpClientFactoryMock = new Mock <IHttpClientFactory>(MockBehavior.Strict);

            httpClientFactoryMock.Setup(f => f.CreateHttpClient(baseUrl, mediaTypeHeader, userAgent)).Returns(httpClient);
            GithubApiClient githubApiClient = new GithubApiClient(httpClientFactoryMock.Object);

            // Act
            GithubUser result = await githubApiClient.GetAsync <GithubUser>(url);

            // Assert
            Assert.NotNull(result);
            Assert.IsType <GithubUser>(result);
            Assert.Equal(userResult.UserName, result.UserName);
        }