faultrecorddev_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package tools
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/mark3labs/mcp-go/mcp"
  6. "fwh-toolbox-server/domain"
  7. "fwh-toolbox-server/dto"
  8. faultRecordFile "fwh-toolbox-server/function/FaultRecordFile"
  9. proto "fwh-toolbox-server/function/FaultRecordProtocol"
  10. )
  11. func TestFrTaskState(t *testing.T) {
  12. cases := []struct {
  13. status domain.FaultRecordOpStatus
  14. want mcp.TaskStatus
  15. isError bool
  16. }{
  17. {domain.FaultRecordStatusPending, mcp.TaskStatusWorking, false},
  18. {domain.FaultRecordStatusUploading, mcp.TaskStatusWorking, false},
  19. {domain.FaultRecordStatusDone, mcp.TaskStatusCompleted, false},
  20. {domain.FaultRecordStatusItemFailed, mcp.TaskStatusCompleted, false},
  21. {domain.FaultRecordStatusCancelled, mcp.TaskStatusCancelled, true},
  22. {domain.FaultRecordStatusTimeout, mcp.TaskStatusFailed, true},
  23. {domain.FaultRecordStatusGatewayLocked, mcp.TaskStatusFailed, true},
  24. {domain.FaultRecordStatusError, mcp.TaskStatusFailed, true},
  25. }
  26. for _, c := range cases {
  27. d := &dto.FaultRecordOpDetail{FaultRecordOpSummary: dto.FaultRecordOpSummary{ID: "op1", Kind: "device_info", Status: string(c.status), CreatedAt: time.Now()}}
  28. st := frTaskState(d)
  29. if st.Status != c.want {
  30. t.Errorf("%s: status = %s,期望 %s", c.status, st.Status, c.want)
  31. }
  32. if st.Message == "" {
  33. t.Errorf("%s: 缺少状态说明", c.status)
  34. }
  35. if st.Status.IsTerminal() && (st.Result == nil || st.Result.IsError != c.isError) {
  36. t.Errorf("%s: 终态结果不符合预期(isError 期望 %v):%+v", c.status, c.isError, st.Result)
  37. }
  38. }
  39. }
  40. func TestFrRequest(t *testing.T) {
  41. req, err := frRequest(frDeviceArgs{SN: "G1"}, domain.FaultRecordOpDeviceInfo)
  42. if err != nil || req.Env != "prod" || req.DeviceType != proto.DeviceTypeAGate || req.GatewaySn != "G1" || req.Kind != "device_info" {
  43. t.Errorf("默认 aGate、prod:%+v %v", req, err)
  44. }
  45. req, err = frRequest(frDeviceArgs{SN: "G1", Env: "test", DeviceKind: proto.DeviceKindAPowerMPPT, DeviceSn: "P1"}, domain.FaultRecordOpParamRead)
  46. if err != nil || req.DeviceType != proto.DeviceTypeMPPT || req.DeviceSn != "P1" || req.Env != "test" {
  47. t.Errorf("aPowerMPPT 应映射为 mppt:%+v %v", req, err)
  48. }
  49. for _, bad := range []frDeviceArgs{
  50. {}, // 缺 sn
  51. {SN: "G1", Env: "dev"}, // 环境不对
  52. {SN: "G1", DeviceKind: "aPowerPE"}, // 非 aGate 缺 deviceSn
  53. {SN: "G1", DeviceKind: "dif"}, // 不支持的设备
  54. } {
  55. if _, err := frRequest(bad, domain.FaultRecordOpDeviceInfo); err == nil {
  56. t.Errorf("应拒绝:%+v", bad)
  57. }
  58. }
  59. }
  60. func TestWaveformSummary(t *testing.T) {
  61. w := faultRecordFile.Waveform{Points: 4, PrePoints: 2, SampleFrequency: 1000, Channels: []faultRecordFile.WaveformChannel{
  62. {Number: 0, Meaning: 0x0101, Values: []int16{3, -5, 7, 1}},
  63. }}
  64. s := waveformSummary(w)
  65. ch := s["channels"].([]map[string]any)[0]
  66. if ch["channel"] != "ch0 0x0101" || ch["min"] != int16(-5) || ch["max"] != int16(7) || ch["atTrigger"] != int16(7) {
  67. t.Errorf("通道统计不符合预期:%+v", ch)
  68. }
  69. if _, hasValues := ch["values"]; hasValues {
  70. t.Error("概要不应包含逐点数据")
  71. }
  72. }