summaryrefslogtreecommitdiff
path: root/internal/tmux/tmux_test.go
blob: 4db2e4a88ab9ffc7ffee93e5e0153dca616bfc55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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")
	}
}