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