BaseControllerTest.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using Admin.Core.Common.Cache;
  2. using Admin.Core.Common.Configs;
  3. using Admin.Core.Service.Admin.Auth.Input;
  4. using Admin.Tools.Captcha;
  5. using Newtonsoft.Json;
  6. using Newtonsoft.Json.Linq;
  7. using System.ComponentModel;
  8. using System.Linq;
  9. using System.Net;
  10. using System.Net.Http;
  11. using System.Net.Http.Headers;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using Xunit;
  15. namespace Admin.Core.Tests.Controller
  16. {
  17. public class BaseControllerTest : BaseTest
  18. {
  19. private readonly ICache _cache;
  20. private readonly ICaptcha _captcha;
  21. private readonly AppConfig _appConfig;
  22. protected BaseControllerTest()
  23. {
  24. _cache = GetService<ICache>();
  25. _captcha = GetService<ICaptcha>();
  26. _appConfig = GetService<AppConfig>();
  27. }
  28. public ByteArrayContent GetHttpContent(object input)
  29. {
  30. // HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(input));
  31. var content = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(input));
  32. var httpContent = new ByteArrayContent(content);
  33. httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json;charset=UTF-8");
  34. return httpContent;
  35. }
  36. public async Task<T> GetResult<T>(string apiPath, object input = null, bool checkStatus = true)
  37. {
  38. await Login();
  39. var res = await Client.GetAsync(apiPath);
  40. if (checkStatus)
  41. {
  42. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  43. }
  44. var content = await res.Content.ReadAsStringAsync();
  45. return JsonConvert.DeserializeObject<T>(content);
  46. }
  47. public async Task<T> PostResult<T>(string apiPath, object input = null, bool checkStatus = true)
  48. {
  49. await Login();
  50. var res = await Client.PostAsync(apiPath, GetHttpContent(input));
  51. if (checkStatus)
  52. {
  53. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  54. }
  55. var content = await res.Content.ReadAsStringAsync();
  56. return JsonConvert.DeserializeObject<T>(content);
  57. }
  58. public async Task<T> PutResult<T>(string apiPath, object input = null, bool checkStatus = true)
  59. {
  60. await Login();
  61. var res = await Client.PutAsync(apiPath, GetHttpContent(input));
  62. if (checkStatus)
  63. {
  64. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  65. }
  66. var content = await res.Content.ReadAsStringAsync();
  67. return JsonConvert.DeserializeObject<T>(content);
  68. }
  69. public async Task<T> DeleteResult<T>(string apiPath, object input = null, bool checkStatus = true)
  70. {
  71. await Login();
  72. var res = await Client.DeleteAsync(apiPath);
  73. if (checkStatus)
  74. {
  75. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  76. }
  77. var content = await res.Content.ReadAsStringAsync();
  78. return JsonConvert.DeserializeObject<T>(content);
  79. }
  80. public async Task<ResultDto<dynamic>> GetResult(string apiPath, object input = null, bool checkStatus = true)
  81. {
  82. return await GetResult<ResultDto<dynamic>>(apiPath, input, checkStatus);
  83. }
  84. public async Task<ResultDto<dynamic>> PostResult(string apiPath, object input = null, bool checkStatus = true)
  85. {
  86. return await PostResult<ResultDto<dynamic>>(apiPath, input, checkStatus);
  87. }
  88. public async Task<ResultDto<dynamic>> PutResult(string apiPath, object input = null, bool checkStatus = true)
  89. {
  90. return await PutResult<ResultDto<dynamic>>(apiPath, input, checkStatus);
  91. }
  92. public async Task<ResultDto<dynamic>> DeleteResult(string apiPath, object input = null, bool checkStatus = true)
  93. {
  94. return await DeleteResult<ResultDto<dynamic>>(apiPath, input, checkStatus);
  95. }
  96. public async Task Login(AuthLoginInput input = null)
  97. {
  98. var authorization = Client.DefaultRequestHeaders.FirstOrDefault(a => a.Key == "Authorization");
  99. if (authorization.Key != null)
  100. {
  101. return;
  102. }
  103. if (input == null && _appConfig.VarifyCode.Enable)
  104. {
  105. var res = await _captcha.GetAsync();
  106. var verifyCodeKey = string.Format(CacheKey.VerifyCodeKey, res.Token);
  107. var verifyCode = await _cache.GetAsync(verifyCodeKey);
  108. input = new AuthLoginInput()
  109. {
  110. UserName = "admin",
  111. Password = "111111",
  112. Captcha = new CaptchaInput { Token = res.Token, Data = JsonConvert.SerializeObject(new { X = verifyCode }) }
  113. };
  114. }
  115. //Client.DefaultRequestHeaders.Connection.Add("keep-alive");
  116. Client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36");
  117. var result = await Client.PostAsync($"/api/admin/auth/login", GetHttpContent(input));
  118. var content = await result.Content.ReadAsStringAsync();
  119. var jObject = JsonConvert.DeserializeObject<JObject>(content);
  120. var token = jObject["data"]["token"];
  121. Client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
  122. }
  123. public string ToParams(object source)
  124. {
  125. var stringBuilder = new StringBuilder(string.Empty);
  126. if (source == null)
  127. {
  128. return "";
  129. }
  130. var entries = from PropertyDescriptor property in TypeDescriptor.GetProperties(source)
  131. let value = property.GetValue(source)
  132. where value != null
  133. select (property.Name, value);
  134. foreach (var (name, value) in entries)
  135. {
  136. stringBuilder.Append(WebUtility.UrlEncode(name) + "=" + WebUtility.UrlEncode(value + "") + "&");
  137. }
  138. return stringBuilder.ToString().Trim('&');
  139. }
  140. }
  141. }