go/pkg/log/service_test.go
Snider 29e6d06633 fix(core): replace fmt.Errorf with structured errors, add log service tests
- Replace all fmt.Errorf calls with coreerr.E() from go-log for structured
  error context (op, msg, underlying error) across core.go, service_manager.go,
  and runtime_pkg.go (12 violations fixed)
- Replace local Error type and E() in e.go with re-exports from go-log,
  eliminating duplicate implementation while preserving public API
- Add comprehensive tests for pkg/log Service (NewService, OnStartup,
  QueryLevel, TaskSetLevel) — coverage 72.2% → 87.8%
- Update CLAUDE.md: Go 1.25 → 1.26, runtime.go → runtime_pkg.go,
  document go-log error convention
- No os.ReadFile/os.WriteFile violations found (all I/O uses go-io)

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-17 08:03:05 +00:00

126 lines
3 KiB
Go

package log
import (
"context"
"testing"
"forge.lthn.ai/core/go/pkg/core"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestNewService_Good(t *testing.T) {
opts := Options{Level: LevelInfo}
factory := NewService(opts)
c, err := core.New(core.WithName("log", func(cc *core.Core) (any, error) {
return factory(cc)
}))
require.NoError(t, err)
svc := c.Service("log")
require.NotNil(t, svc)
logSvc, ok := svc.(*Service)
require.True(t, ok)
assert.NotNil(t, logSvc.Logger)
assert.NotNil(t, logSvc.ServiceRuntime)
}
func TestService_OnStartup_Good(t *testing.T) {
opts := Options{Level: LevelInfo}
factory := NewService(opts)
c, err := core.New(core.WithName("log", func(cc *core.Core) (any, error) {
return factory(cc)
}))
require.NoError(t, err)
svc := c.Service("log").(*Service)
err = svc.OnStartup(context.Background())
assert.NoError(t, err)
}
func TestService_QueryLevel_Good(t *testing.T) {
opts := Options{Level: LevelDebug}
factory := NewService(opts)
c, err := core.New(core.WithName("log", func(cc *core.Core) (any, error) {
return factory(cc)
}))
require.NoError(t, err)
svc := c.Service("log").(*Service)
err = svc.OnStartup(context.Background())
require.NoError(t, err)
result, handled, err := c.QUERY(QueryLevel{})
assert.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, LevelDebug, result)
}
func TestService_QueryLevel_Bad(t *testing.T) {
opts := Options{Level: LevelInfo}
factory := NewService(opts)
c, err := core.New(core.WithName("log", func(cc *core.Core) (any, error) {
return factory(cc)
}))
require.NoError(t, err)
svc := c.Service("log").(*Service)
err = svc.OnStartup(context.Background())
require.NoError(t, err)
// Unknown query type should not be handled
result, handled, err := c.QUERY("unknown")
assert.NoError(t, err)
assert.False(t, handled)
assert.Nil(t, result)
}
func TestService_TaskSetLevel_Good(t *testing.T) {
opts := Options{Level: LevelInfo}
factory := NewService(opts)
c, err := core.New(core.WithName("log", func(cc *core.Core) (any, error) {
return factory(cc)
}))
require.NoError(t, err)
svc := c.Service("log").(*Service)
err = svc.OnStartup(context.Background())
require.NoError(t, err)
// Change level via task
_, handled, err := c.PERFORM(TaskSetLevel{Level: LevelError})
assert.NoError(t, err)
assert.True(t, handled)
// Verify level changed via query
result, handled, err := c.QUERY(QueryLevel{})
assert.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, LevelError, result)
}
func TestService_TaskSetLevel_Bad(t *testing.T) {
opts := Options{Level: LevelInfo}
factory := NewService(opts)
c, err := core.New(core.WithName("log", func(cc *core.Core) (any, error) {
return factory(cc)
}))
require.NoError(t, err)
svc := c.Service("log").(*Service)
err = svc.OnStartup(context.Background())
require.NoError(t, err)
// Unknown task type should not be handled
_, handled, err := c.PERFORM("unknown")
assert.NoError(t, err)
assert.False(t, handled)
}