瀏覽代碼

单元测试增加用户切换

qinchaoyue 6 月之前
父節點
當前提交
b7fb50ff67

+ 0 - 2
src/Hotline.Api/Controllers/OrderController.cs

@@ -3756,8 +3756,6 @@ public class OrderController : BaseController
         return rsp;
     }
 
-
-
     /// <summary>
     /// 临时保存
     /// </summary>

+ 13 - 9
src/Hotline.Application.Tests/DefaultHttpContextAccessor.cs → src/Hotline.Application.Tests/Controller/DefaultHttpContextAccessor.cs

@@ -1,4 +1,6 @@
-using Microsoft.AspNetCore.Http;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Identity.Accounts;
+using Microsoft.AspNetCore.Http;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -8,14 +10,15 @@ using System.Text;
 using System.Threading.Tasks;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
+using XF.Domain.Repository;
 
-namespace Hotline.Application.Tests;
+namespace Hotline.Application.Tests.Controller;
 public class DefaultHttpContextAccessor : ISessionContext, IScopeDependency
 {
     private HttpContext _content = new DefaultHttpContext();
 
     private HttpContext GetContext()
-    { 
+    {
         var context = new DefaultHttpContext();
         //var openId = new Claim(AppClaimTypes.OpenId, "测试生成的OpenId");
         var id = new ClaimsIdentity("身份");
@@ -27,28 +30,29 @@ public class DefaultHttpContextAccessor : ISessionContext, IScopeDependency
     }
     public HttpContext? HttpContext { get => GetContext(); set => _content = value; }
 
-  
 
-    public string? OpenId { get; set; }
+    public string? OpenId { get { return TestSessionConstants.OpenId; } set { } }
 
     /// <summary>
     /// Id of current tenant or null for host
     /// </summary>
-    public string? UserId { get; init; }
+    public string? UserId { get {
+            return TestSessionConstants.UserId;
+        } init { } }
 
     /// <summary>
     /// Id of current user or throw Exception for guest
     /// </summary>
     /// <exception cref="AuthenticationException"></exception>
     public string RequiredUserId { get; }
-    public string? UserName { get; init; }
+    public string? UserName { get { return TestSessionConstants.UserName; } init { } }
     public string? Phone { get; init; }
 
     /// <summary>
     /// Roles
     /// </summary>
-    public string[] Roles { get; init; }
-    public string? OrgId { get; init; }
+    public string[] Roles { get { return TestSessionConstants.Roles; } init { } }
+    public string? OrgId { get { return TestSessionConstants.OrgId;  } init { } }
     public string RequiredOrgId { get; }
     public string? OrgName { get; init; }
     public int OrgLevel { get; init; }

+ 37 - 15
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -1,10 +1,19 @@
 using AutoFixture;
 using Hotline.Api.Controllers;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Orders;
+using Hotline.Settings.Hotspots;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Tools;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Testing;
+using Microsoft.Extensions.DependencyInjection;
 using Moq;
 using Shouldly;
 using System;
@@ -12,32 +21,25 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using XF.Domain.Authentications;
+using XF.Domain.Repository;
 
 namespace Hotline.Application.Tests.Controller;
-public class OrderControllerTest : IClassFixture<WebApplicationFactory<Startup>>
+public class OrderControllerTest : TestBase
 {
     private readonly OrderController _orderController;
-    private readonly IFixture _fixture;
-    private readonly WebApplicationFactory<Startup> _factory;
+    private readonly IRepository<Hotspot> _hotspotRepository;
+    private readonly IOrderRepository _orderRepository;
 
-    public OrderControllerTest(OrderController orderController, WebApplicationFactory<Startup> factory)
-    //public OrderControllerTest(HttpClient testClient)
+    public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController, IOrderRepository orderRepository, IServiceScopeFactory scopeFactory) : base(accountRepository, roleRepository, userController, scopeFactory)
     {
-        _fixture = new Fixture();
+        _hotspotRepository = hotspotRepository;
         _orderController = orderController;
-        //_testClient = testClient;
-        _factory = factory;
         _orderController.ControllerContext = new ControllerContext
         {
             HttpContext = new DefaultHttpContext()
         };
-    }
-
-    [Fact]
-    public async Task SendSMS_Test()
-    {
-        var inDto = _fixture.Create<VisitSmsInDto>();
-        await _orderController.VisitPushSMSAsync(inDto);
+        _orderRepository = orderRepository;
     }
 
     [Fact]
@@ -48,4 +50,24 @@ public class OrderControllerTest : IClassFixture<WebApplicationFactory<Startup>>
         result.TimeText.ShouldBe("1个工作日");
         result.TimeType.ShouldBe(ETimeType.WorkDay);
     }
+
+    [Fact]
+    public async Task CreateOrder_Test()
+    {
+        await SetPaiDanYuan();
+        var orderDto = _fixture.Create<AddOrderDto>();
+        var hotspot = await _hotspotRepository.Queryable()
+            .OrderByDescending(m => m.CreationTime)
+            .FirstAsync();
+        orderDto.HotspotId = hotspot.Id;
+        orderDto.HotspotName = hotspot.HotSpotName;
+        orderDto.HotspotSpliceName = hotspot.HotSpotFullName;
+        orderDto.Files = new List<FileDto>();
+
+        var orderResult = await _orderController.Add(orderDto);
+        var orderId = orderResult.ToJson().FromJson<OrderDto>().Id;
+        var order = await _orderRepository.GetAsync(orderId);
+        order.ShouldNotBeNull();
+        order.CreatorId.ShouldBe(TestSessionConstants.UserId);
+    }
 }

+ 4 - 0
src/Hotline.Application.Tests/Hotline.Application.Tests.csproj

@@ -47,4 +47,8 @@
     <Using Include="Xunit" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Authentications\" />
+  </ItemGroup>
+
 </Project>

+ 24 - 0
src/Hotline.Application.Tests/Infrastructure/TestSettingConstants.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Application.Tests.Infrastructure;
+public static class TestSettingConstants
+{
+    public const string PaiDanYuanAccountName = "UnitTestPDY";
+}
+
+public static class TestSessionConstants
+{
+    public static string UserId = "";
+
+    public static string OpenId = "";
+
+    public static string[] Roles = [];
+
+    public static string UserName = "";
+
+    public static string OrgId = "";
+}

+ 7 - 17
src/Hotline.Application.Tests/Startup.cs

@@ -1,15 +1,9 @@
 using Microsoft.AspNetCore.Hosting;
 using Tr.Sdk;
 using Hotline.Repository.SqlSugar.Extensions;
-using Microsoft.AspNetCore.TestHost;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using Hotline.Api;
 using Microsoft.AspNetCore.Identity;
 using XF.Domain.Dependency;
@@ -19,36 +13,31 @@ using XF.Domain.Repository;
 using Hotline.Repository.SqlSugar;
 using Hotline.Repository.SqlSugar.DataPermissions;
 using Hotline.Configurations;
-using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Builder;
 using Xunit.DependencyInjection.AspNetCoreTesting;
-using Polly;
-using Hotline.Share.Tools;
-using Hotline.Users;
-using Hotline.Identity;
 using XF.Domain.Cache;
 using XF.EasyCaching;
 using Mapster;
 using Hotline.EventBus;
 using XF.Utility.MQ;
-using Microsoft.Extensions.DependencyInjection.Extensions;
 using DotNetCore.CAP;
 using XF.Domain.Options;
 using Hotline.Settings.TimeLimitDomain;
 using Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
-using Microsoft.AspNetCore.WebSockets;
 using Hotline.CallCenter.Configs;
 using MediatR;
 using Hotline.Application.Tests.Mock;
 using Hotline.Repository.SqlSugar.Ts;
 using Hotline.Application.CallCenter;
 using Hotline.Application.CallCenter.Calls;
-using Hotline.CallCenter.Configs;
-using Tr.Sdk;
 using Hotline.Application.StatisticalReport.CallReport;
 using XF.Domain.Authentications;
 using Hotline.Api.Controllers;
 using Hotline.Application.ExportExcel;
+using Hotline.Identity.Accounts;
+using Hotline.Application.Tests.Controller;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Authentications;
 
 namespace Hotline.Application.Tests;
 public class Startup
@@ -154,11 +143,12 @@ public class Startup
             services.AddScoped<ZiGongCallReportApplication>();
             services.AddScoped<YiBinCallReportApplication>();
             services.AddScoped<IMediator, MediatorMock>();
-            services.AddScoped<ISessionContext, DefaultHttpContextAccessor>();
             services.AddScoped<IExportApplication, ExportApplication>();
             services.AddScoped<OrderController>();
+            services.AddScoped<UserController>();
             services.AddScoped<PushMessageController>();
-
+            services.AddScoped<ISessionContext, DefaultHttpContextAccessor>();
+            services.AddScoped<ISessionContextProvider, SessionContextProvider>();
             //ServiceLocator.Instance = services.BuildServiceProvider();
         }
 

+ 84 - 0
src/Hotline.Application.Tests/TestBase.cs

@@ -0,0 +1,84 @@
+using AutoFixture;
+using Hotline.Api.Controllers;
+using Hotline.Application.Tests.Infrastructure;
+using Hotline.Identity.Accounts;
+using Hotline.Identity.Roles;
+using Hotline.Share.Dtos.Users;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.User;
+using Hotline.Users;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Tests;
+public class TestBase
+{
+    public readonly IAccountRepository _accountRepository;
+    public readonly IRepository<User> _userRepository;
+    public readonly IRepository<Role> _roleRepository;
+    public readonly UserController _userController;
+    public readonly IFixture _fixture;
+    private readonly IServiceScopeFactory _scopeFactory;
+
+    public TestBase(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository)
+    {
+        _fixture = new Fixture();
+        _accountRepository = accountRepository;
+        _roleRepository = roleRepository;
+        _userController = userController;
+        _userController.ControllerContext = new ControllerContext
+        {
+            HttpContext = new DefaultHttpContext()
+        };
+        _scopeFactory = scopeFactory;
+        _userRepository = userRepository;
+    }
+
+    public async Task SetPaiDanYuan()
+    {
+        await SetOperator("派单员", "市民热线服务中心", "单元测试派单员", "001", "13408389849", EUserType.Normal, TestSettingConstants.PaiDanYuanAccountName);
+    }
+
+    public async Task SetZuoXi()
+    {
+        await SetOperator("坐席", "市民热线服务中心", "单元测试派单员", "001", "13408389849", EUserType.Seat, TestSettingConstants.PaiDanYuanAccountName);
+    }
+
+    private async Task SetOperator(string displayName, string fullOrgName, string name, string orgId, string phoneNo, EUserType userType, string userName)
+    {
+        var account = await _accountRepository.GetExtAsync(
+            d => d.UserName == userName,
+            d => d.Includes(x => x.Roles));
+
+        if (account == null)
+        {
+            var roleId = await _roleRepository.Queryable()
+                .Where(m => m.DisplayName == displayName)
+                .Select(m => m.Id)
+                .FirstAsync();
+            var newUser = new AddUserDto
+            {
+                FullOrgName = fullOrgName,
+                Gender = EGender.Male,
+                Name = name,
+                OrgId = orgId,
+                PhoneNo = phoneNo,
+                RoleIds = [roleId],
+                UserType = userType,
+                UserName = userName 
+            };
+            var accountId = await _userController.Add(newUser);
+            TestSessionConstants.UserId = accountId;
+            account = await _accountRepository.GetExtAsync(
+                d => d.UserName == userName,
+                d => d.Includes(x => x.Roles));
+        }
+        var user = await _userRepository.GetAsync(account.Id);
+        TestSessionConstants.UserId = account.Id;
+        TestSessionConstants.Roles = account.Roles.Select(m => m.Id).ToArray();
+        TestSessionConstants.UserName = account.UserName;
+        TestSessionConstants.OrgId = user.OrgId;
+    }
+}

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderWaitedDto.cs

@@ -59,7 +59,7 @@ namespace Hotline.Share.Dtos.Order
 
         /// <summary>
         /// 1: 交办件
-        /// 2: 办件
+        /// 2: 办
         /// </summary>
         public int? TypeCode { get; set; }