This repository has no description
1package pages
2
3import (
4 "io/fs"
5 "regexp"
6 "strings"
7 "testing"
8)
9
10var repoRkeyAllowlist = map[string]bool{
11 "templates/repo/settings/sites.html": true,
12}
13
14var repoRkeyPattern = regexp.MustCompile(`\.(Repo|RepoInfo)\.Rkey\b`)
15
16func TestNoRepoRkeyInTemplates(t *testing.T) {
17 err := fs.WalkDir(Files, "templates", func(path string, d fs.DirEntry, err error) error {
18 if err != nil {
19 return err
20 }
21 if d.IsDir() || !strings.HasSuffix(path, ".html") {
22 return nil
23 }
24 if repoRkeyAllowlist[path] {
25 return nil
26 }
27 data, err := fs.ReadFile(Files, path)
28 if err != nil {
29 return err
30 }
31 for i, line := range strings.Split(string(data), "\n") {
32 if repoRkeyPattern.MatchString(line) {
33 t.Errorf("%s:%d uses .Repo.Rkey or .RepoInfo.Rkey in URL position. Use .Slug to prefer Name over TID-Rkey.\n %s",
34 path, i+1, strings.TrimSpace(line))
35 }
36 }
37 return nil
38 })
39 if err != nil {
40 t.Fatal(err)
41 }
42}
43
44var bareDidAllowlist = map[string]bool{
45 "templates/strings/string.html": true,
46 "templates/strings/fragments/form.html": true,
47}
48
49var didCloseAsUrlSegment = regexp.MustCompile(`\.(?:Did|OwnerDid)\s*\}\}\s*/`)
50var printfWithUrlFormat = regexp.MustCompile(`printf\s+"[^"]*/[^"]*%s`)
51var didArgRef = regexp.MustCompile(`\b[\$\.]\w+(?:\.\w+)*\.(?:Did|OwnerDid)\b`)
52
53func TestNoBareDidInTemplateRepoUrls(t *testing.T) {
54 err := fs.WalkDir(Files, "templates", func(path string, d fs.DirEntry, err error) error {
55 if err != nil {
56 return err
57 }
58 if d.IsDir() || !strings.HasSuffix(path, ".html") {
59 return nil
60 }
61 if bareDidAllowlist[path] {
62 return nil
63 }
64 data, err := fs.ReadFile(Files, path)
65 if err != nil {
66 return err
67 }
68 for i, line := range strings.Split(string(data), "\n") {
69 for _, idx := range didCloseAsUrlSegment.FindAllStringIndex(line, -1) {
70 openIdx := strings.LastIndex(line[:idx[0]], "{{")
71 if openIdx == -1 {
72 continue
73 }
74 action := line[openIdx:idx[1]]
75 if !strings.Contains(action, "resolve") {
76 t.Errorf("%s:%d renders raw DID as URL path segment. Wrap in `resolve` so the handle appears.\n %s",
77 path, i+1, strings.TrimSpace(line))
78 break
79 }
80 }
81 if printfWithUrlFormat.MatchString(line) && didArgRef.MatchString(line) && !strings.Contains(line, "resolve ") {
82 t.Errorf("%s:%d builds a URL path via printf with a raw DID arg. Wrap the DID in `resolve` so handle appears.\n %s",
83 path, i+1, strings.TrimSpace(line))
84 }
85 }
86 return nil
87 })
88 if err != nil {
89 t.Fatal(err)
90 }
91}