aboutsummaryrefslogtreecommitdiff
path: root/internal/tui/tui_test.go
blob: baa5c053d1ab5d90211924ac5e8b27f7286e7750 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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)
	}
}