using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Net.Http.Json;

namespace HttpClientStudy.UnitTest
{
    /// <summary>
    /// 基础HttpClient 测试
    /// </summary>
    public class NormalHttpClientTest
    {
        private readonly ITestOutputHelper _logger;

        public NormalHttpClientTest(ITestOutputHelper outputHelper) 
        {
            _logger = outputHelper;
        }

        #region Get请求

        [Fact]
        public async Task GetAllAccounts_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var responseMessage = await  httpClient.GetAsync("/api/Normal/GetAllAccounts");

            responseMessage.EnsureSuccessStatusCode();

            Assert.NotNull(responseMessage);
            Assert.True(responseMessage.IsSuccessStatusCode);

            var result = await responseMessage.Content.ReadFromJsonAsync<BaseResult<List<Account>>>();
            Assert.IsType<BaseResult<List<Account>>>(result);
            Assert.Equal(1, result.Code);
            Assert.NotNull(result.Data);
        }

        [Fact]
        public async Task GetAccount_Id_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccount");

            responseMessage.EnsureSuccessStatusCode();

            Assert.NotNull(responseMessage);
            Assert.True(responseMessage.IsSuccessStatusCode);

            var result = await responseMessage.Content.ReadFromJsonAsync<BaseResult<List<Account>>>();
            Assert.IsType<BaseResult<List<Account>>>(result);
            Assert.Equal(1, result.Code);
            Assert.NotNull(result.Data);
        }

        [Fact]
        public async Task GetAccount_Name_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccount");

            responseMessage.EnsureSuccessStatusCode();

            Assert.NotNull(responseMessage);
            Assert.True(responseMessage.IsSuccessStatusCode);

            var result = await responseMessage.Content.ReadFromJsonAsync<BaseResult<List<Account>>>();
            Assert.IsType<BaseResult<List<Account>>>(result);
            Assert.Equal(1, result.Code);
            Assert.NotNull(result.Data);
        }

        [Fact]
        public async Task GetAccountByRole_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccountByRole");

            responseMessage.EnsureSuccessStatusCode();

            Assert.NotNull(responseMessage);
            Assert.True(responseMessage.IsSuccessStatusCode);

            var result = await responseMessage.Content.ReadFromJsonAsync<BaseResult<List<Account>>>();
            Assert.IsType<BaseResult<List<Account>>>(result);
            Assert.Equal(1, result.Code);
            Assert.NotNull(result.Data);
        }

        [Fact]
        public async Task GetAccount_Service_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccountFromServices");

            responseMessage.EnsureSuccessStatusCode();

            Assert.NotNull(responseMessage);
            Assert.True(responseMessage.IsSuccessStatusCode);

            var result = await responseMessage.Content.ReadFromJsonAsync<BaseResult<List<Account>>>();
            Assert.IsType<BaseResult<List<Account>>>(result);
            Assert.Equal(1, result.Code);
            Assert.NotNull(result.Data);
        }
        #endregion

        /// <summary>
        /// Put 请求
        /// </summary>
        /// <returns></returns>
        [Fact]
        public async Task PutDemo_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var responseMessage = await httpClient.GetAsync("/api/Normal/PutDemo");

            responseMessage.EnsureSuccessStatusCode();

            Assert.NotNull(responseMessage);
            Assert.True(responseMessage.IsSuccessStatusCode);

            var result = await responseMessage.Content.ReadFromJsonAsync<BaseResult<List<Account>>>();
            Assert.IsType<BaseResult<List<Account>>>(result);
            Assert.Equal(1, result.Code);
            Assert.NotNull(result.Data);
        }

        /// <summary>
        /// Head 请求
        /// </summary>
        /// <returns></returns>
        [Fact]
        public async Task HeadDemo_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var responseMessage = await httpClient.GetAsync("/api/Normal/HeadDemo");

            responseMessage.EnsureSuccessStatusCode();

            Assert.NotNull(responseMessage);
            Assert.True(responseMessage.IsSuccessStatusCode);

            var result = await responseMessage.Content.ReadFromJsonAsync<BaseResult<List<Account>>>();
            Assert.IsType<BaseResult<List<Account>>>(result);
            Assert.Equal(1, result.Code);
            Assert.NotNull(result.Data);
        }
    }
}