package initialize import ( "testing" "github.com/glebarez/sqlite" "github.com/stretchr/testify/require" "gorm.io/gorm" "wails-app/internal/dao" "wails-app/internal/global" ) func TestEnsureOperationPermissionsIsIdempotent(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) require.NoError(t, err) require.NoError(t, db.AutoMigrate(&dao.SysApi{})) global.GVA_DB = db t.Cleanup(func() { global.GVA_DB = nil }) require.NoError(t, db.Create(&dao.SysApi{ Path: "/ticket-machine/test", Description: "旧票机测试", ApiGroup: "开发调试", Method: "GET", }).Error) require.NoError(t, db.Exec(`CREATE TABLE casbin_rule ( id INTEGER PRIMARY KEY AUTOINCREMENT, ptype TEXT, v0 TEXT, v1 TEXT, v2 TEXT, v3 TEXT, v4 TEXT, v5 TEXT )`).Error) require.NoError(t, db.Exec( "INSERT INTO casbin_rule (ptype, v0, v1, v2) VALUES (?, ?, ?, ?)", "p", "618", "/ticket-machine/test", "GET", ).Error) require.NoError(t, db.Exec( "INSERT INTO casbin_rule (ptype, v0, v1, v2) VALUES (?, ?, ?, ?)", "p", "618", "/channel/test-event", "POST", ).Error) require.NoError(t, EnsureOperationPermissions()) require.NoError(t, EnsureOperationPermissions()) routes := [][2]string{ {"/vehicle/entry", "POST"}, {"/vehicle/operation/context", "POST"}, {"/vehicle/passage", "POST"}, {"/channel/events", "GET"}, {"/parking/gate/devices", "GET"}, {"/parking/gate/open", "POST"}, {"/parking/gate/close", "POST"}, {"/ticket-machine/button", "POST"}, } for _, route := range routes { var apiCount int64 require.NoError(t, db.Model(&dao.SysApi{}). Where("path = ? AND method = ?", route[0], route[1]).Count(&apiCount).Error) require.EqualValues(t, 1, apiCount, route) var ruleCount int64 require.NoError(t, db.Table("casbin_rule"). Where("v0 IN ? AND v1 = ? AND v2 = ?", []string{"618", "888", "9527"}, route[0], route[1]). Count(&ruleCount).Error) require.EqualValues(t, 3, ruleCount, route) } debugRoutes := [][2]string{ {"/ticket-machine/test", "POST"}, {"/ticket-machine/debug", "POST"}, {"/ticket-machine/usb-list", "GET"}, {"/channel/test-event", "POST"}, } for _, route := range debugRoutes { var apiCount int64 require.NoError(t, db.Model(&dao.SysApi{}). Where("path = ? AND method = ?", route[0], route[1]).Count(&apiCount).Error) require.EqualValues(t, 1, apiCount, route) var adminRuleCount int64 require.NoError(t, db.Table("casbin_rule"). Where("v0 IN ? AND v1 = ? AND v2 = ?", []string{"888", "9527"}, route[0], route[1]). Count(&adminRuleCount).Error) require.EqualValues(t, 2, adminRuleCount, route) var operatorRuleCount int64 require.NoError(t, db.Table("casbin_rule"). Where("v0 = ? AND v1 = ? AND v2 = ?", "618", route[0], route[1]). Count(&operatorRuleCount).Error) require.Zero(t, operatorRuleCount, route) } var legacyAPICount int64 require.NoError(t, db.Unscoped().Model(&dao.SysApi{}). Where("path = ? AND method = ?", "/ticket-machine/test", "GET").Count(&legacyAPICount).Error) require.Zero(t, legacyAPICount) var legacyRuleCount int64 require.NoError(t, db.Table("casbin_rule"). Where("v1 = ? AND v2 = ?", "/ticket-machine/test", "GET").Count(&legacyRuleCount).Error) require.Zero(t, legacyRuleCount) }