feat(tui): add dashboard.Run bridging engine to Bubble Tea

This commit is contained in:
MDietermann
2026-04-13 22:11:54 +02:00
parent 5c5076f1f1
commit 7baf0fceaa
2 changed files with 89 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
package dashboard
import (
"bytes"
"io"
"testing"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/x/exp/teatest"
"github.com/MDietermann/ArduinoArchSetup/internal/engine"
"github.com/MDietermann/ArduinoArchSetup/internal/tui"
)
// TestModelEndToEnd drives the Model through teatest, feeding in the same
// message sequence that the TeaReporter + engine goroutine would produce.
func TestModelEndToEnd(t *testing.T) {
m := NewModel([]string{"alpha"}, map[string]string{"alpha": "Alpha"})
tm := teatest.NewTestModel(t, m, teatest.WithInitialTermSize(80, 24))
tm.Send(tui.ProgressMsg{ModuleID: "alpha", Current: 1, Total: 1, Message: "installing"})
tm.Send(DoneMsg{Summary: engine.Summary{Results: []engine.ModuleResult{
{ID: "alpha", Status: engine.StatusSucceeded},
}}})
tm.Send(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'q'}})
tm.WaitFinished(t, teatest.WithFinalTimeout(3*time.Second))
out := readAll(t, tm.FinalOutput(t))
if !bytes.Contains(out, []byte("alpha")) || !bytes.Contains(out, []byte("summary:")) {
t.Fatalf("unexpected final output:\n%s", out)
}
}
func readAll(t *testing.T, r io.Reader) []byte {
t.Helper()
b, err := io.ReadAll(r)
if err != nil {
t.Fatal(err)
}
return b
}