package notify import ( "context" "os" "path/filepath" "runtime" "strings" "testing" ) // TestShowCallsNotifySend: on Linux, Show goes through notify-send; here a // fake in PATH that records its arguments (a real process, no mock // framework). Title and text arrive unchanged. func TestShowCallsNotifySend(t *testing.T) { if runtime.GOOS != "linux" { t.Skip("the notify-send path exists only on Linux") } dir := t.TempDir() seen := filepath.Join(dir, "seen.txt") script := "#!/bin/sh\nprintf '%s\\n' \"$@\" > \"" + seen + "\"\n" if err := os.WriteFile(filepath.Join(dir, "notify-send"), []byte(script), 0o755); err != nil { t.Fatal(err) } t.Setenv("PATH", dir) if !Available() { t.Fatal("Available = false with fake in PATH") } if err := Show(context.Background(), "quiet hours: build done"); err != nil { t.Fatalf("Show: %v", err) } b, err := os.ReadFile(seen) if err != nil { t.Fatal(err) } args := strings.Split(strings.TrimSpace(string(b)), "\n") if args[len(args)-1] != "quiet hours: build done" || args[len(args)-2] != Title { t.Errorf("notify-send arguments = %q, want ... %q %q", args, Title, "quiet hours: build done") } } // TestShowWithoutTool: a missing tool is a clear error. func TestShowWithoutTool(t *testing.T) { t.Setenv("PATH", t.TempDir()) if Available() { t.Fatal("Available = true without tool") } if err := Show(context.Background(), "x"); err == nil { t.Error("Show without tool: no error") } if !strings.Contains(Describe(), "not found") { t.Errorf("Describe = %q", Describe()) } } func TestAppleString(t *testing.T) { if got := appleString(`say "hello" \ bye`); got != `"say \"hello\" \\ bye"` { t.Errorf("appleString = %s", got) } }