Files
ttstd-infinite-canvas/backend/internal/service/plugin_management_test.go
QAyong a6504c0e00 feat(plugin): AI 审美批改 - 增加结构化视觉分析与精准标注 (#387)
* feat(portrait-clearance): 肖像排查 - 增加画布插件与本机检测链路

* fix(web): 插件中心 - 修复应用插件筛选与自动定位

* feat(plugin): AI审美批改 - 完成分析报告与问题标注闭环
2026-09-02 20:32:58 +08:00

79 lines
2.9 KiB
Go

package service
import (
"testing"
"infinite-canvas/backend/internal/model"
"infinite-canvas/backend/internal/repository"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func TestApplicationPluginUsesUserStateUnderPlatformAvailability(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file:"+newID()+"?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.PluginPlatformState{}, &model.UserPluginState{}, &model.AdminAuditEvent{}); err != nil {
t.Fatal(err)
}
center, err := newPluginRuntime(t.TempDir())
if err != nil {
t.Fatal(err)
}
svc := &Service{repo: repository.New(db), pluginRuntime: center}
user := &model.User{ID: "user-1", Role: model.UserRoleUser}
admin := &model.User{ID: "admin-1", Role: model.UserRoleAdmin}
states, err := svc.PluginStatesForUser(user)
if err != nil {
t.Fatal(err)
}
initial := states[WorkflowPluginRunningHub]
if !initial.PlatformAvailable || initial.UserEnabled || initial.EffectiveEnabled || !initial.CanToggle {
t.Fatalf("initial RunningHub state = %#v", initial)
}
enabled, err := svc.SetUserPluginEnabled(user, WorkflowPluginRunningHub, true)
if err != nil {
t.Fatal(err)
}
if !enabled.UserConfigured || !enabled.UserEnabled || !enabled.EffectiveEnabled {
t.Fatalf("enabled RunningHub state = %#v", enabled)
}
if _, err := svc.SetPluginPlatformAvailability(user, WorkflowPluginRunningHub, false); err == nil {
t.Fatal("ordinary user changed platform plugin availability")
}
disabled, err := svc.SetPluginPlatformAvailability(admin, WorkflowPluginRunningHub, false)
if err != nil {
t.Fatal(err)
}
if disabled.PlatformAvailable || disabled.EffectiveEnabled || disabled.EnabledUserCount != 1 {
t.Fatalf("platform-disabled RunningHub state = %#v", disabled)
}
if err := svc.RequireWorkflowPluginForUser(user.ID, "runninghub-workflow-image"); err == nil {
t.Fatal("platform-disabled workflow was accepted for a new user request")
}
if _, err := svc.SetPluginPlatformAvailability(admin, WorkflowPluginRunningHub, true); err != nil {
t.Fatal(err)
}
if err := svc.RequireWorkflowPluginForUser(user.ID, "runninghub-workflow-video"); err != nil {
t.Fatalf("restored user workflow rejected: %v", err)
}
}
func TestUploadedManifestCannotClaimUserActivationScope(t *testing.T) {
policy := pluginManagement(PluginPromptOptimizer, PluginOriginUploaded)
if policy.Origin != PluginOriginUploaded || policy.ActivationScope != PluginScopeSystem || policy.ConfigurationScope != PluginConfigurationSystem {
t.Fatalf("uploaded plugin policy = %#v", policy)
}
}
func TestArtCritiqueIsUserToggleableApplication(t *testing.T) {
policy := pluginManagement(PluginAIArtCritique, "bundled")
if policy.Origin != PluginOriginOfficial || policy.Kind != PluginKindApplication || policy.ActivationScope != PluginScopeUser || policy.ConfigurationScope != PluginConfigurationNone {
t.Fatalf("AI art critique policy = %#v", policy)
}
}