using System.Linq;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Util.Exceptions;
using Util.Microservices.Dapr.Tests.Samples;
namespace Util.Microservices.Dapr.Tests.Events;
///
/// 集成事件管理器测试
///
public class IntegrationEventManagerTest {
#region 测试初始化
///
/// 集成事件管理器
///
private readonly IntegrationEventManager _manager;
///
/// 模拟集成事件日志记录存储器
///
private readonly Mock _mockStore;
///
/// 模拟用户会话
///
private readonly Mock _mockSession;
///
/// 模拟获取应用标识
///
private readonly Mock _mockGetAppId;
///
/// 测试初始化
///
public IntegrationEventManagerTest() {
_mockStore = new Mock();
_mockSession = new Mock();
_mockGetAppId = new Mock();
var options = new Mock>();
options.Setup( t => t.Value ).Returns( new DaprOptions { Pubsub = { MaxRetry = 10 } } );
var log = new Mock>();
_manager = new IntegrationEventManager( _mockStore.Object, _mockSession.Object, _mockGetAppId.Object, options.Object, log.Object );
}
#endregion
#region CanSubscriptionAsync
///
/// 测试是否允许处理订阅 - 首次订阅
///
[Fact]
public async Task TestCanSubscriptionAsync_1() {
//参数定义
var eventId = "123";
var appId = "appid_sub";
var eventLog = new IntegrationEventLog {
Id = eventId,
State = EventState.Published
};
//设置模拟操作
_mockGetAppId.Setup( t => t.GetAppId() ).Returns( appId );
_mockStore.Setup( t => t.GetAsync( eventId, It.IsAny() ) ).ReturnsAsync( eventLog );
//创建订阅日志
var result = await _manager.CanSubscriptionAsync( eventId );
//验证
Assert.True( result );
}
///
/// 测试是否允许处理订阅 - 多次调用同一个订阅端口 - 前一个调用正在执行,不允许处理
///
[Fact]
public async Task TestCanSubscriptionAsync_2() {
//参数定义
var eventId = "123";
var appId = "appid_sub";
var eventLog = new IntegrationEventLog {
Id = eventId,
State = EventState.Published,
SubscriptionLogs = { new SubscriptionLog { AppId = appId, State = SubscriptionState.Processing } }
};
//设置模拟操作
_mockGetAppId.Setup( t => t.GetAppId() ).Returns( appId );
_mockStore.Setup( t => t.GetAsync( eventId, It.IsAny() ) ).ReturnsAsync( eventLog );
//创建订阅日志
var result = await _manager.CanSubscriptionAsync( eventId );
//验证
Assert.False( result );
}
///
/// 测试是否允许处理订阅 - 多次调用同一个订阅端口 - 前一个调用已成功完成,不允许处理
///
[Fact]
public async Task TestCanSubscriptionAsync_3() {
//参数定义
var eventId = "123";
var appId = "appid_sub";
var eventLog = new IntegrationEventLog {
Id = eventId,
State = EventState.Published,
SubscriptionLogs = { new SubscriptionLog { AppId = appId, State = SubscriptionState.Success } }
};
//设置模拟操作
_mockGetAppId.Setup( t => t.GetAppId() ).Returns( appId );
_mockStore.Setup( t => t.GetAsync( eventId, It.IsAny() ) ).ReturnsAsync( eventLog );
//创建订阅日志
var result = await _manager.CanSubscriptionAsync( eventId );
//验证
Assert.False( result );
}
///
/// 测试是否允许处理订阅 - 多次调用同一个订阅端口 - 前一个调用已失败,但重试次数还没有达到最大值,允许处理
///
[Fact]
public async Task TestCanSubscriptionAsync_4() {
//参数定义
var eventId = "123";
var appId = "appid_sub";
var eventLog = new IntegrationEventLog {
Id = eventId,
State = EventState.Published,
SubscriptionLogs = { new SubscriptionLog { AppId = appId, State = SubscriptionState.Fail, RetryCount = 9 } }
};
//设置模拟操作
_mockGetAppId.Setup( t => t.GetAppId() ).Returns( appId );
_mockStore.Setup( t => t.GetAsync( eventId, It.IsAny() ) ).ReturnsAsync( eventLog );
//创建订阅日志
var result = await _manager.CanSubscriptionAsync( eventId );
//验证
Assert.True( result );
}
///
/// 测试是否允许处理订阅 - 多次调用同一个订阅端口 - 前一个调用已失败,重试次数达到最大值,不允许处理
///
[Fact]
public async Task TestCanSubscriptionAsync_5() {
//参数定义
var eventId = "123";
var appId = "appid_sub";
var eventLog = new IntegrationEventLog {
Id = eventId,
State = EventState.Published,
SubscriptionLogs = { new SubscriptionLog { AppId = appId, State = SubscriptionState.Fail, RetryCount = 10 } }
};
//设置模拟操作
_mockGetAppId.Setup( t => t.GetAppId() ).Returns( appId );
_mockStore.Setup( t => t.GetAsync( eventId, It.IsAny() ) ).ReturnsAsync( eventLog );
//创建订阅日志
var result = await _manager.CanSubscriptionAsync( eventId );
//验证
Assert.False( result );
}
#endregion
#region CreatePublishLogAsync
///
/// 测试创建集成事件发布日志记录
///
[Fact]
public async Task TestCreatePublishLogAsync() {
//设置模拟时间
var time = new DateTime( 2000, 1, 1, 1, 1, 1 );
Time.SetTime( time );
//参数定义
var testEvent = new TestEvent( "code", "name" );
var cloudEvent = new CloudEvent