summaryrefslogtreecommitdiff
path: root/internal/tmux/tmux_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-09-07 11:27:43 +0300
committerPaul Buetow <paul@buetow.org>2025-09-07 11:27:43 +0300
commit0d424adfc64da1c61296c66a99162ec68cc4f8d0 (patch)
tree2aaaad9e6c5c1886809d213a4bf4f0fe8a5bc3c8 /internal/tmux/tmux_test.go
parent8889949ad3851bfbf36ff5b73128286d67c88201 (diff)
hexai-action: integrate tmux orchestration; add internal/tmux; tests+docs; bump version to v0.7.0v0.7.0
Diffstat (limited to 'internal/tmux/tmux_test.go')
-rw-r--r--internal/tmux/tmux_test.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/internal/tmux/tmux_test.go b/internal/tmux/tmux_test.go
new file mode 100644
index 0000000..b18c8a3
--- /dev/null
+++ b/internal/tmux/tmux_test.go
@@ -0,0 +1,82 @@
+package tmux
+
+import (
+ "errors"
+ "os"
+ "os/exec"
+ "testing"
+)
+
+func TestInSession(t *testing.T) {
+ t.Setenv("TMUX", "/tmp/tmux-123,123,0")
+ if !InSession() {
+ t.Fatal("expected InSession true when TMUX is set")
+ }
+ t.Setenv("TMUX", "")
+ if InSession() {
+ t.Fatal("expected InSession false when TMUX is empty")
+ }
+}
+
+func TestHasBinary_UsesLookPath(t *testing.T) {
+ old := lookPath
+ t.Cleanup(func() { lookPath = old })
+ lookPath = func(file string) (string, error) { return "/bin/tmux", nil }
+ if !HasBinary() {
+ t.Fatal("expected HasBinary true when lookPath succeeds")
+ }
+ lookPath = func(file string) (string, error) { return "", errors.New("nope") }
+ if HasBinary() {
+ t.Fatal("expected HasBinary false when lookPath fails")
+ }
+}
+
+func TestSplitRun_AssemblesArgs(t *testing.T) {
+ captured := struct{ name string; args []string }{}
+ oldCmd := command
+ t.Cleanup(func() { command = oldCmd })
+ command = func(name string, args ...string) *exec.Cmd {
+ captured.name = name
+ captured.args = append([]string(nil), args...)
+ // Use a benign command that exits 0
+ return exec.Command("true")
+ }
+ opts := SplitOpts{Target: ":.", Vertical: true, Percent: 40}
+ argv := []string{"/path/to/bin", "-flag", "value with spaces", "and'quote"}
+ if err := SplitRun(opts, argv); err != nil {
+ t.Fatalf("SplitRun error: %v", err)
+ }
+ if captured.name != "tmux" {
+ t.Fatalf("expected tmux, got %q", captured.name)
+ }
+ wantFlags := map[string]bool{"split-window": true, "-v": true, "-p": true, "40": true, "-t": true, ":.": true}
+ for _, a := range captured.args[:len(captured.args)-1] {
+ if wantFlags[a] {
+ delete(wantFlags, a)
+ }
+ }
+ if len(wantFlags) != 0 {
+ t.Fatalf("missing expected flags: %v", wantFlags)
+ }
+ last := captured.args[len(captured.args)-1]
+ if last == "" || last == argv[0] {
+ t.Fatalf("expected last arg to be joined command string, got %q", last)
+ }
+ _ = os.Unsetenv("TMUX")
+}
+
+func TestAvailable(t *testing.T) {
+ oldLook := lookPath
+ t.Cleanup(func() { lookPath = oldLook })
+ // Present binary + TMUX set -> available
+ lookPath = func(file string) (string, error) { return "/bin/tmux", nil }
+ t.Setenv("TMUX", "/tmp/tmux-1,1,1")
+ if !Available() {
+ t.Fatal("expected Available true with TMUX + binary")
+ }
+ // No binary -> not available
+ lookPath = func(file string) (string, error) { return "", errors.New("nope") }
+ if Available() {
+ t.Fatal("expected Available false without binary")
+ }
+}