Новая capability web-ui: презентационный перенос готового дизайна
(семантический HTML + единый jellybit.css, тёмная тема по настройке ОС)
в html/template без шага сборки.
- Встроенная (go:embed) отдача статики под /static с Cache-Control и
cache-busting (?v=<hash> по содержимому css/js).
- Шрифты IBM Plex self-hosted (@font-face, cyrillic+latin), без CDN.
- Наколеночный менеджер зависимостей: вендор (htmx + шрифты) не хранится
в репо (gitignore), идемпотентно добывается `task assets` по
web/assets.manifest с проверкой sha256; task build/run зависят от assets.
- Общие партиалы: шапка, бейдж статуса (карта всех 14 состояний),
виджет «файл источника → раскладка» (общий для review и download).
- Страницы: список с фильтром/поиском, ревью, новая страница просмотра
загрузки (/download/{id}). deleted скрыт по умолчанию.
- Превью раскладки берётся из единой логики internal/layout
(buildFileRows), без дублирования правил имён в шаблонах.
- Убраны meta-refresh и инлайн-стили; copyHash на vanilla с fallback
на execCommand и честной индикацией (целевой деплой — HTTP LAN).
Вне scope (отдельный change): живые обновления прогресса и раздел
раздачи, клиентский режим ручной раскладки файл→серия (с Alpine.js).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
28 lines
891 B
Go
28 lines
891 B
Go
package httpapi
|
|
|
|
import (
|
|
"log/slog"
|
|
"net/http/httptest"
|
|
"testing"
|
|
)
|
|
|
|
func TestRequestLogLevel(t *testing.T) {
|
|
cases := []struct {
|
|
method, path string
|
|
want slog.Level
|
|
}{
|
|
{"GET", "/healthz", slog.LevelDebug}, // healthcheck — тихо
|
|
{"GET", "/", slog.LevelDebug}, // список загрузок
|
|
{"GET", "/review/1", slog.LevelDebug}, // страница ревью
|
|
{"GET", "/api/downloads", slog.LevelInfo}, // REST API — на INFO
|
|
{"POST", "/ui/downloads/1/apply", slog.LevelInfo}, // мутация — на INFO
|
|
{"POST", "/api/downloads", slog.LevelInfo}, // приём — на INFO
|
|
}
|
|
for _, c := range cases {
|
|
r := httptest.NewRequest(c.method, c.path, nil)
|
|
if got := requestLogLevel(r); got != c.want {
|
|
t.Errorf("%s %s: level=%v, want %v", c.method, c.path, got, c.want)
|
|
}
|
|
}
|
|
}
|