S8NotificationLogPayloadParseTests.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.Text.Json;
  2. using Xunit;
  3. namespace Admin.NET.Plugin.AiDOP.Tests.S8;
  4. /// <summary>
  5. /// S8NotificationLogQueryService.MapToDto payload 解析契约(S8-NOTIFY-AUDIT-LOG-API-1)
  6. /// MapToDto 是 private;此处复刻相同解析逻辑作等价契约测试。
  7. /// </summary>
  8. public class S8NotificationLogPayloadParseTests
  9. {
  10. private static (bool? success, bool? recovered, int? targetCount, string? error) ParsePayload(string? payload)
  11. {
  12. if (string.IsNullOrWhiteSpace(payload)) return (null, null, null, null);
  13. try
  14. {
  15. using var doc = JsonDocument.Parse(payload);
  16. var root = doc.RootElement;
  17. bool? success = null;
  18. if (root.TryGetProperty("success", out var sv) && (sv.ValueKind == JsonValueKind.True || sv.ValueKind == JsonValueKind.False))
  19. success = sv.GetBoolean();
  20. bool? recovered = null;
  21. if (root.TryGetProperty("recovered", out var rv) && (rv.ValueKind == JsonValueKind.True || rv.ValueKind == JsonValueKind.False))
  22. recovered = rv.GetBoolean();
  23. int? targetCount = null;
  24. if (root.TryGetProperty("targetCount", out var tc) && tc.ValueKind == JsonValueKind.Number)
  25. targetCount = tc.GetInt32();
  26. string? error = null;
  27. if (root.TryGetProperty("error", out var ev) && ev.ValueKind == JsonValueKind.String)
  28. error = ev.GetString();
  29. return (success, recovered, targetCount, error);
  30. }
  31. catch { return (null, null, null, null); }
  32. }
  33. [Fact]
  34. public void CreatedPayload_ParsesAllFields()
  35. {
  36. var json = "{\"title\":\"T\",\"recovered\":false,\"success\":true,\"targetCount\":3,\"error\":null}";
  37. var (success, recovered, targetCount, error) = ParsePayload(json);
  38. Assert.True(success);
  39. Assert.False(recovered);
  40. Assert.Equal(3, targetCount);
  41. Assert.Null(error);
  42. }
  43. [Fact]
  44. public void RecoveredPayload_RecoveredTrue()
  45. {
  46. var json = "{\"recovered\":true,\"success\":true,\"targetCount\":1,\"error\":null}";
  47. var (success, recovered, targetCount, _) = ParsePayload(json);
  48. Assert.True(success);
  49. Assert.True(recovered);
  50. Assert.Equal(1, targetCount);
  51. }
  52. [Fact]
  53. public void FailedPush_SuccessFalse_ErrorPresent()
  54. {
  55. var json = "{\"recovered\":false,\"success\":false,\"targetCount\":0,\"error\":\"channel_disabled_by_config\"}";
  56. var (success, recovered, _, error) = ParsePayload(json);
  57. Assert.False(success);
  58. Assert.False(recovered);
  59. Assert.Equal("channel_disabled_by_config", error);
  60. }
  61. [Fact]
  62. public void NullPayload_ReturnsAllNull()
  63. {
  64. var (success, recovered, targetCount, error) = ParsePayload(null);
  65. Assert.Null(success);
  66. Assert.Null(recovered);
  67. Assert.Null(targetCount);
  68. Assert.Null(error);
  69. }
  70. [Fact]
  71. public void InvalidJson_ReturnsAllNull_NoBoomNoThrow()
  72. {
  73. var (success, recovered, targetCount, error) = ParsePayload("not-json{{{");
  74. Assert.Null(success);
  75. Assert.Null(recovered);
  76. Assert.Null(targetCount);
  77. Assert.Null(error);
  78. }
  79. [Fact]
  80. public void TruncatedPayload_ReturnsAllNull()
  81. {
  82. var (success, recovered, targetCount, error) = ParsePayload("{\"recovered\":true,\"success\":tru...");
  83. Assert.Null(success);
  84. Assert.Null(recovered);
  85. Assert.Null(targetCount);
  86. Assert.Null(error);
  87. }
  88. }