cli/pkg/display/display_test.go
Snider 4e02d5bc97 refactor: bring external packages home and restructure
- Imported packages from separate repos:
  - github.com/Snider/config -> pkg/config
  - github.com/Snider/display -> pkg/display
  - github.com/Snider/help -> pkg/help
  - github.com/Snider/i18n -> pkg/i18n
  - github.com/Snider/updater -> pkg/updater
- Moved core code from root to pkg/core
- Flattened nested package structures
- Updated all import paths to github.com/Snider/Core/pkg/*
- Added Display interface to Core
- Updated go.work for workspace modules

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 15:30:43 +00:00

353 lines
8.2 KiB
Go

package display
import (
"reflect"
"testing"
"github.com/wailsapp/wails/v3/pkg/application"
)
func TestParseWindowOptions(t *testing.T) {
tests := []struct {
name string
msg map[string]any
want application.WebviewWindowOptions
}{
{
name: "Valid options",
msg: map[string]any{
"name": "main",
"options": map[string]any{
"Title": "My App",
"Width": 1024.0,
"Height": 768.0,
},
},
want: application.WebviewWindowOptions{
Name: "main",
Title: "My App",
Width: 1024,
Height: 768,
},
},
{
name: "All options valid",
msg: map[string]any{
"name": "secondary",
"options": map[string]any{
"Title": "Another Window",
"Width": 800.0,
"Height": 600.0,
},
},
want: application.WebviewWindowOptions{
Name: "secondary",
Title: "Another Window",
Width: 800,
Height: 600,
},
},
{
name: "Missing options",
msg: map[string]any{
"name": "main",
},
want: application.WebviewWindowOptions{
Name: "main",
},
},
{
name: "Empty message",
msg: map[string]any{},
want: application.WebviewWindowOptions{},
},
{
name: "Invalid width type",
msg: map[string]any{
"name": "main",
"options": map[string]any{
"Title": "My App",
"Width": "not a number",
"Height": 768.0,
},
},
want: application.WebviewWindowOptions{
Name: "main",
Title: "My App",
Height: 768,
},
},
{
name: "Invalid height type",
msg: map[string]any{
"name": "main",
"options": map[string]any{
"Title": "My App",
"Width": 1024.0,
"Height": "not a number",
},
},
want: application.WebviewWindowOptions{
Name: "main",
Title: "My App",
Width: 1024,
},
},
{
name: "Deeply nested and complex message",
msg: map[string]any{
"name": "main",
"options": map[string]any{
"Title": "My App",
"Width": 1024.0,
"Height": 768.0,
"nested": map[string]any{
"another_level": "some_value",
},
},
},
want: application.WebviewWindowOptions{
Name: "main",
Title: "My App",
Width: 1024,
Height: 768,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := parseWindowOptions(tt.msg); !reflect.DeepEqual(got, tt.want) {
t.Errorf("parseWindowOptions() = %v, want %v", got, tt.want)
}
})
}
}
// mockWindowOption is a mock implementation of the WindowOption interface for testing.
type mockWindowOption struct {
applyFunc func(*WindowConfig)
}
func (m *mockWindowOption) Apply(opts *WindowConfig) {
m.applyFunc(opts)
}
func TestBuildWailsWindowOptions(t *testing.T) {
tests := []struct {
name string
opts []WindowOption
want application.WebviewWindowOptions
}{
{
name: "Default options",
opts: []WindowOption{},
want: application.WebviewWindowOptions{
Name: "main",
Title: "Core",
Width: 1280,
Height: 800,
URL: "/",
},
},
{
name: "Chaining many options",
opts: func() []WindowOption {
opts := make([]WindowOption, 1000)
for i := 0; i < 1000; i++ {
opts[i] = WithTitle("Test")
}
return opts
}(),
want: application.WebviewWindowOptions{
Name: "main",
Title: "Test",
Width: 1280,
Height: 800,
URL: "/",
},
},
{
name: "Override options",
opts: []WindowOption{
&mockWindowOption{
applyFunc: func(opts *WindowConfig) {
opts.Name = "test"
opts.Title = "Test Window"
opts.Width = 1920
opts.Height = 1080
opts.URL = "/test"
opts.AlwaysOnTop = true
opts.Hidden = true
opts.MinimiseButtonState = application.ButtonHidden
opts.MaximiseButtonState = application.ButtonDisabled
opts.CloseButtonState = application.ButtonEnabled
opts.Frameless = true
},
},
},
want: application.WebviewWindowOptions{
Name: "test",
Title: "Test Window",
Width: 1920,
Height: 1080,
URL: "/test",
AlwaysOnTop: true,
Hidden: true,
MinimiseButtonState: application.ButtonHidden,
MaximiseButtonState: application.ButtonDisabled,
CloseButtonState: application.ButtonEnabled,
Frameless: true,
},
},
{
name: "Nil options",
opts: nil,
want: application.WebviewWindowOptions{
Name: "main",
Title: "Core",
Width: 1280,
Height: 800,
URL: "/",
},
},
{
name: "Empty options slice",
opts: []WindowOption{},
want: application.WebviewWindowOptions{
Name: "main",
Title: "Core",
Width: 1280,
Height: 800,
URL: "/",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := buildWailsWindowOptions(tt.opts...); !reflect.DeepEqual(got, tt.want) {
t.Errorf("buildWailsWindowOptions() = %v, want %v", got, tt.want)
}
})
}
}
func TestNewAndNewDisplayService(t *testing.T) {
s, err := New()
if err != nil {
t.Fatalf("New() error = %v, wantErr nil", err)
}
if s == nil {
t.Fatal("New() returned nil")
}
s, err = newDisplayService()
if err != nil {
t.Fatalf("newDisplayService() error = %v, wantErr nil", err)
}
if s == nil {
t.Fatal("newDisplayService() returned nil")
}
}
func TestWindowOptions(t *testing.T) {
config := &WindowConfig{}
WithName("test-name").Apply(config)
if config.Name != "test-name" {
t.Errorf("WithName() got = %v, want %v", config.Name, "test-name")
}
WithTitle("test-title").Apply(config)
if config.Title != "test-title" {
t.Errorf("WithTitle() got = %v, want %v", config.Title, "test-title")
}
WithWidth(100).Apply(config)
if config.Width != 100 {
t.Errorf("WithWidth() got = %v, want %v", config.Width, 100)
}
WithHeight(200).Apply(config)
if config.Height != 200 {
t.Errorf("WithHeight() got = %v, want %v", config.Height, 200)
}
WithURL("/testurl").Apply(config)
if config.URL != "/testurl" {
t.Errorf("WithURL() got = %v, want %v", config.URL, "/testurl")
}
WithAlwaysOnTop(true).Apply(config)
if !config.AlwaysOnTop {
t.Errorf("WithAlwaysOnTop() got = %v, want %v", config.AlwaysOnTop, true)
}
WithHidden(true).Apply(config)
if !config.Hidden {
t.Errorf("WithHidden() got = %v, want %v", config.Hidden, true)
}
WithMinimiseButtonState(application.ButtonHidden).Apply(config)
if config.MinimiseButtonState != application.ButtonHidden {
t.Errorf("WithMinimiseButtonState() got = %v, want %v", config.MinimiseButtonState, application.ButtonHidden)
}
WithMaximiseButtonState(application.ButtonDisabled).Apply(config)
if config.MaximiseButtonState != application.ButtonDisabled {
t.Errorf("WithMaximiseButtonState() got = %v, want %v", config.MaximiseButtonState, application.ButtonDisabled)
}
WithCloseButtonState(application.ButtonEnabled).Apply(config)
if config.CloseButtonState != application.ButtonEnabled {
t.Errorf("WithCloseButtonState() got = %v, want %v", config.CloseButtonState, application.ButtonEnabled)
}
WithFrameless(true).Apply(config)
if !config.Frameless {
t.Errorf("WithFrameless() got = %v, want %v", config.Frameless, true)
}
}
func TestService_HandleOpenWindowAction(t *testing.T) {
t.Skip("Skipping test that requires a running Wails application.")
s, _ := New()
_ = s.handleOpenWindowAction(map[string]any{})
}
func TestService_ShowEnvironmentDialog(t *testing.T) {
t.Skip("Skipping test that requires a running Wails application.")
s, _ := New()
s.ShowEnvironmentDialog()
}
func TestService_OpenWindow(t *testing.T) {
t.Skip("Skipping test that requires a running Wails application.")
s, _ := New()
_ = s.OpenWindow()
}
func TestService_MonitorScreenChanges(t *testing.T) {
t.Skip("Skipping test that requires a running Wails application.")
s, _ := New()
s.monitorScreenChanges()
}
func TestService_BuildMenu(t *testing.T) {
t.Skip("Skipping test that requires a running Wails application.")
s, _ := New()
s.buildMenu()
}
func TestService_SystemTray(t *testing.T) {
t.Skip("Skipping test that requires a running Wails application.")
s, _ := New()
s.systemTray()
}
func TestService_Startup(t *testing.T) {
t.Skip("Skipping test that requires a running Wails application.")
s, _ := New()
_ = s.Startup(nil)
}