package savestatus import ( "bytes" "html/template" "os/exec" "strings" "testing" ) func render(t *testing.T, data Data) string { t.Helper() view, err := template.New("test").Parse(Template()) if err != nil { t.Fatal(err) } var b bytes.Buffer if err := view.ExecuteTemplate(&b, "estilo-save-status", data); err != nil { t.Fatal(err) } return b.String() } func TestRenderStatesAndSilentUnknown(t *testing.T) { for _, tc := range []struct{ state, want string }{ {"saved", "gespeichert"}, {"saving", "guardando"}, {"retrying", "再試行"}, {"failed", "فشل"}, {"idle", ""}, {"unsupported", ""}, } { t.Run(tc.state, func(t *testing.T) { got := render(t, Data{State: tc.state, Saved: "gespeichert", Saving: "guardando", Retrying: "再試行", Failed: "فشل"}) if !strings.HasSuffix(got, ">"+tc.want+"") { t.Fatalf("wrong initial text: %s", got) } for _, attr := range []string{`role="status"`, `aria-live="polite"`, `aria-atomic="true"`, `estilo-save-status="inline"`} { if !strings.Contains(got, attr) { t.Errorf("missing %s in %s", attr, got) } } if strings.Contains(got, "aria-hidden") || strings.Contains(got, " hidden") || strings.Contains(got, "aria-label") { t.Errorf("silent or unnamed region changed semantics: %s", got) } if tc.want == "" && !strings.Contains(got, `data-state="idle"`) { t.Errorf("unknown state was not normalized: %s", got) } }) } got := render(t, Data{State: "failed", Placement: "floating"}) if !strings.HasSuffix(got, ">") || !strings.Contains(got, `estilo-save-status="floating"`) { t.Fatalf("missing state text must stay empty: %s", got) } } func TestLabelsAndStatusTextAreEscaped(t *testing.T) { unsafe := `">&` got := render(t, Data{State: "failed", Failed: unsafe, Label: unsafe, Placement: unsafe}) if strings.Contains(got, "