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 TestEnsurePaymentConfigurationIsIdempotent(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) require.NoError(t, err) global.GVA_DB = db require.NoError(t, db.AutoMigrate( &dao.PaymentMethodConfig{}, &dao.PaymentEntryConfig{}, &dao.PaymentEntryMethod{}, &dao.SysBaseMenu{}, &dao.SysAuthorityMenu{}, &dao.SysApi{}, )) parking := dao.SysBaseMenu{Path: "parking", Name: "parking", Meta: dao.Meta{Title: "停车管理"}} require.NoError(t, db.Create(&parking).Error) require.NoError(t, EnsurePaymentConfiguration()) require.NoError(t, EnsurePaymentConfiguration()) var methods []dao.PaymentMethodConfig require.NoError(t, db.Order("sort").Find(&methods).Error) require.Len(t, methods, 3) require.Equal(t, "cash", methods[0].Code) require.True(t, methods[0].Enabled) require.Equal(t, []string{"counter"}, methods[0].Scenes) var entries []dao.PaymentEntryConfig require.NoError(t, db.Order("sort").Find(&entries).Error) require.Len(t, entries, 2) var relationCount int64 require.NoError(t, db.Model(&dao.PaymentEntryMethod{}).Count(&relationCount).Error) require.EqualValues(t, 5, relationCount) var menuCount int64 require.NoError(t, db.Model(&dao.SysBaseMenu{}).Where("name = ?", "paymentMethodConfig").Count(&menuCount).Error) require.EqualValues(t, 1, menuCount) var permissionCount int64 require.NoError(t, db.Model(&dao.SysAuthorityMenu{}).Count(&permissionCount).Error) require.EqualValues(t, 7, permissionCount) var ruleCount int64 require.NoError(t, db.Table("casbin_rule").Count(&ruleCount).Error) require.EqualValues(t, 47, ruleCount) } func TestEnsurePaymentConfigurationPermissionMatrix(t *testing.T) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) require.NoError(t, err) global.GVA_DB = db t.Cleanup(func() { global.GVA_DB = nil }) require.NoError(t, db.AutoMigrate( &dao.PaymentMethodConfig{}, &dao.PaymentEntryConfig{}, &dao.PaymentEntryMethod{}, &dao.SysBaseMenu{}, &dao.SysAuthorityMenu{}, &dao.SysApi{}, )) parking := dao.SysBaseMenu{Path: "parking", Name: "parking", Meta: dao.Meta{Title: "停车管理"}} require.NoError(t, db.Create(&parking).Error) require.NoError(t, EnsurePaymentConfiguration()) assertPolicy := func(role, path, method string, expected bool) { t.Helper() var count int64 require.NoError(t, db.Table("casbin_rule").Where( "ptype = ? AND v0 = ? AND v1 = ? AND v2 = ?", "p", role, path, method, ).Count(&count).Error) require.Equal(t, expected, count > 0, "role=%s path=%s method=%s", role, path, method) } for _, role := range []string{"618", "888", "9527"} { assertPolicy(role, "/payment/methods/enabled", "GET", true) assertPolicy(role, "/payment/methods/options", "GET", true) assertPolicy(role, "/payment/entries/enabled", "GET", true) assertPolicy(role, "/payment/entries/options", "GET", true) assertPolicy(role, "/digital-ticket/list", "GET", true) assertPolicy(role, "/digital-ticket/:ticketNo/pay", "POST", true) assertPolicy(role, "/digital-ticket/:ticketNo/exit", "POST", true) } for _, role := range []string{"888", "9527"} { assertPolicy(role, "/payment/methods", "POST", true) assertPolicy(role, "/payment/methods/:id/status", "PATCH", true) assertPolicy(role, "/payment/entries", "POST", true) assertPolicy(role, "/payment/entries/:id/status", "PATCH", true) } assertPolicy("618", "/payment/methods", "POST", false) assertPolicy("618", "/payment/methods/:id/status", "PATCH", false) assertPolicy("618", "/payment/entries", "POST", false) assertPolicy("618", "/payment/entries/:id/status", "PATCH", false) assertPolicy("618", "/payment/methods", "DELETE", false) }