implement basic acl operations and tests
This commit is contained in:
156
internal/acl_test/crud_test.go
Normal file
156
internal/acl_test/crud_test.go
Normal file
@@ -0,0 +1,156 @@
|
||||
package acl_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"git.oblat.lv/alex/triggerssmith/internal/acl"
|
||||
"git.oblat.lv/alex/triggerssmith/internal/user"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func openTestDB(t *testing.T) *gorm.DB {
|
||||
t.Helper()
|
||||
|
||||
// Путь к файлу базы
|
||||
dbPath := filepath.Join("testdata", "test.db")
|
||||
|
||||
// Удаляем старую базу, если есть
|
||||
os.Remove(dbPath)
|
||||
|
||||
db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to open test db: %v", err)
|
||||
}
|
||||
|
||||
// Миграция таблицы User для связи с ACL
|
||||
if err := db.AutoMigrate(&user.User{}); err != nil {
|
||||
t.Fatalf("failed to migrate User: %v", err)
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
|
||||
func TestACLService_CRUD(t *testing.T) {
|
||||
db := openTestDB(t)
|
||||
|
||||
// Создаём сервис ACL
|
||||
svc, err := acl.NewService(db)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create ACL service: %v", err)
|
||||
}
|
||||
|
||||
if err := svc.Init(); err != nil {
|
||||
t.Fatalf("failed to init ACL service: %v", err)
|
||||
}
|
||||
|
||||
// Создаём роли
|
||||
if err := svc.CreateRole("admin"); err != nil {
|
||||
t.Fatalf("CreateRole failed: %v", err)
|
||||
}
|
||||
if err := svc.CreateRole("guest"); err != nil {
|
||||
t.Fatalf("CreateRole failed: %v", err)
|
||||
}
|
||||
|
||||
roles, err := svc.GetRoles()
|
||||
if err != nil {
|
||||
t.Fatalf("GetRoles failed: %v", err)
|
||||
}
|
||||
if len(roles) != 2 {
|
||||
t.Fatalf("expected 2 roles, got %d", len(roles))
|
||||
}
|
||||
|
||||
// Создаём ресурсы
|
||||
if err := svc.CreateResource("*"); err != nil {
|
||||
t.Fatalf("CreateResource failed: %v", err)
|
||||
}
|
||||
if err := svc.CreateResource("html.view.*"); err != nil {
|
||||
t.Fatalf("CreateResource failed: %v", err)
|
||||
}
|
||||
|
||||
resources, err := svc.GetPermissions()
|
||||
if err != nil {
|
||||
t.Fatalf("GetPermissions failed: %v", err)
|
||||
}
|
||||
if len(resources) != 2 {
|
||||
t.Fatalf("expected 2 resources, got %d", len(resources))
|
||||
}
|
||||
|
||||
// 1. Создаём сервис user
|
||||
store, err := user.NewGormUserStore(db)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create user store: %v", err)
|
||||
}
|
||||
userSvc, err := user.NewService(store)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create user service: %v", err)
|
||||
}
|
||||
|
||||
// 2. Инициализируем
|
||||
if err := userSvc.Init(); err != nil {
|
||||
t.Fatalf("failed to init user service: %v", err)
|
||||
}
|
||||
|
||||
user := &user.User{
|
||||
Username: "testuser",
|
||||
Email: "testuser@example.com",
|
||||
Password: "secret",
|
||||
}
|
||||
|
||||
u := user
|
||||
|
||||
// 3. Создаём пользователя через сервис
|
||||
err = userSvc.Create(user)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to create user: %v", err)
|
||||
}
|
||||
|
||||
// Привязываем роль к пользователю
|
||||
adminRoleID := roles[0].ID
|
||||
if err := svc.AssignRoleToUser(adminRoleID, uint(u.ID)); err != nil {
|
||||
t.Fatalf("AssignRoleToUser failed: %v", err)
|
||||
}
|
||||
|
||||
userRoles, err := svc.GetUserRoles(uint(u.ID))
|
||||
if err != nil {
|
||||
t.Fatalf("GetUserRoles failed: %v", err)
|
||||
}
|
||||
if len(userRoles) != 1 || userRoles[0].ID != adminRoleID {
|
||||
t.Fatalf("expected user to have admin role")
|
||||
}
|
||||
|
||||
// Привязываем ресурсы к роли
|
||||
for _, res := range resources {
|
||||
if err := svc.AssignResourceToRole(adminRoleID, res.ID); err != nil {
|
||||
t.Fatalf("AssignResourceToRole failed: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
roleResources, err := svc.GetRoleResources(adminRoleID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetRoleResources failed: %v", err)
|
||||
}
|
||||
if len(roleResources) != 2 {
|
||||
t.Fatalf("expected role to have 2 resources")
|
||||
}
|
||||
|
||||
// Удаляем ресурс из роли
|
||||
if err := svc.RemoveResourceFromRole(adminRoleID, resources[0].ID); err != nil {
|
||||
t.Fatalf("RemoveResourceFromRole failed: %v", err)
|
||||
}
|
||||
roleResources, _ = svc.GetRoleResources(adminRoleID)
|
||||
if len(roleResources) != 1 {
|
||||
t.Fatalf("expected 1 resource after removal")
|
||||
}
|
||||
|
||||
// Удаляем роль у пользователя
|
||||
if err := svc.RemoveRoleFromUser(adminRoleID, uint(u.ID)); err != nil {
|
||||
t.Fatalf("RemoveRoleFromUser failed: %v", err)
|
||||
}
|
||||
userRoles, _ = svc.GetUserRoles(uint(u.ID))
|
||||
if len(userRoles) != 0 {
|
||||
t.Fatalf("expected user to have 0 roles after removal")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user