internal/web/web_test.go

d6d57309d9ddb202b5c9a29ff4f4d22c000f3874
gitbay/internal/web/web_test.go history · blame · raw

73 lines · 2295 bytes

 1package web
 2
 3import (
 4	"io/fs"
 5	"regexp"
 6	"strings"
 7	"testing"
 8)
 9
10// Every page template parses with the layout at start-up, so a broken
11// template fails the process rather than the first visit to its page.
12// Package init has already done the work; this asserts it covered every
13// file (#116).
14func TestEveryPageTemplateParses(t *testing.T) {
15	names := Pages()
16	if len(names) < 30 {
17		t.Fatalf("only %d page templates parsed: %v", len(names), names)
18	}
19	for _, want := range []string{"tree.html", "blob.html", "mr.html", "issue.html", "dashboard.html", "registered.html"} {
20		if _, ok := pages[want]; !ok {
21			t.Errorf("%s not parsed", want)
22		}
23	}
24}
25
26// A th with no rule of its own falls back to the browser's centred default
27// (#151). The classes that do left-align one are read out of the stylesheet
28// rather than listed here, so a new rule does not need a test change.
29func TestHeaderRowsAreLeftAligned(t *testing.T) {
30	aligned := map[string]bool{}
31	for _, rule := range strings.Split(string(StyleCSS), "}") {
32		sel, decls, ok := strings.Cut(rule, "{")
33		if !ok || !strings.Contains(decls, "text-align: left") || !strings.Contains(sel, "th") {
34			continue
35		}
36		for _, class := range regexp.MustCompile(`\.([a-z-]+)`).FindAllStringSubmatch(sel, -1) {
37			aligned[class[1]] = true
38		}
39	}
40	if len(aligned) == 0 {
41		t.Fatal("no left-aligning th rule found in the stylesheet")
42	}
43
44	classes := regexp.MustCompile(`class="([^"]*)"`)
45	entries, err := fs.ReadDir(templateFS, "templates")
46	if err != nil {
47		t.Fatal(err)
48	}
49	for _, e := range entries {
50		b, err := templateFS.ReadFile("templates/" + e.Name())
51		if err != nil {
52			t.Fatal(err)
53		}
54		// The table and row tags a header sits under, plus the header row
55		// itself: any one of them may carry the class.
56		for _, head := range strings.Split(string(b), "<thead>")[1:] {
57			open, _, _ := strings.Cut(head, "</tr>")
58			before := strings.Split(string(b), "<thead>"+head)[0]
59			if i := strings.LastIndex(before, "<table"); i >= 0 {
60				open += before[i:]
61			}
62			hit := false
63			for _, m := range classes.FindAllStringSubmatch(open, -1) {
64				for _, c := range strings.Fields(m[1]) {
65					hit = hit || aligned[c]
66				}
67			}
68			if !hit {
69				t.Errorf("%s: header row is not left-aligned by any rule: %.60s", e.Name(), open)
70			}
71		}
72	}
73}