| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- using Admin.NET.Plugin.AiDOP.Service.S8;
- using Xunit;
- namespace Admin.NET.Plugin.AiDOP.Tests.S8;
- /// <summary>
- /// S8NotificationLayerResolver 静态契约单元测试。
- /// 实例方法 DispatchByLayerAsync 依赖 SqlSugarRepository + S8RoleResolver + S8NotificationPushAdapter,
- /// 在带 DB 的集成环境(dev DB seed: scene_code=S8_DEMO_DEFAULT/severity=HIGH/target=sys_admin/channel=SignalR)验证。
- /// 本文件覆盖渠道解析契约 + 静态防御。
- /// </summary>
- public class S8NotificationLayerResolverTests
- {
- [Fact]
- public void ParseChannels_NullOrEmpty_ReturnsEmpty()
- {
- Assert.Empty(S8NotificationLayerResolver.ParseChannels(null));
- Assert.Empty(S8NotificationLayerResolver.ParseChannels(""));
- Assert.Empty(S8NotificationLayerResolver.ParseChannels(" "));
- }
- [Fact]
- public void ParseChannels_Comma_TrimsAndSplits()
- {
- var r = S8NotificationLayerResolver.ParseChannels(" SignalR , Email , DingTalk ");
- Assert.Equal(new[] { "SignalR", "Email", "DingTalk" }, r);
- }
- [Fact]
- public void ParseChannels_Semicolon_AlsoSupported()
- {
- var r = S8NotificationLayerResolver.ParseChannels("Email;Sms;WorkWeixin");
- Assert.Equal(new[] { "Email", "Sms", "WorkWeixin" }, r);
- }
- [Fact]
- public void ParseChannels_Mixed_DropsEmpty()
- {
- var r = S8NotificationLayerResolver.ParseChannels("SignalR,;Email,,Sms");
- Assert.Equal(new[] { "SignalR", "Email", "Sms" }, r);
- }
- [Fact]
- public void DispatchByLayerInput_DefaultsAreSafe()
- {
- var x = new S8NotificationLayerResolver.DispatchByLayerInput();
- Assert.Equal(string.Empty, x.SceneCode);
- Assert.Equal(string.Empty, x.Severity);
- Assert.Equal(string.Empty, x.Title);
- Assert.Equal(string.Empty, x.Content);
- Assert.Null(x.ExceptionId);
- Assert.Null(x.ExceptionNo);
- Assert.Null(x.JumpUrl);
- Assert.False(x.Recovered);
- }
- [Fact]
- public void DispatchByLayerInput_RecoveredFlag_Settable()
- {
- var x = new S8NotificationLayerResolver.DispatchByLayerInput { Recovered = true };
- Assert.True(x.Recovered);
- }
- /// <summary>
- /// 验证 recovered 字段在 payload summary 中的布尔解析契约:
- /// Context["recovered"]="true"(大小写不敏感)→ true;其余 → false。
- /// </summary>
- [Theory]
- [InlineData("true", true)]
- [InlineData("True", true)]
- [InlineData("TRUE", true)]
- [InlineData("false", false)]
- [InlineData("", false)]
- [InlineData(null, false)]
- public void RecoveredContextValue_ParsesCorrectly(string? raw, bool expected)
- {
- var result = "true".Equals(raw, StringComparison.OrdinalIgnoreCase);
- Assert.Equal(expected, result);
- }
- }
|