AdoS0ApiErrorsTests.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Admin.NET.Plugin.AiDOP.Infrastructure;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Xunit;
  5. namespace Admin.NET.Plugin.AiDOP.Tests.S0.Quality;
  6. public class AdoS0ApiErrorsTests
  7. {
  8. [Theory]
  9. [InlineData("/api/s0/quality/inspection-plans", true)]
  10. [InlineData("/API/S0/QUALITY/inspection-plans", true)]
  11. [InlineData("/api/v1/quality/inspection-plans", false)]
  12. public void R1_IsS0Request_PathBoundary_IsExpected(string path, bool expected)
  13. {
  14. Assert.Equal(expected, AdoS0ApiErrors.IsS0Request(path));
  15. }
  16. [Fact]
  17. public void R2_InvalidRequest_EmptyMessage_UsesDefaultMessage()
  18. {
  19. var result = AdoS0ApiErrors.InvalidRequest(" ");
  20. var body = Assert.IsType<AdoS0ApiErrorResponse>(result.Value);
  21. Assert.Equal(StatusCodes.Status400BadRequest, result.StatusCode);
  22. Assert.Equal(AdoS0ErrorCodes.InvalidRequest, body.Code);
  23. Assert.Equal("请求参数非法", body.Message);
  24. }
  25. [Fact]
  26. public void R2_WrapResult_NotFound_UsesUnifiedErrorEnvelope()
  27. {
  28. var wrapped = AdoS0ApiErrors.WrapResult(new NotFoundResult());
  29. var result = Assert.IsType<ObjectResult>(wrapped);
  30. var body = Assert.IsType<AdoS0ApiErrorResponse>(result.Value);
  31. Assert.Equal(StatusCodes.Status404NotFound, result.StatusCode);
  32. Assert.Equal(AdoS0ErrorCodes.RecordNotFound, body.Code);
  33. }
  34. [Fact]
  35. public void R2_TryMapUnhandledException_DuplicateKeyInKnownPath_MapsToBusinessDuplicateCode()
  36. {
  37. var ok = AdoS0ApiErrors.TryMapUnhandledException(
  38. "/api/s0/supply/suppliers",
  39. new InvalidOperationException("Duplicate entry 'S001' for key 'uq_supplier_code'"),
  40. out var result);
  41. Assert.True(ok);
  42. var obj = Assert.IsType<ObjectResult>(result);
  43. var body = Assert.IsType<AdoS0ApiErrorResponse>(obj.Value);
  44. Assert.Equal(StatusCodes.Status409Conflict, obj.StatusCode);
  45. Assert.Equal(AdoS0ErrorCodes.SupplierCodeExists, body.Code);
  46. }
  47. [Fact]
  48. public void R2_TryMapUnhandledException_DuplicateKeyInUnknownPath_UsesGenericDuplicateCode()
  49. {
  50. var ok = AdoS0ApiErrors.TryMapUnhandledException(
  51. "/api/s0/quality/raw-whitelists",
  52. new Exception("UNIQUE constraint failed: qms_lymjbmd.gysbm"),
  53. out var result);
  54. Assert.True(ok);
  55. var obj = Assert.IsType<ObjectResult>(result);
  56. var body = Assert.IsType<AdoS0ApiErrorResponse>(obj.Value);
  57. Assert.Equal(StatusCodes.Status409Conflict, obj.StatusCode);
  58. Assert.Equal(AdoS0ErrorCodes.DuplicateCode, body.Code);
  59. Assert.Equal("编码已存在", body.Message);
  60. }
  61. [Fact]
  62. public void R2_TryMapUnhandledException_NonDuplicateException_ReturnsInternalServerError()
  63. {
  64. var ok = AdoS0ApiErrors.TryMapUnhandledException(
  65. "/api/s0/quality/inspection-bases",
  66. new ApplicationException("db timeout"),
  67. out var result);
  68. Assert.True(ok);
  69. var obj = Assert.IsType<ObjectResult>(result);
  70. var body = Assert.IsType<AdoS0ApiErrorResponse>(obj.Value);
  71. Assert.Equal(StatusCodes.Status500InternalServerError, obj.StatusCode);
  72. Assert.Equal(AdoS0ErrorCodes.InternalServerError, body.Code);
  73. Assert.Equal("系统繁忙,请稍后再试", body.Message);
  74. }
  75. [Fact]
  76. public void R2_TryMapUnhandledException_NonS0Path_DoesNotHandle()
  77. {
  78. var ok = AdoS0ApiErrors.TryMapUnhandledException(
  79. "/api/system/users",
  80. new Exception("Duplicate entry"),
  81. out var result);
  82. Assert.False(ok);
  83. Assert.Null(result);
  84. }
  85. }