package main import ( "html/template" "os" "strings" "testing" ) func TestInnerCodeTemplate_独立导航与安全表单(t *testing.T) { if _, err := template.ParseFS(templateFS, "templates/*/*.html"); err != nil { t.Fatalf("模板必须可解析: %v", err) } header, err := os.ReadFile("templates/partials/header.html") if err != nil { t.Fatal(err) } headerText := string(header) clientIndex := strings.Index(headerText, `href="/clients"`) innerCodeIndex := strings.Index(headerText, `href="/inner-codes"`) if clientIndex < 0 || innerCodeIndex < 0 || innerCodeIndex < clientIndex { t.Fatal("档口入库码导航必须紧跟在客户端列表之后") } raw, err := os.ReadFile("templates/inner_code/list.html") if err != nil { t.Fatal(err) } page := string(raw) for _, want := range []string{ `action="/inner-codes/import"`, `action="/inner-codes/match"`, `action="/inner-codes/apply"`, `action="/inner-codes/recheck"`, `action="/inner-codes/delete"`, `name="csrf_token"`, `data-check-all`, `data-inner-code-apply-open`, `data-need-checked="inner-code-match"`, `data-inner-code-id="{{.ID}}"`, `data-need-checked="inner-code-delete"`, `data-confirm-delete-action="inner-code-delete"`, `inner-code-delete {{if .CanMatch}}inner-code-match{{end}}{{if .CanApply}} inner-code-apply`, `删除不会撤销顺运宝已写入的快递单号`, `匹配已选`, `aria-label="档口入库码记录列表"`, } { if !strings.Contains(page, want) { t.Errorf("正式页面缺少 %s", want) } } if strings.Contains(page, `{{if not .CanMatch}}disabled{{end}}`) { t.Fatal("所有状态都应允许勾选删除,不能再按 CanMatch 禁用复选框") } } func TestInnerCodeTemplate_模块状态白名单已登记(t *testing.T) { raw, err := os.ReadFile("static/js/app.js") if err != nil { t.Fatal(err) } if !strings.Contains(string(raw), `"/inner-codes": ["date", "status", "q", "page"]`) { t.Fatal("档口入库码页面切换模块后应保持稳定筛选和页码") } for _, want := range []string{ `appendSelectedIDs(matchForm, "inner-code-match")`, `appendSelectedIDs(applyForm, "inner-code-apply")`, `appendSelectedIDs(deleteForm, "inner-code-delete")`, `checkedCount(action)`, `field.name = "ids"`, } { if !strings.Contains(string(raw), want) { t.Errorf("档口入库码选中 ID 提交缺少 %s", want) } } }