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("стартовая страница риск-менеджера — НПР") } }