summaryrefslogtreecommitdiff
path: root/internal/tui/probes/model_test.go
blob: 3a14675cacf17496b6158e9cc570d28fdb115617 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package probes

import (
	"testing"

	"ior/internal/probemanager"

	tea "charm.land/bubbletea/v2"
)

type fakeManager struct {
	states  []probemanager.ProbeState
	toggles []string
}

func (f *fakeManager) States() []probemanager.ProbeState {
	out := make([]probemanager.ProbeState, len(f.states))
	copy(out, f.states)
	return out
}

func (f *fakeManager) Toggle(syscall string) error {
	f.toggles = append(f.toggles, syscall)
	for i := range f.states {
		if f.states[i].Syscall == syscall {
			f.states[i].Active = !f.states[i].Active
		}
	}
	return nil
}

func (f *fakeManager) ActiveCount() (int, int) {
	active := 0
	for _, s := range f.states {
		if s.Active {
			active++
		}
	}
	return active, len(f.states)
}

func TestOpenRefreshesFromManager(t *testing.T) {
	fm := &fakeManager{
		states: []probemanager.ProbeState{{Syscall: "read", Active: true}},
	}
	m := NewModel(fm)
	m = m.Open()
	if len(m.probes) != 1 || m.probes[0].Syscall != "read" {
		t.Fatalf("unexpected probes after first open: %+v", m.probes)
	}

	fm.states = append(fm.states, probemanager.ProbeState{Syscall: "write", Active: true})
	m = m.Close().Open()
	if len(m.probes) != 2 {
		t.Fatalf("expected probes refreshed on open, got %+v", m.probes)
	}
}

func TestToggleEmitsProbeToggledMsg(t *testing.T) {
	fm := &fakeManager{
		states: []probemanager.ProbeState{{Syscall: "read", Active: true}},
	}
	m := NewModel(fm).Open()
	next, cmd := m.Update(tea.KeyPressMsg{Code: []rune{' '}[0], Text: string([]rune{' '})})
	if cmd == nil {
		t.Fatalf("expected toggle command")
	}
	msg := cmd()
	toggled, ok := msg.(ProbeToggledMsg)
	if !ok {
		t.Fatalf("expected ProbeToggledMsg, got %T", msg)
	}
	if toggled.Err != nil {
		t.Fatalf("unexpected toggle err: %v", toggled.Err)
	}
	if len(fm.toggles) != 1 || fm.toggles[0] != "read" {
		t.Fatalf("expected read toggle, got %+v", fm.toggles)
	}
	_ = next
}

func TestBulkKeysApplyGloballyNotOnlyFiltered(t *testing.T) {
	fm := &fakeManager{
		states: []probemanager.ProbeState{
			{Syscall: "read", Active: true},
			{Syscall: "write", Active: true},
			{Syscall: "openat", Active: true},
		},
	}
	m := NewModel(fm).Open()
	m.search = "read"

	_, cmd := m.Update(tea.KeyPressMsg{Code: []rune{'n'}[0], Text: string([]rune{'n'})})
	if cmd == nil {
		t.Fatalf("expected bulk off command")
	}
	msg := cmd()
	if toggled, ok := msg.(ProbeToggledMsg); !ok || toggled.Err != nil {
		t.Fatalf("unexpected bulk off msg: %#v", msg)
	}
	if len(fm.toggles) != 3 {
		t.Fatalf("expected all probes toggled off despite filter, got toggles=%+v", fm.toggles)
	}

	// Re-open with all inactive and filtered search still present; "a" should
	// toggle all probes back on.
	m = NewModel(fm).Open()
	m.search = "read"
	fm.toggles = nil
	_, cmd = m.Update(tea.KeyPressMsg{Code: []rune{'a'}[0], Text: string([]rune{'a'})})
	if cmd == nil {
		t.Fatalf("expected bulk on command")
	}
	msg = cmd()
	if toggled, ok := msg.(ProbeToggledMsg); !ok || toggled.Err != nil {
		t.Fatalf("unexpected bulk on msg: %#v", msg)
	}
	if len(fm.toggles) != 3 {
		t.Fatalf("expected all probes toggled on despite filter, got toggles=%+v", fm.toggles)
	}
}