Files
triggerssmith/internal/acl_test/crud_test.go

157 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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")
}
}