S6ProcessInspectionPresentationTests.cs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Xunit;
  2. namespace Admin.NET.Plugin.AiDOP.Tests.S6.Manufacturing;
  3. /// <summary>
  4. /// S6 Phase 1E 展示收口契约:displayStatus/质量文案/history/disposition 展示、列表状态列、Approval Center deep-link。
  5. /// 纯展示层,不改业务真源;后端拥有业务中文语义,前端不猜。
  6. /// </summary>
  7. public class S6ProcessInspectionPresentationTests
  8. {
  9. private static string Svc() => File.ReadAllText(FindFile("server", "Plugins", "Admin.NET.Plugin.AiDOP", "Manufacturing", "S6ProcessInspectionReviewService.cs"));
  10. private static string Dto() => File.ReadAllText(FindFile("server", "Plugins", "Admin.NET.Plugin.AiDOP", "Manufacturing", "Dto", "S6ProcessInspectionReviewDto.cs"));
  11. private static string ListSvc() => File.ReadAllText(FindFile("server", "Plugins", "Admin.NET.Plugin.AiDOP", "Manufacturing", "S6ProductionInstructionService.cs"));
  12. private static string PendingList() => File.ReadAllText(FindFile("Web", "src", "views", "approvalFlow", "center", "components", "PendingList.vue"));
  13. [Fact]
  14. public void ReviewState_Has_DisplayFields()
  15. {
  16. var d = Dto();
  17. Assert.Contains("DisplayStatus", d);
  18. Assert.Contains("QualityText", d);
  19. Assert.Contains("S6DispositionView", d);
  20. Assert.Contains("List<S6ReviewHistoryItem> History", d);
  21. }
  22. [Fact]
  23. public void Service_Maps_BusinessChinese_NotRawCodes()
  24. {
  25. var s = Svc();
  26. // 节点/动作/质量/处置 → 业务中文映射
  27. Assert.Contains("\"提交审核\"", s);
  28. Assert.Contains("\"检验主管审核\"", s);
  29. Assert.Contains("\"质量处置\"", s);
  30. Assert.Contains("\"合格\"", s);
  31. Assert.Contains("\"不合格\"", s);
  32. Assert.Contains("\"已关闭\"", s);
  33. }
  34. [Fact]
  35. public void History_ReusesApprovalFlowLog_NoSecondHistory()
  36. {
  37. var s = Svc();
  38. Assert.Contains("FROM ApprovalFlowLog", s);
  39. Assert.Contains("LoadHistoryAsync", s);
  40. }
  41. [Fact]
  42. public void Disposition_DisplayOnly_DoesNotOverwriteQuality()
  43. {
  44. var s = Svc();
  45. Assert.Contains("LoadDispositionAsync", s);
  46. Assert.DoesNotContain("SET overall_result", s);
  47. }
  48. [Fact]
  49. public void List_Has_StatusColumns_NoRowMultiplication()
  50. {
  51. var l = ListSvc();
  52. Assert.Contains("BillId", l);
  53. Assert.Contains("OverallResult", l);
  54. Assert.Contains("FlowStatusRaw", l);
  55. // 去重子查询避免一工单多单据造成行膨胀
  56. Assert.Contains("MAX(id) AS bill_id", l);
  57. Assert.Contains("GROUP BY work_order_no", l);
  58. // 租户约束
  59. Assert.Contains("WHERE tenant_id=@TenantId GROUP BY work_order_no", l);
  60. }
  61. [Fact]
  62. public void ApprovalCenter_DeepLink_S6_ByBillId_NotWorkOrder()
  63. {
  64. var p = PendingList();
  65. Assert.Contains("S6_PROCESS_INSPECTION", p);
  66. Assert.Contains("goToS6", p);
  67. // S6 deep-link 用 billId=bizId(=bill.id),不按 WorkOrder 猜单据
  68. Assert.Contains("order-list?billId=", p);
  69. // goToS6 内不引 qms_gcjyd(限定在 S6 函数体内检查,不误伤其它 bizType 的历史 case)
  70. var s6fn = p.Substring(p.IndexOf("function goToS6"));
  71. s6fn = s6fn.Substring(0, s6fn.IndexOf('}') + 1);
  72. Assert.DoesNotContain("qms_gcjyd", s6fn);
  73. }
  74. private static string FindFile(params string[] parts)
  75. {
  76. var dir = new DirectoryInfo(AppContext.BaseDirectory);
  77. while (dir != null)
  78. {
  79. var candidate = Path.Combine(new[] { dir.FullName }.Concat(parts).ToArray());
  80. if (File.Exists(candidate)) return candidate;
  81. dir = dir.Parent;
  82. }
  83. throw new FileNotFoundException(string.Join("/", parts));
  84. }
  85. }