package lkgateway import ( "bytes" "html/template" "net/http/httptest" "strings" "testing" "time" ) // Период, сортировка и порции списка. func TestListApply(t *testing.T) { base := time.Date(2026, 10, 20, 12, 0, 0, 0, listMSK) var items []listItem for i := 0; i < 120; i++ { items = append(items, listItem{T: base.Add(-time.Duration(i) * time.Hour), Keys: map[string]string{"party": string(rune('a' + i%26))}, V: i}) } q := parseListQ(httptest.NewRequest("GET", "/x?from=2026-10-19&to=2026-10-20", nil), []string{"time", "party"}) page, total, more := listApply(items, q) if total != 37 || len(page) != 37 || more { // 20.10 12:00 … 19.10 00:00 t.Fatalf("период: total=%d len=%d more=%v", total, len(page), more) } q = parseListQ(httptest.NewRequest("GET", "/x?offset=100", nil), []string{"time", "party"}) page, total, more = listApply(items, q) if total != 120 || len(page) != 20 || more || page[0].V.(int) != 100 { t.Fatalf("порция: total=%d len=%d more=%v", total, len(page), more) } q = parseListQ(httptest.NewRequest("GET", "/x?sort=party&dir=asc", nil), []string{"time", "party"}) page, _, more = listApply(items, q) if page[0].Keys["party"] != "a" || page[0].V.(int) != 0 || !more { t.Fatalf("сортировка: %v", page[0]) } if q.Query != "dir=asc&sort=party" { t.Fatalf("query: %q", q.Query) } } // Строки «Исходящих» (заявка и анкета), «Входящих» и панель списка отрисовываются. func TestListTemplates(t *testing.T) { for _, c := range []struct { page, row string v any want string }{ {"admin_claims.html", "claimrow", outRow{R: &participantReg{SentAt: time.Now(), PkgID: "34", Name: "ООО", RespAt: time.Now(), Status: "ERROR", Codes: []string{"M2M37"}, RespText: "Некорректно"}}, "Отклонена НРД · M2M37"}, {"admin_claims.html", "claimrow", outRow{C: ClaimView{ID: "abc", Status: "draft"}}, "/admin/claims/abc"}, {"admin_incoming.html", "inrow", &IncomingTransfer{ID: "in1", Status: "pending"}, "/admin/incoming/in1"}, {"admin_claims.html", "listTools", newListView("/admin/claims", "b", listQ{Sort: "time"}, 3, true, "time", "по времени"), "7 дней"}, } { tp, err := template.New("layout.html").Funcs(templateFuncs).Funcs(authTemplateFuncs).ParseFS(templatesFS, "web/templates/layout.html", "web/templates/part_*.html", "web/templates/"+c.page) if err != nil { t.Fatal(err) } var b bytes.Buffer if err := tp.ExecuteTemplate(&b, c.row, c.v); err != nil { t.Fatalf("%s: %v", c.row, err) } if !strings.Contains(b.String(), c.want) { t.Errorf("%s: нет %q в %s", c.row, c.want, b.String()) } } }