feat(bj): модуль ЛК на PostgreSQL, обмен с DEPO, боевой ЛК с имитатором НРД, QUIK, НПР
- bj_exchange и «кран» Fancy убраны: данные модуля ЛК в PostgreSQL (схема lk) - трансферные таблицы FTV_M2M: создание при установке, события, справочник участников - сверка с DEPO: счёт, ФИО, дата рождения, ИИС по договору, квал-инвестор из опции DEPO - боевой ЛК ЕСИА Финанс при тестовом ИШ: журнал, отказ через DEPO, статусы в ЛК - онлайн-лицензирование в bj, план тестирования M2M для контрагента (интерактивный HTML) - модули QUIK МНП, экспорт QUIK, НПР/УДС; документы и тестовые материалы Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
package lkgateway
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestLKDepoRejectText(t *testing.T) {
|
||||
res := depoResult{Ran: true, Recommend: "reject", Secs: []depoSecResult{{
|
||||
Security: "RU0009029540",
|
||||
Checks: []depoCheck{
|
||||
{Name: "Российский выпуск (RU-ISIN)", OK: true, Code: "M2M01"},
|
||||
{Name: "Остаток ≥ количеству (98070.04)", OK: false, Code: "QTY", Detail: "на торговом счёте ВТНКЦ00000001: 0 шт., списываем 10 — недостаточно"},
|
||||
{Name: "Задолженность по комиссиям", OK: true, Warn: true},
|
||||
},
|
||||
}}}
|
||||
code, short, text := lkDepoRejectText(res)
|
||||
if code != "QTY" {
|
||||
t.Errorf("код %q, ожидали QTY", code)
|
||||
}
|
||||
if short != "Отказ по результатам проверки депозитария: "+m2mCodeLabel("QTY") || strings.Contains(short, "Причина") {
|
||||
t.Errorf("короткий текст для ЛК: %q", short)
|
||||
}
|
||||
for _, want := range []string{"Отказ по результатам проверки депозитария", "(QTY)", "Причина: Остаток ≥ количеству (98070.04): на торговом счёте"} {
|
||||
if !strings.Contains(text, want) {
|
||||
t.Errorf("в тексте нет %q: %s", want, text)
|
||||
}
|
||||
}
|
||||
if strings.Contains(text, "Российский выпуск") || strings.Contains(text, "комиссиям") {
|
||||
t.Errorf("пройденные проверки не должны попадать в причину: %s", text)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLKEmulateNSD(t *testing.T) {
|
||||
rc, err := NewRuntimeConfig(filepath.Join(t.TempDir(), "setup.json"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
s := rc.Snapshot()
|
||||
s.LK.ActiveEnv, s.NSD.Profile = "prod", "test3-gost"
|
||||
if err := rc.UpdateLK(s.LK); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := rc.UpdateNSD(s.NSD); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if on, why := lkEmulateNSD(rc); !on || !strings.Contains(why, "тестовом профиле") {
|
||||
t.Errorf("боевой ЛК + тестовый ИШ: ожидали имитацию, получили %v %q", on, why)
|
||||
}
|
||||
s.LK.ActiveEnv = "test"
|
||||
_ = rc.UpdateLK(s.LK)
|
||||
if on, _ := lkEmulateNSD(rc); on {
|
||||
t.Error("тестовый ЛК без флага: имитации быть не должно")
|
||||
}
|
||||
s.LK.EmulateNSD = true
|
||||
_ = rc.UpdateLK(s.LK)
|
||||
if on, why := lkEmulateNSD(rc); !on || why != "включена в настройках" {
|
||||
t.Errorf("флаг в настройках: %v %q", on, why)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user