basicly implement acl crud ops with roles and resources

This commit is contained in:
2025-12-20 17:38:15 +02:00
parent c188b46519
commit 904f446447
18 changed files with 1607 additions and 324 deletions

View File

@@ -1,156 +1,158 @@
package acl_test
import (
"os"
"path/filepath"
"testing"
// DEPRECATED TEST FILE
"git.oblat.lv/alex/triggerssmith/internal/acl"
"git.oblat.lv/alex/triggerssmith/internal/user"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// import (
// "os"
// "path/filepath"
// "testing"
func openTestDB(t *testing.T) *gorm.DB {
t.Helper()
// "git.oblat.lv/alex/triggerssmith/internal/acl"
// "git.oblat.lv/alex/triggerssmith/internal/user"
// "gorm.io/driver/sqlite"
// "gorm.io/gorm"
// )
// Путь к файлу базы
dbPath := filepath.Join("testdata", "test.db")
// func openTestDB(t *testing.T) *gorm.DB {
// t.Helper()
// Удаляем старую базу, если есть
os.Remove(dbPath)
// // Путь к файлу базы
// dbPath := filepath.Join("testdata", "test.db")
db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
if err != nil {
t.Fatalf("failed to open test db: %v", err)
}
// // Удаляем старую базу, если есть
// os.Remove(dbPath)
// Миграция таблицы User для связи с ACL
if err := db.AutoMigrate(&user.User{}); err != nil {
t.Fatalf("failed to migrate User: %v", err)
}
// db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
// if err != nil {
// t.Fatalf("failed to open test db: %v", err)
// }
return db
}
// // Миграция таблицы User для связи с ACL
// if err := db.AutoMigrate(&user.User{}); err != nil {
// t.Fatalf("failed to migrate User: %v", err)
// }
func TestACLService_CRUD(t *testing.T) {
db := openTestDB(t)
// return db
// }
// Создаём сервис ACL
svc, err := acl.NewService(db)
if err != nil {
t.Fatalf("failed to create ACL service: %v", err)
}
// func TestACLService_CRUD(t *testing.T) {
// db := openTestDB(t)
if err := svc.Init(); err != nil {
t.Fatalf("failed to init ACL service: %v", err)
}
// // Создаём сервис ACL
// svc, err := acl.NewService(db)
// if err != nil {
// t.Fatalf("failed to create 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)
}
// if err := svc.Init(); err != nil {
// t.Fatalf("failed to init ACL service: %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.CreateRole("admin"); err != nil {
// t.Fatalf("CreateRole failed: %v", err)
// }
// if err := svc.CreateRole("guest"); err != nil {
// t.Fatalf("CreateRole failed: %v", err)
// }
// Создаём ресурсы
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)
}
// 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))
// }
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))
}
// // Создаём ресурсы
// 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)
// }
// 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)
}
// 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))
// }
// 2. Инициализируем
if err := userSvc.Init(); err != nil {
t.Fatalf("failed to init user service: %v", err)
}
// // 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)
// }
user := &user.User{
Username: "testuser",
Email: "testuser@example.com",
Password: "secret",
}
// // 2. Инициализируем
// if err := userSvc.Init(); err != nil {
// t.Fatalf("failed to init user service: %v", err)
// }
u := user
// user := &user.User{
// Username: "testuser",
// Email: "testuser@example.com",
// Password: "secret",
// }
// 3. Создаём пользователя через сервис
err = userSvc.Create(user)
if err != nil {
t.Fatalf("failed to create user: %v", err)
}
// u := user
// Привязываем роль к пользователю
adminRoleID := roles[0].ID
if err := svc.AssignRoleToUser(adminRoleID, uint(u.ID)); err != nil {
t.Fatalf("AssignRoleToUser failed: %v", err)
}
// // 3. Создаём пользователя через сервис
// err = userSvc.Create(user)
// if err != nil {
// t.Fatalf("failed to create user: %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")
}
// // Привязываем роль к пользователю
// adminRoleID := roles[0].ID
// if err := svc.AssignRoleToUser(adminRoleID, uint(u.ID)); err != nil {
// t.Fatalf("AssignRoleToUser failed: %v", err)
// }
// Привязываем ресурсы к роли
for _, res := range resources {
if err := svc.AssignResourceToRole(adminRoleID, res.ID); err != nil {
t.Fatalf("AssignResourceToRole 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")
// }
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")
}
// // Привязываем ресурсы к роли
// for _, res := range resources {
// if err := svc.AssignResourceToRole(adminRoleID, res.ID); err != nil {
// t.Fatalf("AssignResourceToRole failed: %v", err)
// }
// }
// Удаляем ресурс из роли
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")
}
// 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.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")
}
}
// // Удаляем ресурс из роли
// 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")
// }
// }