Files
zuevav 7c653a2490 Версии систем: общий список в «Обзоре» и строка в разделе каждого модуля
bj собирает версии своих компонентов и внешних систем (в фоне, кэш 10 минут, прогрев при старте):
ядро и модули bj (components.json или «-version»), экспортёр ARQA (служба bj-quikexport, /version),
криптосервис (Health), «Валидата CSP» (zpki1utl), Java, ИШ НРД (deps.json + сайт НРД),
МНП QUIK (VersionInfo), DEPO (OD_DATA_VERSION), PostgreSQL, ОС. «Настройка → Обзор» — таблица
«Версии систем» с кнопкой «Обновить сведения»; в разделах БД, Fancy, QUIK МНП, Экспорт QUIK,
Криптография, НРД, ЛК, НПР и Обновления — строка с версией. В таблице обновлений у компонентов,
выложенных вручную, вместо «неизвестна» — версия самого компонента. bj-component-install: -version.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 12:00:00 +03:00

79 lines
3.4 KiB
Go

package lkgateway
import (
"html/template"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
)
// Страница службы модуля встраивается в макет bj: меню и заголовок bj, содержимое — от модуля.
func TestModulePageWrap(t *testing.T) {
a, err := newAdmin()
if err != nil {
t.Fatal(err)
}
rec := httptest.NewRecorder()
frag := `<div id="npr-frag"><script src="/admin/npr/static/htmx.min.js"></script>фрагмент</div>`
render(rec, a.modulePage, modulePageData{page: nowPage("Клиент V3BR061 · НПР / УДС", "npr"), Content: template.HTML(frag)})
if rec.Code != http.StatusOK {
t.Fatalf("код %d: %s", rec.Code, rec.Body.String())
}
body := rec.Body.String()
for _, want := range []string{frag, "Клиент V3BR061 · НПР / УДС", "</html>"} {
if !strings.Contains(body, want) {
t.Errorf("в странице нет %q", want)
}
}
if strings.Count(body, "<html") != 1 {
t.Errorf("ожидался один документ, <html встречается %d раз", strings.Count(body, "<html"))
}
}
// Раздел «Экспорт QUIK» от службы встраивается в страницу настроек, индикатор меню — от службы.
func TestSetupPageEmbedsQuikExport(t *testing.T) {
a, err := newAdmin()
if err != nil {
t.Fatal(err)
}
rec := httptest.NewRecorder()
frag := `<h1>QUIK — Экспорт биржевой информации</h1><div id="qx-frag">раздел службы</div>`
render(rec, a.setup, SetupData{page: nowPage("Настройка", "setup"), AdvancedUnlocked: true, Modules: map[string]bool{"quik-export": true, "quik-mnp": true, "npr": true},
QuikExport: QuikExportView{HTML: template.HTML(frag), Ind: "warn"}})
if rec.Code != http.StatusOK {
t.Fatalf("код %d: %s", rec.Code, rec.Body.String())
}
body := rec.Body.String()
if !strings.Contains(body, frag) {
t.Error("в странице настроек нет раздела от службы")
}
if !strings.Contains(body, `Экспорт QUIK<span class="ind warn">`) {
t.Error("индикатор меню не взят у службы")
}
}
// Версии: общий список в «Обзоре» и строка в разделе модуля.
func TestSetupPageShowsVersions(t *testing.T) {
a, err := newAdmin()
if err != nil {
t.Fatal(err)
}
vers := SystemVersions{At: time.Now(), Items: []SystemVersion{
{Key: "quik-mnp", Title: "QUIK — Модуль неторговых поручений", Version: "21.3.0", Detail: "обновлена 05.06.2026", Section: "quik"},
{Key: "depo", Title: "Fancy DEPO (база DEPO)", Section: "fancy", Err: "нет связи"},
}}
rec := httptest.NewRecorder()
render(rec, a.setup, SetupData{page: nowPage("Настройка", "setup"), AdvancedUnlocked: true, Modules: map[string]bool{"quik-mnp": true}, Versions: vers})
if rec.Code != http.StatusOK {
t.Fatalf("код %d: %s", rec.Code, rec.Body.String())
}
body := rec.Body.String()
for _, want := range []string{"Версии систем", "<strong>21.3.0</strong>", "QUIK — Модуль неторговых поручений: <strong>21.3.0</strong> · обновлена 05.06.2026", "не определена", "нет связи"} {
if !strings.Contains(body, want) {
t.Errorf("в странице нет %q", want)
}
}
}