package tui import ( "strings" "testing" "github.com/lukaszkasprzak/lectio/internal/config" "github.com/lukaszkasprzak/lectio/internal/liturgy" ) func TestVersionCycle(t *testing.T) { m := New(config.Config{Versions: []string{"pl", "wuj", "vul"}, DefaultVersion: "pl"}) if m.version() != "pl" { t.Fatalf("start = %q", m.version()) } m = m.cycleVersion(+1) if m.version() != "wuj" { t.Errorf("after tab = %q", m.version()) } m = m.cycleVersion(-1) if m.version() != "pl" { t.Errorf("after shift-tab = %q", m.version()) } } func TestOfflineDropsPL(t *testing.T) { m := New(config.Config{Versions: []string{"pl", "wuj", "vul"}, DefaultVersion: "pl", Offline: true}) for _, v := range m.versions { if v == "pl" { t.Error("offline model kept pl") } } } // TestBodyLinesLocalisesMessages checks that the loading/no-readings/error // messages follow cfg.UILanguage. func TestBodyLinesLocalisesMessages(t *testing.T) { en := Model{cfg: config.Config{UILanguage: "en"}, loading: true} if lines := en.bodyLines(80); len(lines) == 0 || !strings.Contains(lines[0], "loading") { t.Errorf("en loading bodyLines = %v, want it to contain %q", lines, "loading") } pl := Model{cfg: config.Config{UILanguage: "pl"}, loading: true} if lines := pl.bodyLines(80); len(lines) == 0 || !strings.Contains(lines[0], "ładowanie") { t.Errorf("pl loading bodyLines = %v, want it to contain %q", lines, "ładowanie") } enEmpty := Model{cfg: config.Config{UILanguage: "en"}, date: "2026-07-22"} if lines := enEmpty.bodyLines(80); len(lines) == 0 || !strings.Contains(lines[0], "no readings for") { t.Errorf("en no-readings bodyLines = %v, want it to contain %q", lines, "no readings for") } } // TestBodyLinesLocalisesHeading checks that a modern-lectionary section // heading's label word follows cfg.UILanguage while the citation stays // exactly as scraped (render.LocalizeHeading, brief §3b). func TestBodyLinesLocalisesHeading(t *testing.T) { sec := liturgy.Section{Heading: "Ewangelia (J 20, 1. 11-18)", PartID: "ewangelia"} en := Model{cfg: config.Config{UILanguage: "en", Lectionary: "new"}, sections: []liturgy.Section{sec}} body := strings.Join(en.bodyLines(80), "\n") if !strings.Contains(body, "Gospel (J 20, 1. 11-18)") { t.Errorf("en bodyLines missing localised heading: %q", body) } pl := Model{cfg: config.Config{UILanguage: "pl", Lectionary: "new"}, sections: []liturgy.Section{sec}} body = strings.Join(pl.bodyLines(80), "\n") if !strings.Contains(body, "Ewangelia (J 20, 1. 11-18)") { t.Errorf("pl bodyLines missing unchanged heading: %q", body) } } // TestFooterKeysLocalised checks the footer keybar text follows // cfg.UILanguage. func TestFooterKeysLocalised(t *testing.T) { en := Model{cfg: config.Config{UILanguage: "en"}, date: "2026-07-22"} if out := en.View(); !strings.Contains(out, "q quit") { t.Errorf("en View() footer missing %q: %q", "q quit", out) } pl := Model{cfg: config.Config{UILanguage: "pl"}, date: "2026-07-22"} if out := pl.View(); !strings.Contains(out, "q wyjście") { t.Errorf("pl View() footer missing %q: %q", "q wyjście", out) } }