package tools import ( "testing" "time" "github.com/mark3labs/mcp-go/mcp" "fwh-toolbox-server/domain" "fwh-toolbox-server/dto" faultRecordFile "fwh-toolbox-server/function/FaultRecordFile" proto "fwh-toolbox-server/function/FaultRecordProtocol" ) func TestFrTaskState(t *testing.T) { cases := []struct { status domain.FaultRecordOpStatus want mcp.TaskStatus isError bool }{ {domain.FaultRecordStatusPending, mcp.TaskStatusWorking, false}, {domain.FaultRecordStatusUploading, mcp.TaskStatusWorking, false}, {domain.FaultRecordStatusDone, mcp.TaskStatusCompleted, false}, {domain.FaultRecordStatusItemFailed, mcp.TaskStatusCompleted, false}, {domain.FaultRecordStatusCancelled, mcp.TaskStatusCancelled, true}, {domain.FaultRecordStatusTimeout, mcp.TaskStatusFailed, true}, {domain.FaultRecordStatusGatewayLocked, mcp.TaskStatusFailed, true}, {domain.FaultRecordStatusError, mcp.TaskStatusFailed, true}, } for _, c := range cases { d := &dto.FaultRecordOpDetail{FaultRecordOpSummary: dto.FaultRecordOpSummary{ID: "op1", Kind: "device_info", Status: string(c.status), CreatedAt: time.Now()}} st := frTaskState(d) if st.Status != c.want { t.Errorf("%s: status = %s,期望 %s", c.status, st.Status, c.want) } if st.Message == "" { t.Errorf("%s: 缺少状态说明", c.status) } if st.Status.IsTerminal() && (st.Result == nil || st.Result.IsError != c.isError) { t.Errorf("%s: 终态结果不符合预期(isError 期望 %v):%+v", c.status, c.isError, st.Result) } } } func TestFrRequest(t *testing.T) { req, err := frRequest(frDeviceArgs{SN: "G1"}, domain.FaultRecordOpDeviceInfo) if err != nil || req.Env != "prod" || req.DeviceType != proto.DeviceTypeAGate || req.GatewaySn != "G1" || req.Kind != "device_info" { t.Errorf("默认 aGate、prod:%+v %v", req, err) } req, err = frRequest(frDeviceArgs{SN: "G1", Env: "test", DeviceKind: proto.DeviceKindAPowerMPPT, DeviceSn: "P1"}, domain.FaultRecordOpParamRead) if err != nil || req.DeviceType != proto.DeviceTypeMPPT || req.DeviceSn != "P1" || req.Env != "test" { t.Errorf("aPowerMPPT 应映射为 mppt:%+v %v", req, err) } for _, bad := range []frDeviceArgs{ {}, // 缺 sn {SN: "G1", Env: "dev"}, // 环境不对 {SN: "G1", DeviceKind: "aPowerPE"}, // 非 aGate 缺 deviceSn {SN: "G1", DeviceKind: "dif"}, // 不支持的设备 } { if _, err := frRequest(bad, domain.FaultRecordOpDeviceInfo); err == nil { t.Errorf("应拒绝:%+v", bad) } } } func TestWaveformSummary(t *testing.T) { w := faultRecordFile.Waveform{Points: 4, PrePoints: 2, SampleFrequency: 1000, Channels: []faultRecordFile.WaveformChannel{ {Number: 0, Meaning: 0x0101, Values: []int16{3, -5, 7, 1}}, }} s := waveformSummary(w) ch := s["channels"].([]map[string]any)[0] if ch["channel"] != "ch0 0x0101" || ch["min"] != int16(-5) || ch["max"] != int16(7) || ch["atTrigger"] != int16(7) { t.Errorf("通道统计不符合预期:%+v", ch) } if _, hasValues := ch["values"]; hasValues { t.Error("概要不应包含逐点数据") } }