97e99b72c7
bj-quikexport (modules/quikexport + cmd/bj-quikexport, 127.0.0.1:8084): управление ARQA quikexport перенесено из bj-server. Настройки у службы в /var/lib/bj/.bj/quik-export/settings.json (при первом запуске переносятся из setup.json), раздел отдаётся фрагментом с индикатором меню, действия отвечают X-BJ-Flash. bj-server встраивает раздел в «Настройку», проксирует формы /admin/setup/quikexport/… и передаёт лицензию (X-BJ-Licensed). Общая проверка служебного ключа — modules/modkit (им пользуется и bj-npr), общее для прокси — lkgateway/modules.go. Выделенные из ядра модули (bj-npr, bj-quikexport: Component.FromCore) при обновлении ставятся и там, где их ещё нет, если входят в лицензию: release.MarkSplitModules, request.json "new", root-установщик ставит и включает unit-файл из комплекта. Если в обновлении меняется сам установщик, модули ставятся после перезапуска bj-server (ensureSplitModules). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
55 lines
2.2 KiB
Go
55 lines
2.2 KiB
Go
package lkgateway
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// Страница службы модуля встраивается в макет 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("индикатор меню не взят у службы")
|
|
}
|
|
}
|