package web
import (
"bytes"
"html/template"
"strings"
"testing"
"rond-with-you/internal/auth"
"rond-with-you/internal/setting"
)
// TestNavShowsAllPagesToAdmin 钉住导航的显隐口径:页面开关**只管访客**。
//
// 站长的公开页一直是能访问的(guardPage 只拦访客),导航却没跟着放行——
// 关掉页面开关后站长自己也只剩「主页」一个入口,明明能访问却点不到。
// 这条口径必须和 guardPage 保持一致,所以两边都写死在这里。
func TestNavShowsAllPagesToAdmin(t *testing.T) {
base, err := template.New("layout.html").Funcs(templateFuncs()).ParseFS(tmplFS, "templates/layout.html")
if err != nil {
t.Fatalf("解析 layout.html: %v", err)
}
renderNav := func(p Page) string {
t.Helper()
var buf bytes.Buffer
if err := base.ExecuteTemplate(&buf, "nav", p); err != nil {
t.Fatalf("渲染 nav: %v", err)
}
return buf.String()
}
links := []string{`href="/map"`, `href="/places"`, `href="/timeline"`, `href="/stats"`, `href="/report"`}
// 页面开关全关:访客点不到,站长必须照样有入口
closed := setting.Default()
closed.Pages = nil
adminNav := renderNav(Page{Nav: "home", Settings: closed, User: &auth.User{}})
for _, l := range links {
if !strings.Contains(adminNav, l) {
t.Errorf("站点关闭了页面开关,但站长导航少了 %s——开关只管访客", l)
}
}
visitorNav := renderNav(Page{Nav: "home", Settings: closed})
for _, l := range links {
if strings.Contains(visitorNav, l) {
t.Errorf("页面已对访客关闭,访客导航里不该出现 %s", l)
}
}
// 反向:全开放时访客也要看得到(防止把判据改成「只有站长」)
openNav := renderNav(Page{Nav: "home", Settings: setting.Default()})
for _, l := range links {
if !strings.Contains(openNav, l) {
t.Errorf("页面已对访客开放,访客导航里应出现 %s", l)
}
}
}