194 lines
4.4 KiB
Go
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)
|
|
}
|