package server import ( "archive/zip" "bytes" "encoding/json" "strings" "testing" "time" ) func TestCollectLogTimeBounds(t *testing.T) { lines := []string{ "2026-02-28T13:10:13.7442032Z Задача поставлена в очередь", "not-a-timestamp line", "2026-02-28T13:31:00.5077486Z Сбор завершен", } startedAt, finishedAt, ok := collectLogTimeBounds(lines) if !ok { t.Fatalf("expected bounds to be parsed") } if got := formatRawExportDuration(finishedAt.Sub(startedAt)); got != "20m47s" { t.Fatalf("unexpected duration: %s", got) } } func TestBuildHumanReadableCollectionLog_IncludesDurationHeader(t *testing.T) { pkg := &RawExportPackage{ Format: rawExportFormatV1, Source: RawExportSource{ Kind: "live_redfish", CollectLogs: []string{ "2026-02-28T13:10:13.7442032Z Redfish: подключение к BMC...", "2026-02-28T13:31:00.5077486Z Сбор завершен", }, }, } logText := buildHumanReadableCollectionLog(pkg, nil, "LOGPile test") for _, token := range []string{ "Collection Started:", "Collection Finished:", "Collection Duration:", } { if !strings.Contains(logText, token) { t.Fatalf("expected %q in log header", token) } } } func TestParseRawExportBundle_ExtractsCollectedAtHintFromParserFields(t *testing.T) { pkg := &RawExportPackage{ Format: rawExportFormatV1, ExportedAt: time.Date(2026, 2, 25, 9, 59, 41, 479023400, time.UTC), Source: RawExportSource{ Kind: "live_redfish", }, } pkgJSON, err := json.Marshal(pkg) if err != nil { t.Fatalf("marshal pkg: %v", err) } parserFields := []byte(`{"collected_at":"2026-02-25T09:58:05.9129753Z"}`) var buf bytes.Buffer zw := zip.NewWriter(&buf) jf, err := zw.Create(rawExportBundlePackageFile) if err != nil { t.Fatalf("create package file: %v", err) } if _, err := jf.Write(pkgJSON); err != nil { t.Fatalf("write package file: %v", err) } ff, err := zw.Create(rawExportBundleFieldsFile) if err != nil { t.Fatalf("create parser fields file: %v", err) } if _, err := ff.Write(parserFields); err != nil { t.Fatalf("write parser fields file: %v", err) } if err := zw.Close(); err != nil { t.Fatalf("close zip writer: %v", err) } gotPkg, ok, err := parseRawExportBundle(buf.Bytes()) if err != nil { t.Fatalf("parse bundle: %v", err) } if !ok || gotPkg == nil { t.Fatalf("expected valid raw export bundle") } want := time.Date(2026, 2, 25, 9, 58, 5, 912975300, time.UTC) if !gotPkg.CollectedAtHint.Equal(want) { t.Fatalf("expected collected_at hint %s, got %s", want, gotPkg.CollectedAtHint) } }