package version import ( "os" "testing" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" migrationModels "git.ilapage.cn/ila/yovision/Sense/server/cmd/migrate/migration/models" common "git.ilapage.cn/ila/yovision/Sense/server/common/models" ) func TestOperationsMigrationAddsLeastPrivilegeMenus(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) if err != nil { t.Fatal(err) } if err = db.AutoMigrate(&migrationModels.SysRole{}, &migrationModels.SysMenu{}, &deviceCasbinRule{}, &common.Migration{}); err != nil { t.Fatal(err) } for _, role := range []string{"implementation_operator", "site_admin", "viewer"} { if err = db.Create(&migrationModels.SysRole{RoleName: role, RoleKey: role, Status: "2"}).Error; err != nil { t.Fatal(err) } } const version = "2026082811000_operations.go" if err = migrateSenseOperations(db, version); err != nil { t.Fatal(err) } var menus, reads, retries, viewerRetries, applied int64 db.Model(&migrationModels.SysMenu{}).Where("menu_name LIKE ?", "SenseOperations%").Count(&menus) db.Model(&deviceCasbinRule{}).Where("v1 IN ?", []string{"/api/v1/operations", "/api/v1/operations/:id"}).Count(&reads) db.Model(&deviceCasbinRule{}).Where("v1 = ? AND v2 = ?", "/api/v1/operations/:id/retry", "POST").Count(&retries) db.Model(&deviceCasbinRule{}).Where("v0 = ? AND v1 = ?", "viewer", "/api/v1/operations/:id/retry").Count(&viewerRetries) db.Model(&common.Migration{}).Where("version = ?", version).Count(&applied) if menus != 3 || reads != 6 || retries != 2 || viewerRetries != 0 || applied != 1 { t.Fatalf("menus=%d reads=%d retries=%d viewerRetries=%d applied=%d", menus, reads, retries, viewerRetries, applied) } } func TestOperationsMigrationOnPostgres(t *testing.T) { dsn := os.Getenv("SENSE_OPERATIONS_MIGRATION_TEST_DATABASE_URL") if dsn == "" { t.Skip("set SENSE_OPERATIONS_MIGRATION_TEST_DATABASE_URL to run the PostgreSQL migration test") } db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { t.Fatal(err) } const schema = "sense_operations_74_test" if err = db.Exec("DROP SCHEMA IF EXISTS " + schema + " CASCADE").Error; err != nil { t.Fatal(err) } if err = db.Exec("CREATE SCHEMA " + schema).Error; err != nil { t.Fatal(err) } t.Cleanup(func() { _ = db.Exec("DROP SCHEMA IF EXISTS " + schema + " CASCADE").Error }) sqlDB, err := db.DB() if err != nil { t.Fatal(err) } sqlDB.SetMaxOpenConns(1) if err = db.Exec("SET search_path TO " + schema).Error; err != nil { t.Fatal(err) } if err = db.AutoMigrate(&migrationModels.SysRole{}, &migrationModels.SysMenu{}, &deviceCasbinRule{}, &common.Migration{}); err != nil { t.Fatal(err) } for _, role := range []string{"implementation_operator", "site_admin", "viewer"} { if err = db.Create(&migrationModels.SysRole{RoleName: role, RoleKey: role, Status: "2"}).Error; err != nil { t.Fatal(err) } } if err = migrateSenseOperations(db, "2026082811000_operations.go"); err != nil { t.Fatal(err) } var menus, policies int64 db.Model(&migrationModels.SysMenu{}).Where("menu_name LIKE ?", "SenseOperations%").Count(&menus) db.Model(&deviceCasbinRule{}).Where("v1 LIKE ?", "/api/v1/operations%").Count(&policies) if menus != 3 || policies != 8 { t.Fatalf("menus=%d policies=%d", menus, policies) } }