-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdynamic_render_test.go
More file actions
124 lines (105 loc) · 3.37 KB
/
dynamic_render_test.go
File metadata and controls
124 lines (105 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package slog
import (
"bytes"
"context"
"encoding/json"
"log/slog"
"strings"
"testing"
"time"
)
func TestProgressUsesPipelineForDLPAndSubscriptions(t *testing.T) {
resetForTest()
EnableDLPLogger()
defer DisableDLPLogger()
var buf bytes.Buffer
logger := NewLogger(&buf, true, false)
ch, cancel := Subscribe(10)
defer cancel()
logger.Progress("phone 13812345678", 0)
output := buf.String()
if strings.Contains(output, "13812345678") {
t.Fatalf("expected progress output to be desensitized, got %q", output)
}
if !strings.Contains(output, "100.0%") {
t.Fatalf("expected progress output to contain final percentage, got %q", output)
}
if strings.Contains(output, "\r") {
t.Fatalf("expected non-interactive progress output to avoid carriage returns, got %q", output)
}
select {
case event := <-ch:
if !strings.Contains(event.Record.Message, "100.0%") {
t.Fatalf("expected subscription to receive progress record, got %q", event.Record.Message)
}
if !strings.Contains(event.Rendered, "100.0%") {
t.Fatalf("expected semantic text render for progress, got %q", event.Rendered)
}
case <-time.After(200 * time.Millisecond):
t.Fatal("expected progress record to reach subscription")
}
}
func TestProgressJSONOutputIsValid(t *testing.T) {
resetForTest()
SetLevelDebug()
var buf bytes.Buffer
config := DefaultConfig()
config.SetEnableText(false)
config.SetEnableJSON(true)
logger := NewLoggerWithConfig(&buf, config)
logger.Progress("a\"b", 0)
raw := strings.TrimSpace(buf.String())
if raw == "" {
t.Fatal("expected JSON output from progress")
}
var entry map[string]any
if err := json.Unmarshal([]byte(raw), &entry); err != nil {
t.Fatalf("expected valid JSON output, err=%v raw=%q", err, raw)
}
if entry["msg"] != "a\"b 100.0%" {
t.Fatalf("unexpected msg field: %v", entry["msg"])
}
if entry["level"] != "Info" {
t.Fatalf("unexpected level field: %v", entry["level"])
}
}
func TestConsoleHandlerDynamicRenderKeepsSingleLine(t *testing.T) {
var buf bytes.Buffer
h := &handler{
w: &buf,
state: &handlerState{},
level: LevelInfo,
timeFormat: TimeFormat,
noColor: true,
dynamicTTY: true,
}
if err := h.Handle(withDynamicRender(context.Background(), dynamicRenderState{final: false}), slog.NewRecord(time.Time{}, LevelInfo, "working", 0)); err != nil {
t.Fatalf("unexpected dynamic handle error: %v", err)
}
if err := h.Handle(context.Background(), slog.NewRecord(time.Time{}, LevelInfo, "done", 0)); err != nil {
t.Fatalf("unexpected normal handle error: %v", err)
}
output := buf.String()
if !strings.Contains(output, "\r\x1b[K[I] working") {
t.Fatalf("expected inline render output, got %q", output)
}
if !strings.Contains(output, "\n[I] done\n") {
t.Fatalf("expected subsequent log to continue on next line, got %q", output)
}
}
func TestLoadingFallsBackToStructuredMilestones(t *testing.T) {
resetForTest()
var buf bytes.Buffer
logger := NewLogger(&buf, true, false)
logger.Loading("sync task", 0)
lines := strings.Split(strings.TrimSpace(buf.String()), "\n")
if len(lines) != 2 {
t.Fatalf("expected start and done milestones, got %d lines: %q", len(lines), buf.String())
}
if !strings.Contains(lines[0], "sync task started") {
t.Fatalf("expected start milestone, got %q", lines[0])
}
if !strings.Contains(lines[1], "sync task done") {
t.Fatalf("expected done milestone, got %q", lines[1])
}
}