Files
MujicaUI/uptime_bar_test.go
T
2026-10-05 14:48:37 -04:00

88 lines
2.3 KiB
Go

package mujica
import (
"math"
"testing"
"github.com/egoist/mygo/ui"
)
func uptimeSample(n int) []UptimeDay {
days := make([]UptimeDay, n)
start := Date{Year: 2026, Month: 9, Day: 1}
for i := range days {
days[i] = UptimeDay{Date: start.AddDays(i), Uptime: 1}
}
days[3] = UptimeDay{Date: start.AddDays(3), Uptime: 0.9975, Note: "slow search"}
days[7] = UptimeDay{Date: start.AddDays(7), Uptime: 0.91, Note: "2 h outage"}
days[9].Uptime = math.NaN()
return days
}
func uptimeTester(days []UptimeDay, frame ChartFrame, points *[]int) *ui.Tester {
if frame.Label == "" {
frame.Label = "API uptime"
}
return ui.NewTester(func(c *ui.Context) {
Use(c, Settings{})
ui.Column(c).Padding(10).Children(func() {
r := UptimeBar(c, days, UptimeBarOptions{Frame: frame})
*points = append(*points, r.Point)
})
}, 520, 140)
}
func TestUptimeBarKeyboardReadout(t *testing.T) {
var pts []int
tt := uptimeTester(uptimeSample(30), ChartFrame{}, &pts)
tt.Key(0, ui.KeyTab)
tt.Key(0, ui.KeyRight)
for range 7 {
tt.Key(0, ui.KeyRight)
}
if !tt.HasText("2026-09-08 · Outage · 91.00% · 2 h outage") {
t.Fatalf("readout: %q", tt.Texts())
}
tt.Key(0, ui.KeyRight)
tt.Key(0, ui.KeyRight)
if !tt.HasText("2026-09-10 · No data") {
t.Fatalf("no data readout: %q", tt.Texts())
}
}
func TestUptimeBarHover(t *testing.T) {
var pts []int
tt := uptimeTester(uptimeSample(30), ChartFrame{}, &pts)
// The 4th of 30 bars across 500 DIPs starting at x = 10.
tt.Move(10+500*3.5/30, 30)
if pts[len(pts)-1] != 3 || !tt.HasText("2026-09-04 · Degraded · 99.75% · slow search") {
t.Fatalf("hover point %d: %q", pts[len(pts)-1], tt.Texts())
}
}
func TestUptimeBarStatesAndRules(t *testing.T) {
var pts []int
tt := uptimeTester(nil, ChartFrame{}, &pts)
if !tt.HasText("No data") {
t.Fatalf("empty: %q", tt.Texts())
}
tt = uptimeTester(uptimeSample(12), ChartFrame{Status: DataLoading}, &pts)
if !tt.HasText("Loading") {
t.Fatalf("loading: %q", tt.Texts())
}
defer func() {
if recover() == nil {
t.Fatal("uptime above 1 did not panic")
}
}()
uptimeTester([]UptimeDay{{Uptime: 1.2}}, ChartFrame{}, &pts)
}
func TestUptimeBarSnapshot(t *testing.T) {
snapshot(t, "uptime_bar", 520, 110, func(c *ui.Context) {
ui.Column(c).Padding(10).Children(func() {
UptimeBar(c, uptimeSample(45), UptimeBarOptions{Frame: ChartFrame{Label: "API uptime"}})
})
})
}