/
githubmirror
/
photoprism
Обзор
Документация
Войти
/
githubmirror
/
photoprism
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
internal/event/system_test.go
192 строки
5 KB
Michael Mayer
Event: Use first event segment as the system log prefix
03 июн 2026, 17:58
03 июн 2026, 17:58
9c96ffe
Код
Авторство
О чём код?
package event import ( "io" "sync" "testing" "time" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) type systemTestLogger struct { *logrus.Logger mu sync.Mutex entries []logEntry } type logEntry struct { level logrus.Level args []any } func newSystemTestLogger() *systemTestLogger { logger := logrus.New() logger.SetOutput(io.Discard) return &systemTestLogger{Logger: logger} } func (l *systemTestLogger) Log(level logrus.Level, args ...any) { l.mu.Lock() defer l.mu.Unlock() entryArgs := append([]any(nil), args...) l.entries = append(l.entries, logEntry{level: level, args: entryArgs}) } func (l *systemTestLogger) lastEntry() (logEntry, bool) { l.mu.Lock() defer l.mu.Unlock() if len(l.entries) == 0 { return logEntry{}, false } return l.entries[len(l.entries)-1], true } func (l *systemTestLogger) entryCount() int { l.mu.Lock() defer l.mu.Unlock() return len(l.entries) } func TestSystemLoggingFunctions(t *testing.T) { tests := []struct { name string level logrus.Level call func(ev []string, args ...any) }{ {name: "Info", level: logrus.InfoLevel, call: func(ev []string, args ...any) { SystemInfo(ev, args...) }}, {name: "Warn", level: logrus.WarnLevel, call: func(ev []string, args ...any) { SystemWarn(ev, args...) }}, {name: "Debug", level: logrus.DebugLevel, call: func(ev []string, args ...any) { SystemDebug(ev, args...) }}, {name: "Error", level: logrus.ErrorLevel, call: func(ev []string, args ...any) { SystemError(ev, args...) }}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { logger := newSystemTestLogger() orig := SystemLog SystemLog = logger t.Cleanup(func() { SystemLog = orig }) events := []string{"config", "database", "register %s"} args := []any{"failed"} expectedMessage := Format(events, args...) topic := "system.log." + tt.level.String() subscription := Subscribe(topic) t.Cleanup(func() { Unsubscribe(subscription) }) tt.call(events, args...) var msg Message select { case msg = <-subscription.Receiver: case <-time.After(100 * time.Millisecond): t.Fatalf("timeout waiting for %s event", topic) } require.Equal(t, topic, msg.Name) require.Equal(t, tt.level.String(), msg.Fields["level"]) require.Equal(t, expectedMessage, msg.Fields["message"]) require.IsType(t, time.Time{}, msg.Fields["time"]) timeValue := msg.Fields["time"].(time.Time) assert.False(t, timeValue.IsZero()) entry, ok := logger.lastEntry() require.True(t, ok) assert.Equal(t, tt.level, entry.level) require.Len(t, entry.args, 1) // The first segment becomes the log prefix; args fill the rest. assert.Equal(t, "config: "+Format(events[1:], args...), entry.args[0]) }) } } func TestSystemLogPrefix(t *testing.T) { tests := []struct { name string events []string args []any expected string }{ {name: "SingleSegment", events: []string{"something happened"}, expected: SystemPrefix + "something happened"}, {name: "MultipleSegments", events: []string{"config", "database", "connect"}, expected: "config: database › connect"}, {name: "MultipleSegmentsWithArgs", events: []string{"config", "database", "register", "%s"}, args: []any{"boom"}, expected: "config: database › register › boom"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { logger := newSystemTestLogger() orig := SystemLog SystemLog = logger t.Cleanup(func() { SystemLog = orig }) SystemInfo(tt.events, tt.args...) entry, ok := logger.lastEntry() require.True(t, ok) require.Len(t, entry.args, 1) assert.Equal(t, tt.expected, entry.args[0]) }) } } func TestSystemSkipsEmptyEvents(t *testing.T) { logger := newSystemTestLogger() orig := SystemLog SystemLog = logger defer func() { SystemLog = orig }() topic := "system.log." + logrus.InfoLevel.String() subscription := Subscribe(topic) defer Unsubscribe(subscription) System(logrus.InfoLevel, nil) System(logrus.InfoLevel, []string{}) SystemInfo(nil) assert.Equal(t, 0, logger.entryCount()) select { case msg := <-subscription.Receiver: t.Fatalf("unexpected message received: %#v", msg) case <-time.After(50 * time.Millisecond): } } func TestSystemPublishesWithoutLogger(t *testing.T) { orig := SystemLog SystemLog = nil defer func() { SystemLog = orig }() events := []string{"maintenance"} expectedMessage := Format(events) topic := "system.log." + logrus.InfoLevel.String() subscription := Subscribe(topic) defer Unsubscribe(subscription) System(logrus.InfoLevel, events) var msg Message select { case msg = <-subscription.Receiver: case <-time.After(100 * time.Millisecond): t.Fatalf("timeout waiting for %s event", topic) } require.Equal(t, topic, msg.Name) require.Equal(t, logrus.InfoLevel.String(), msg.Fields["level"]) require.Equal(t, expectedMessage, msg.Fields["message"]) require.IsType(t, time.Time{}, msg.Fields["time"]) timeValue := msg.Fields["time"].(time.Time) assert.False(t, timeValue.IsZero()) }