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);
        }

        /// <summary>
        /// GET 请求
        /// (默认参数方式:url传参)
        /// </summary>
        /// <returns></returns>
        [Fact]
        public async Task GetAccount_Id_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

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

            responseMessage.EnsureSuccessStatusCode();

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

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

        /// <summary>
        ///  GET 请求
        /// (中文参数:现在浏览器直接支持,为最大兼容老旧浏览器使用url编码)
        /// </summary>
        /// <returns></returns>
        [Fact]
        public async Task GetAccountByName_Test()
        {
            HttpClient httpClient = new HttpClient()
            {
                BaseAddress = new Uri(TestConfig.WebApiBaseUrl),
            };

            var ChineseName = System.Net.WebUtility.UrlEncode("管理员01");
            var ChineseName2 = System.Net.WebUtility.UrlEncode("管理员02");

            //现在浏览器直接支持中文参数
            //var responseMessage = await httpClient.GetAsync("/api/Normal/GetAccountByName?ChineseName=管理员01&ChineseName2=管理员02");

            //兼容老浏览器写法
            var responseMessage = await httpClient.GetAsync($"/api/Normal/GetAccountByName?ChineseName={ChineseName}&ChineseName2={ChineseName2}");

            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.Equal(2, result.Data?.Count);
        }

        [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 GetAccountByService_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);
        }
    }
}