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) } } }