- internal/model: единый источник статусов задачи (Status, TraceStatus, машина переходов), без зависимости от storage. - internal/storage: совместимый мост (type Status = model.Status, re-export констант) — внешний код не меняется. - internal/events: шина событий (fan-out, блокирующий Publish с гарантией порядка), события задач/трейсов, отдельная логовая шина + LogWriter, Publisher/NilPublisher для внедрения в Core/Worker. - docs/ui-spec.md: спецификация десктопного UI (Fyne).
76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package events
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestLogWriterLines(t *testing.T) {
|
|
lbus := NewLogBus(16)
|
|
ch, unsub := lbus.Subscribe()
|
|
defer unsub()
|
|
|
|
w := NewLogWriter(lbus)
|
|
if _, err := w.Write([]byte("first line\nsecond line\n")); err != nil {
|
|
t.Fatalf("Write: %v", err)
|
|
}
|
|
|
|
first := receiveOne(t, ch)
|
|
ll, ok := first.(LogLine)
|
|
if !ok {
|
|
t.Fatalf("got %T, want LogLine", first)
|
|
}
|
|
if ll.Text != "first line" || ll.Level != "log" {
|
|
t.Fatalf("unexpected first line: %+v", ll)
|
|
}
|
|
|
|
second := receiveOne(t, ch)
|
|
if ll, ok := second.(LogLine); !ok || ll.Text != "second line" {
|
|
t.Fatalf("unexpected second line: %+v", second)
|
|
}
|
|
}
|
|
|
|
func TestLogWriterPartialLine(t *testing.T) {
|
|
lbus := NewLogBus(16)
|
|
ch, unsub := lbus.Subscribe()
|
|
defer unsub()
|
|
|
|
w := NewLogWriter(lbus)
|
|
if _, err := w.Write([]byte("partial")); err != nil {
|
|
t.Fatalf("Write: %v", err)
|
|
}
|
|
select {
|
|
case got := <-ch:
|
|
t.Fatalf("partial line should not be published yet, got %#v", got)
|
|
case <-time.After(150 * time.Millisecond):
|
|
}
|
|
|
|
if _, err := w.Write([]byte(" line\n")); err != nil {
|
|
t.Fatalf("Write: %v", err)
|
|
}
|
|
got := receiveOne(t, ch)
|
|
ll, ok := got.(LogLine)
|
|
if !ok || ll.Text != "partial line" {
|
|
t.Fatalf("unexpected: %#v", got)
|
|
}
|
|
}
|
|
|
|
func TestLogWriterMultiSplit(t *testing.T) {
|
|
lbus := NewLogBus(16)
|
|
ch, unsub := lbus.Subscribe()
|
|
defer unsub()
|
|
|
|
w := NewLogWriter(lbus)
|
|
if _, err := w.Write([]byte("line1\nline2\nline3\n")); err != nil {
|
|
t.Fatalf("Write: %v", err)
|
|
}
|
|
var texts []string
|
|
for i := 0; i < 3; i++ {
|
|
ev := receiveOne(t, ch)
|
|
texts = append(texts, ev.(LogLine).Text)
|
|
}
|
|
if strings.Join(texts, ",") != "line1,line2,line3" {
|
|
t.Fatalf("got %v", texts)
|
|
}
|
|
} |