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,66 @@
|
||||
package lkgateway
|
||||
|
||||
import "testing"
|
||||
|
||||
func withFeatures(t *testing.T, features ...string) {
|
||||
t.Helper()
|
||||
prev := featureAllowed
|
||||
featureAllowed = func(f string) bool {
|
||||
for _, x := range features {
|
||||
if x == f {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
t.Cleanup(func() { featureAllowed = prev })
|
||||
}
|
||||
|
||||
func TestRolesFollowLicensedModules(t *testing.T) {
|
||||
withFeatures(t) // лицензия без модулей
|
||||
|
||||
if roleAvailable("risk") {
|
||||
t.Fatal("риск-менеджер без модуля НПР должен быть недоступен")
|
||||
}
|
||||
for _, k := range []string{"admin", "operator", "viewer"} {
|
||||
if !roleAvailable(k) {
|
||||
t.Fatalf("базовая роль %s должна быть доступна", k)
|
||||
}
|
||||
}
|
||||
if got := len(availableModules()); got != 0 {
|
||||
t.Fatalf("модулей без лицензии: %d, ожидалось 0", got)
|
||||
}
|
||||
admin := &User{Role: "admin"}
|
||||
if admin.Can("npr") || admin.Can("quik") || !admin.Can("settings") || !admin.Can("users") {
|
||||
t.Fatal("администратор: права модулей должны зависеть от лицензии, базовые — нет")
|
||||
}
|
||||
risk := &User{Role: "risk"}
|
||||
if userHasAccess(risk) || risk.Home() != "/admin/" {
|
||||
t.Fatal("риск-менеджер без НПР не должен иметь доступа")
|
||||
}
|
||||
viewer := &User{Role: "viewer", Modules: []string{"npr"}}
|
||||
if viewer.Can("npr") {
|
||||
t.Fatal("выданный модуль вне лицензии не должен действовать")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRolesWithLicensedModules(t *testing.T) {
|
||||
withFeatures(t, "npr", "quik-mnp")
|
||||
|
||||
if !roleAvailable("risk") {
|
||||
t.Fatal("риск-менеджер с модулем НПР должен быть доступен")
|
||||
}
|
||||
op := &User{Role: "operator"}
|
||||
if !op.Can("quik") {
|
||||
t.Fatal("оператор с quik-mnp должен видеть поручения QUIK")
|
||||
}
|
||||
if (&User{Role: "admin"}).Can("export") {
|
||||
t.Fatal("экспорт QUIK без признака quik-export не должен действовать")
|
||||
}
|
||||
if got := len(availableModules()); got != 2 {
|
||||
t.Fatalf("подключённых модулей %d, ожидалось 2", got)
|
||||
}
|
||||
if (&User{Role: "risk"}).Home() != "/admin/npr" {
|
||||
t.Fatal("стартовая страница риск-менеджера — НПР")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user