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