Files
cthulhu/internal/app/progress_browser_native_test.go
2026-10-14 18:22:59 -04:00

80 lines
2.3 KiB
Go

// Copyright (c) 2026 Storm Dragon
// Authors: Storm Dragon, Angus Kola
// SPDX-License-Identifier: GPL-3.0-or-later
package app
import (
"context"
"os"
"os/exec"
"testing"
"time"
"git.stormux.org/storm/cthulhu/internal/atspi"
)
// Standard web progress must reach the shared handler without Steam policy.
func TestNativeBrowserProgress(t *testing.T) {
if os.Getenv("CTHULHU_NATIVE_BROWSER") != "1" {
t.Skip("requires private browser session")
}
ctx, cancel := context.WithTimeout(context.Background(), 25*time.Second)
defer cancel()
adapter := atspi.New()
if err := adapter.Start(ctx); err != nil {
t.Fatal(err)
}
defer adapter.Stop(context.Background())
if output, err := exec.CommandContext(ctx, "xdotool", "key", "--clearmodifiers", "Tab").CombinedOutput(); err != nil {
t.Fatalf("fixture focus: %s, %v", output, err)
}
for {
select {
case event := <-adapter.Events():
if event.Type == atspi.FocusedStateEvent && event.Detail1 == 1 && event.Source.Name == "Update progress" {
goto focused
}
case <-ctx.Done():
t.Fatal("update button focus missing")
}
}
focused:
speech := &fakeSpeechQueue{spoken: make(chan string, 8), requests: make(chan speechRequest, 8)}
handler := &accessibilityEventHandler{state: &eventLoopState{}, speech: speech}
if output, err := exec.CommandContext(ctx, "xdotool", "key", "--clearmodifiers", "space").CombinedOutput(); err != nil {
t.Fatalf("update progress: %s, %v", output, err)
}
seen := make(map[string]bool)
for len(seen) < 2 {
select {
case event := <-adapter.Events():
if !isValueChangeEvent(event.Type) || event.Source.Role != "progress bar" {
continue
}
wantTone := ""
switch event.Source.Name {
case "Native progress":
wantTone = "generated-progress-tone:20"
case "ARIA progress":
wantTone = "generated-progress-tone:30"
default:
continue
}
if seen[event.Source.Name] {
continue
}
if !handler.handle_progress_bar(event) || len(speech.requests) != 1 {
t.Fatalf("web progress was lost: %+v", event)
}
request := <-speech.requests
if len(request.Sound) != 1 || request.Sound[0].Name != wantTone || !request.Append || request.Text != "" {
t.Fatalf("web progress output: %+v", request)
}
seen[event.Source.Name] = true
case <-ctx.Done():
t.Fatalf("web progress events missing; received %v", seen)
}
}
}