Files
MujicaUI/examples/gallery/pages_messaging_test.go
T

123 lines
3.4 KiB
Go

package main
import (
"fmt"
"image/png"
"os"
"path/filepath"
"slices"
"strings"
"testing"
"github.com/egoist/mygo/ui"
mujica "mujicaui"
)
func messagingDemoTester(t *testing.T, id string, mode mujica.Mode) (*ui.Tester, *[]string) {
t.Helper()
i := slices.IndexFunc(messagingPages, func(p page) bool { return p.ID == id })
if i < 0 {
t.Fatalf("missing page %s", id)
}
events := &[]string{}
tt := ui.NewTester(func(c *ui.Context) {
mujica.Use(c, mujica.Settings{Mode: mode})
ui.Scroll(c).Fill().Padding(24).Gap(12).Children(func() {
messagingPages[i].Demo(c, func(s string) { *events = append(*events, s) })
})
}, 900, 800)
tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1})
tt.Frame()
return tt, events
}
func TestMessagingDemosInteractAndLog(t *testing.T) {
cases := []struct{ id, click, event string }{
{"401", "random, 120 unread", "channel random"},
{"402", "Like", "reaction true"},
{"403", "Unread count", "unread 7"},
{"404", "Read", "receipt 0"},
{"405", "Sakiko", "member 1"},
{"406", "Message", "Message"},
{"407", "Presence", "presence 3"},
{"408", "Status text", "status changed"},
{"409", "Mute", "mute true"},
{"410", "Speaking", "Speaking = false"},
{"411", "Incoming call", "Declined"},
{"412", "grinning face", "emoji "},
{"413", "Unpin Uika's message", "unpin b"},
{"414", "Reply in thread", "reply sent"},
{"415", "Star Second act", "star 1"},
{"416", "Download score.pdf", "download attachment 0"},
{"417", "Attach", "attachment added"},
{"418", "Recipients", "recipients 1"},
{"419", "Show quoted text (2 lines)", "quote expanded true"},
{"420", "Tomorrow", "snooze "},
}
if len(messagingPages) != len(cases) {
t.Fatalf("pages=%d, cases=%d", len(messagingPages), len(cases))
}
for _, tc := range cases {
for _, mode := range []mujica.Mode{mujica.Light, mujica.Dark} {
t.Run(tc.id+mode.String(), func(t *testing.T) {
tt, events := messagingDemoTester(t, tc.id, mode)
if err := tt.Click(tc.click); err != nil {
t.Fatal(err)
}
switch tc.id {
case "403":
tt.Command("selectAll")
tt.Type("7")
tt.Key(0, ui.KeyEnter)
case "404":
if err := tt.Click("Sent"); err != nil {
t.Fatal(err)
}
case "407":
tt.Key(0, ui.KeyDown)
tt.Key(0, ui.KeyDown)
tt.Key(0, ui.KeyEnter)
case "408":
tt.Type("Rehearsing")
case "411":
tt.Key(0, ui.KeyEnter)
case "414":
tt.Type("Second act")
tt.Key(0, ui.KeyEnter)
case "418":
tt.Type("guest@example.com")
tt.Key(0, ui.KeyEnter)
}
if !slices.ContainsFunc(*events, func(s string) bool { return strings.HasPrefix(s, tc.event) }) {
t.Fatalf("want %q, events %v", tc.event, *events)
}
})
}
}
}
func TestMessagingDemoCaptures(t *testing.T) {
dir := os.Getenv("MESSAGING_DEMO_DIR")
if dir == "" {
t.Skip("set MESSAGING_DEMO_DIR to export demos")
}
for _, p := range messagingPages {
if p.Category != "Messaging & Mail" || p.Code == "" || p.Keys == "" {
t.Fatalf("incomplete page %s", p.ID)
}
for _, mode := range []mujica.Mode{mujica.Light, mujica.Dark} {
tt, _ := messagingDemoTester(t, p.ID, mode)
f, err := os.Create(filepath.Join(dir, fmt.Sprintf("%s-%s.png", p.ID, mode)))
if err != nil {
t.Fatal(err)
}
if err := png.Encode(f, tt.Image()); err != nil {
t.Fatal(err)
}
if err := f.Close(); err != nil {
t.Fatal(err)
}
}
}
}