package web import ( "context" "net/http" "net/http/httptest" "regexp" "strconv" "strings" "testing" ) // TestStackedTablesHaveLabels 守住「窄屏宽表变一屏一行」这条改动的核心不变量: // 每张打了 tb-stack 的表,窄屏会把表头藏起来、改成「字段名 + 值」竖排,字段名只能取自 // td 的 data-label。少写一个标签,那一格在手机上就是没有名字的裸值——而桌面端一切正常, // 很难发现(这轮就漏过两次:一张表的中间几行、后台两张表的「状态 / 对访客 / 操作」)。 // 顺带钉住每行格子数 == 表头列数,否则说明模板结构歪了。 // // ROND_TEST_CONF=conf/app-test.ini ROND_SRC=data/xxx.rondbackup go test ./internal/web -run StackedTables -v func TestStackedTablesHaveLabels(t *testing.T) { f := newMovementFixture(t) var topicID int64 if err := f.pg.QueryRowContext(f.ctx, `SELECT id FROM topics WHERE dataset_id=$1 ORDER BY id LIMIT 1`, f.dsID).Scan(&topicID); err != nil { topicID = 0 // 这个数据集没有专题,就少查一页 } type target struct { path string h http.HandlerFunc admin bool } targets := []target{ {"/places", f.srv.placesPage, false}, {"/stats", f.srv.statsPage, false}, {"/", f.srv.home, false}, {"/report", f.srv.reportPage, false}, {"/admin", f.srv.adminHome, true}, {"/admin/topics", f.srv.topicsAdminPage, true}, } if topicID > 0 { targets = append(targets, target{"/topics/" + strconv.FormatInt(topicID, 10), f.srv.topicPage, false}) } tableRe := regexp.MustCompile(`(?s)]*class="[^"]*tb-stack[^"]*"[^>]*>.*?`) rowRe := regexp.MustCompile(`(?s)]*>(.*?)`) tdRe := regexp.MustCompile(`(?s)]*)>`) thRe := regexp.MustCompile(`]`) total := 0 for _, tg := range targets { ctx := context.Background() if tg.admin { ctx = f.ctx // 夹具的 ctx 里已经注入登录态 } w := httptest.NewRecorder() tg.h(w, httptest.NewRequest("GET", tg.path, nil).WithContext(ctx)) if w.Code != 200 { t.Logf("%s 渲染 code=%d,跳过", tg.path, w.Code) continue } for ti, tb := range tableRe.FindAllString(w.Body.String(), -1) { total++ head := "" if i, j := strings.Index(tb, ""), strings.Index(tb, ""); i >= 0 && j > i { head = tb[i:j] } cols := len(thRe.FindAllString(head, -1)) for ri, row := range rowRe.FindAllString(tb, -1) { if !strings.Contains(row, " 0 && len(cells) != cols { t.Errorf("%s 第 %d 张表第 %d 行有 %d 格,表头 %d 列", tg.path, ti+1, ri+1, len(cells), cols) } for ci, c := range cells { if ci == 0 { continue // 首格是这一行的主角,故意不带标签 } if !strings.Contains(c[1], "data-label=") { t.Errorf("%s 第 %d 张表第 %d 行第 %d 格没有 data-label(窄屏会变成没有名字的裸值)", tg.path, ti+1, ri+1, ci+1) } } } } } if total == 0 { t.Fatal("一页 tb-stack 表都没找到:模板里的类名是不是被改掉了") } t.Logf("检查了 %d 张 tb-stack 表", total) }