package services import ( "encoding/json" "os" "strings" "testing" "fwh-toolbox-server/domain" ) const deviceInfoHar = "../../docs/fault-record/设备信息.test.franklinwh.com.har" // 从 HAR 中取出指定接口的 result func harResult[T any](t *testing.T, api string) *T { t.Helper() b, err := os.ReadFile(deviceInfoHar) if err != nil { t.Skipf("har not found: %v", err) } var har struct { Log struct { Entries []struct { Request struct{ URL string } `json:"request"` Response struct { Content struct{ Text string } `json:"content"` } `json:"response"` } `json:"entries"` } `json:"log"` } if err := json.Unmarshal(b, &har); err != nil { t.Fatal(err) } for _, e := range har.Log.Entries { if strings.Contains(e.Request.URL, "/manage/"+api) { var res domain.FwhResponse[T] if err := json.Unmarshal([]byte(e.Response.Content.Text), &res); err != nil { t.Fatal(err) } return res.Result } } t.Fatalf("%s not in har", api) return nil } func TestBuildFaultRecordDevicesFromHar(t *testing.T) { devInfo := harResult[domain.FwhDeviceInfo](t, "getDeviceInfo") power := harResult[domain.FwhGatewayPower](t, "selectGatewayPower") got := BuildFaultRecordDevices("10070052S00X25150083", devInfo, power) var lines []string for _, d := range got { ver := -1 if d.HwVer != nil { ver = *d.HwVer } lines = append(lines, d.Kind+"|"+d.Sn+"|"+d.Model+"|"+map[bool]string{true: "ok", false: "pending"}[d.Supported]+"|"+string(rune('0'+ver%10))) t.Logf("%-10s %-22s %-9s type=%-5q supported=%v hwVer=%d", d.Kind, d.Sn, d.Model, d.Type, d.Supported, ver) } want := []string{ "aGate|10070052S00X25150083||ok", "aPowerPE|10050015S00W24240002|aPower 2|ok", "aPowerPE|10050019S01X25350643|aPower S|ok", "aPowerMPPT|10050019S01X25350643|aPower S|ok", // 版本 21 支持 MPPT "aHub|10070053S00X25270092||ok", } if len(got) != len(want) { t.Fatalf("devices = %d, want %d", len(got), len(want)) } for i, w := range want { if !strings.HasPrefix(lines[i], w) { t.Errorf("device %d = %s, want prefix %s", i, lines[i], w) } } } func TestBuildFaultRecordDevicesFallback(t *testing.T) { // getDeviceInfo 失败时退回站点信息的 fhpSn:没有硬件版本,不生成 aPower-MPPT got := BuildFaultRecordDevices("GW", &domain.FwhDeviceInfo{FhpSn: "A1, A2"}, nil) if len(got) != 3 || got[1].Sn != "A1" || got[2].Sn != "A2" || got[2].HwVer != nil { t.Fatalf("devices = %+v", got) } }