package web
import (
"bytes"
"html/template"
"path/filepath"
"strings"
"testing"
"time"
)
// TestPageTemplatesParse 把每个页面模板都解析一遍。
// 模板是启动时编译的(见 New),语法错会让整个服务起不来;
// 这个测试把它提前到 go test 阶段,不用真起一次服务才发现。
func TestPageTemplatesParse(t *testing.T) {
for key, def := range pageFiles {
if _, err := template.New(filepath.Base(def.files[0])).Funcs(templateFuncs()).
ParseFS(tmplFS, def.files...); err != nil {
t.Errorf("解析模板 %s 失败: %v", key, err)
}
}
}
// TestLayoutFooterToleratesMissingLastVisit 钉住页脚在「数据集一条到访都没有」时也渲染得完。
//
// last_visit_at 可以为 NULL(refreshDatasetAgg 用 LEFT JOIN 求 max,零到访就写 NULL),
// 而 d 的形参是 time.Time、实参是 *time.Time:非 nil 时模板会自动解一层指针,**nil 时报
// "dereference of nil pointer" 并中断渲染**。render() 只把错误记进日志,客户端拿到的是
// HTTP 200 加一个「页脚之后整段不存在」的页面——滚动恢复、地图脚本引入全丢,
// 服务端一点动静都没有。所以这里断言「有收尾的