package main import ( "errors" "net" "net/http" "strings" "testing" "time" ) func TestListenDesktopPortReturnsReusableListener(t *testing.T) { listener, err := listenDesktopPort(0) if err != nil { t.Fatalf("listener-first 应直接获取配置端口 listener: %v", err) } defer listener.Close() server := &http.Server{ReadHeaderTimeout: time.Second} done := make(chan struct{}) go func() { defer close(done) err := server.Serve(listener) if err != nil && err != http.ErrServerClosed && !errors.Is(err, net.ErrClosed) { t.Errorf("使用同一个 listener 启动 server 失败: %v", err) } }() if err := server.Close(); err != nil { t.Fatalf("关闭测试 server 失败: %v", err) } <-done } func TestGetDesktopConfigPath(t *testing.T) { path := getDesktopConfigPath() if path == "" { t.Fatal("getDesktopConfigPath 应返回非空路径") } if !strings.Contains(path, "config.yaml") { t.Fatalf("路径应包含 config.yaml,实际: %s", path) } t.Log("getDesktopConfigPath 测试通过") } func TestDesktopConfiguredPortHelpers(t *testing.T) { port := 19830 if got := desktopListenAddr(port); got != ":19830" { t.Fatalf("HTTP 监听地址应使用配置端口,实际: %s", got) } if got := desktopURL(port); got != "http://localhost:19830" { t.Fatalf("浏览器 URL 应使用配置端口,实际: %s", got) } if got := desktopPortMenuTitle(port); got != "端口: 19830" { t.Fatalf("托盘端口显示应使用配置端口,实际: %s", got) } } func TestDesktopConfigErrorMessageContainsPathAndReason(t *testing.T) { msg := desktopConfigErrorMessage("/tmp/nex/config.yaml", errors.New("yaml parse failed")) if !strings.Contains(msg, "/tmp/nex/config.yaml") { t.Fatalf("配置错误提示应包含配置路径,实际: %s", msg) } if !strings.Contains(msg, "yaml parse failed") { t.Fatalf("配置错误提示应包含失败原因,实际: %s", msg) } }