BaseControllerTest.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using System.ComponentModel;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.Http;
  5. using System.Net.Http.Headers;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Newtonsoft.Json;
  9. using Newtonsoft.Json.Linq;
  10. using Xunit;
  11. using ZhonTai.Admin.Tools.Cache;
  12. using ZhonTai.Admin.Tools.Captcha;
  13. using ZhonTai.Admin.Core.Configs;
  14. using ZhonTai.Admin.Services.Auth.Dto;
  15. using ZhonTai.Admin.Core.Enums;
  16. using System.Collections.Generic;
  17. using ZhonTai.Admin.Core.Consts;
  18. namespace ZhonTai.Tests;
  19. public class BaseControllerTest : BaseTest
  20. {
  21. private readonly ICacheTool _cache;
  22. private readonly ICaptchaTool _captcha;
  23. private readonly AppConfig _appConfig;
  24. protected BaseControllerTest()
  25. {
  26. _cache = GetService<ICacheTool>();
  27. _captcha = GetService<ICaptchaTool>();
  28. _appConfig = GetService<AppConfig>();
  29. }
  30. public static HttpContent GetHttpContent(object input, string contentType = "application/json;charset=UTF-8", ContentTypeEnum contentTypeEnum = ContentTypeEnum.Json)
  31. {
  32. // HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(input));
  33. var content = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(input));
  34. HttpContent httpContent;
  35. if (contentTypeEnum == ContentTypeEnum.FormData)
  36. {
  37. httpContent = new FormUrlEncodedContent(JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(input)));
  38. }
  39. else
  40. {
  41. httpContent = new ByteArrayContent(content);
  42. }
  43. httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse(contentType);
  44. return httpContent;
  45. }
  46. public static HttpContent GetHttpContent(object input, ContentTypeEnum contentTypeEnum)
  47. {
  48. var contentType = contentTypeEnum switch
  49. {
  50. ContentTypeEnum.Json => "application/json;charset=UTF-8",
  51. ContentTypeEnum.FormData => "application/x-www-form-urlencoded;charset=UTF-8",
  52. _ => string.Empty
  53. };
  54. return GetHttpContent(input, contentType, contentTypeEnum);
  55. }
  56. public async Task<T> GetResult<T>(string apiPath, object input = null, bool checkStatus = true)
  57. {
  58. await Login();
  59. if (input != null)
  60. {
  61. var queryParams = ToParams(input);
  62. apiPath = apiPath.IndexOf('?') > -1 ? $"{apiPath}&{queryParams}" : $"{apiPath}?{queryParams}";
  63. }
  64. var res = await Client.GetAsync(apiPath);
  65. if (checkStatus)
  66. {
  67. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  68. }
  69. var content = await res.Content.ReadAsStringAsync();
  70. return content.NotNull() ? JsonConvert.DeserializeObject<T>(content) : default;
  71. }
  72. public async Task<T> PostResult<T>(string apiPath, object input = null, bool checkStatus = true, string contentType = "application/json;charset=UTF-8")
  73. {
  74. await Login();
  75. var res = await Client.PostAsync(apiPath, GetHttpContent(input, contentType));
  76. if (checkStatus)
  77. {
  78. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  79. }
  80. var content = await res.Content.ReadAsStringAsync();
  81. return content.NotNull() ? JsonConvert.DeserializeObject<T>(content) : default;
  82. }
  83. public async Task<string> PostResultAndGetContent(string apiPath, object input = null, bool checkStatus = true, string contentType = "application/json;charset=UTF-8")
  84. {
  85. //application/json;charset=UTF-8
  86. //application/x-www-form-urlencoded;charset=UTF-8
  87. await Login();
  88. var res = await Client.PostAsync(apiPath, GetHttpContent(input, contentType));
  89. if (checkStatus)
  90. {
  91. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  92. }
  93. var content = await res.Content.ReadAsStringAsync();
  94. return content;
  95. }
  96. public async Task<T> PutResult<T>(string apiPath, object input = null, bool checkStatus = true, string contentType = "application/json;charset=UTF-8")
  97. {
  98. await Login();
  99. var res = await Client.PutAsync(apiPath, GetHttpContent(input, contentType));
  100. if (checkStatus)
  101. {
  102. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  103. }
  104. var content = await res.Content.ReadAsStringAsync();
  105. return content.NotNull() ? JsonConvert.DeserializeObject<T>(content) : default;
  106. }
  107. public async Task<T> DeleteResult<T>(string apiPath, object input = null, bool checkStatus = true)
  108. {
  109. await Login();
  110. if (input != null)
  111. {
  112. var queryParams = ToParams(input);
  113. apiPath = apiPath.IndexOf('?') > -1 ? $"{apiPath}&{queryParams}" : $"{apiPath}?{queryParams}";
  114. }
  115. var res = await Client.DeleteAsync(apiPath);
  116. if (checkStatus)
  117. {
  118. Assert.Equal(HttpStatusCode.OK, res.StatusCode);
  119. }
  120. var content = await res.Content.ReadAsStringAsync();
  121. return content.NotNull() ? JsonConvert.DeserializeObject<T>(content) : default;
  122. }
  123. public async Task<ResultOutput<dynamic>> GetResult(string apiPath, object input = null, bool checkStatus = true)
  124. {
  125. return await GetResult<ResultOutput<dynamic>>(apiPath, input, checkStatus);
  126. }
  127. public async Task<ResultOutput<dynamic>> PostResult(string apiPath, object input = null, bool checkStatus = true, string contentType = "application/json;charset=UTF-8")
  128. {
  129. return await PostResult<ResultOutput<dynamic>>(apiPath, input, checkStatus, contentType);
  130. }
  131. public async Task<ResultOutput<dynamic>> PutResult(string apiPath, object input = null, bool checkStatus = true, string contentType = "application/json;charset=UTF-8")
  132. {
  133. return await PutResult<ResultOutput<dynamic>>(apiPath, input, checkStatus, contentType);
  134. }
  135. public async Task<ResultOutput<dynamic>> DeleteResult(string apiPath, object input = null, bool checkStatus = true)
  136. {
  137. return await DeleteResult<ResultOutput<dynamic>>(apiPath, input, checkStatus);
  138. }
  139. public async Task Login(AuthLoginInput input = null)
  140. {
  141. var authorization = Client.DefaultRequestHeaders.FirstOrDefault(a => a.Key == "Authorization");
  142. if (authorization.Key != null)
  143. {
  144. return;
  145. }
  146. if (input == null)
  147. {
  148. input = new AuthLoginInput()
  149. {
  150. UserName = "admin",
  151. Password = "111111"
  152. };
  153. if (_appConfig.VarifyCode.Enable)
  154. {
  155. var res = await _captcha.GetAsync(CacheKeys.Captcha);
  156. var captchaKey = CacheKeys.Captcha + res.Token;
  157. var captchaData = await _cache.GetAsync(captchaKey);
  158. input.Captcha = new CaptchaInput { CaptchaKey = CacheKeys.Captcha, Token = res.Token, Data = JsonConvert.SerializeObject(new { X = captchaData }) };
  159. }
  160. }
  161. //Client.DefaultRequestHeaders.Connection.Add("keep-alive");
  162. 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");
  163. var result = await Client.PostAsync($"/api/admin/auth/login", GetHttpContent(input));
  164. var content = await result.Content.ReadAsStringAsync();
  165. var jObject = JsonConvert.DeserializeObject<JObject>(content);
  166. var token = jObject["data"]["token"];
  167. Client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
  168. }
  169. public static string ToParams(object source)
  170. {
  171. var stringBuilder = new StringBuilder(string.Empty);
  172. if (source == null)
  173. {
  174. return "";
  175. }
  176. var entries = from PropertyDescriptor property in TypeDescriptor.GetProperties(source)
  177. let value = property.GetValue(source)
  178. where value != null
  179. select (property.Name, value);
  180. foreach (var (name, value) in entries)
  181. {
  182. stringBuilder.Append(WebUtility.UrlEncode(name) + "=" + WebUtility.UrlEncode(value + "") + "&");
  183. }
  184. return stringBuilder.ToString().Trim('&');
  185. }
  186. }