gui/pkg/dock/service_test.go
Snider 073794aed0 feat(dock): add dock/badge core.Service with Platform interface and IPC
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 14:40:41 +00:00

194 lines
4.4 KiB
Go

// pkg/dock/service_test.go
package dock
import (
"context"
"testing"
"forge.lthn.ai/core/go/pkg/core"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// --- Mock Platform ---
type mockPlatform struct {
visible bool
badge string
hasBadge bool
showErr error
hideErr error
badgeErr error
removeErr error
}
func (m *mockPlatform) ShowIcon() error {
if m.showErr != nil {
return m.showErr
}
m.visible = true
return nil
}
func (m *mockPlatform) HideIcon() error {
if m.hideErr != nil {
return m.hideErr
}
m.visible = false
return nil
}
func (m *mockPlatform) SetBadge(label string) error {
if m.badgeErr != nil {
return m.badgeErr
}
m.badge = label
m.hasBadge = true
return nil
}
func (m *mockPlatform) RemoveBadge() error {
if m.removeErr != nil {
return m.removeErr
}
m.badge = ""
m.hasBadge = false
return nil
}
func (m *mockPlatform) IsVisible() bool { return m.visible }
// --- Test helpers ---
func newTestDockService(t *testing.T) (*Service, *core.Core, *mockPlatform) {
t.Helper()
mock := &mockPlatform{visible: true}
c, err := core.New(
core.WithService(Register(mock)),
core.WithServiceLock(),
)
require.NoError(t, err)
require.NoError(t, c.ServiceStartup(context.Background(), nil))
svc := core.MustServiceFor[*Service](c, "dock")
return svc, c, mock
}
// --- Tests ---
func TestRegister_Good(t *testing.T) {
svc, _, _ := newTestDockService(t)
assert.NotNil(t, svc)
}
func TestQueryVisible_Good(t *testing.T) {
_, c, _ := newTestDockService(t)
result, handled, err := c.QUERY(QueryVisible{})
require.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, true, result)
}
func TestQueryVisible_Bad(t *testing.T) {
// No dock service registered — QUERY returns handled=false
c, err := core.New(core.WithServiceLock())
require.NoError(t, err)
_, handled, _ := c.QUERY(QueryVisible{})
assert.False(t, handled)
}
func TestTaskShowIcon_Good(t *testing.T) {
_, c, mock := newTestDockService(t)
mock.visible = false // Start hidden
var received *ActionVisibilityChanged
c.RegisterAction(func(_ *core.Core, msg core.Message) error {
if a, ok := msg.(ActionVisibilityChanged); ok {
received = &a
}
return nil
})
_, handled, err := c.PERFORM(TaskShowIcon{})
require.NoError(t, err)
assert.True(t, handled)
assert.True(t, mock.visible)
require.NotNil(t, received)
assert.True(t, received.Visible)
}
func TestTaskHideIcon_Good(t *testing.T) {
_, c, mock := newTestDockService(t)
mock.visible = true // Start visible
var received *ActionVisibilityChanged
c.RegisterAction(func(_ *core.Core, msg core.Message) error {
if a, ok := msg.(ActionVisibilityChanged); ok {
received = &a
}
return nil
})
_, handled, err := c.PERFORM(TaskHideIcon{})
require.NoError(t, err)
assert.True(t, handled)
assert.False(t, mock.visible)
require.NotNil(t, received)
assert.False(t, received.Visible)
}
func TestTaskSetBadge_Good(t *testing.T) {
_, c, mock := newTestDockService(t)
_, handled, err := c.PERFORM(TaskSetBadge{Label: "3"})
require.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, "3", mock.badge)
assert.True(t, mock.hasBadge)
}
func TestTaskSetBadge_EmptyLabel_Good(t *testing.T) {
_, c, mock := newTestDockService(t)
_, handled, err := c.PERFORM(TaskSetBadge{Label: ""})
require.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, "", mock.badge)
assert.True(t, mock.hasBadge) // Empty string = default system badge indicator
}
func TestTaskRemoveBadge_Good(t *testing.T) {
_, c, mock := newTestDockService(t)
// Set a badge first
_, _, _ = c.PERFORM(TaskSetBadge{Label: "5"})
_, handled, err := c.PERFORM(TaskRemoveBadge{})
require.NoError(t, err)
assert.True(t, handled)
assert.Equal(t, "", mock.badge)
assert.False(t, mock.hasBadge)
}
func TestTaskShowIcon_Bad(t *testing.T) {
_, c, mock := newTestDockService(t)
mock.showErr = assert.AnError
_, handled, err := c.PERFORM(TaskShowIcon{})
assert.True(t, handled)
assert.Error(t, err)
}
func TestTaskHideIcon_Bad(t *testing.T) {
_, c, mock := newTestDockService(t)
mock.hideErr = assert.AnError
_, handled, err := c.PERFORM(TaskHideIcon{})
assert.True(t, handled)
assert.Error(t, err)
}
func TestTaskSetBadge_Bad(t *testing.T) {
_, c, mock := newTestDockService(t)
mock.badgeErr = assert.AnError
_, handled, err := c.PERFORM(TaskSetBadge{Label: "3"})
assert.True(t, handled)
assert.Error(t, err)
}