operation_permission_seed_test.go 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package initialize
  2. import (
  3. "testing"
  4. "github.com/glebarez/sqlite"
  5. "github.com/stretchr/testify/require"
  6. "gorm.io/gorm"
  7. "wails-app/internal/dao"
  8. "wails-app/internal/global"
  9. )
  10. func TestEnsureOperationPermissionsIsIdempotent(t *testing.T) {
  11. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  12. require.NoError(t, err)
  13. require.NoError(t, db.AutoMigrate(&dao.SysApi{}))
  14. global.GVA_DB = db
  15. t.Cleanup(func() { global.GVA_DB = nil })
  16. require.NoError(t, db.Create(&dao.SysApi{
  17. Path: "/ticket-machine/test", Description: "旧票机测试", ApiGroup: "开发调试", Method: "GET",
  18. }).Error)
  19. require.NoError(t, db.Exec(`CREATE TABLE casbin_rule (
  20. id INTEGER PRIMARY KEY AUTOINCREMENT,
  21. ptype TEXT, v0 TEXT, v1 TEXT, v2 TEXT, v3 TEXT, v4 TEXT, v5 TEXT
  22. )`).Error)
  23. require.NoError(t, db.Exec(
  24. "INSERT INTO casbin_rule (ptype, v0, v1, v2) VALUES (?, ?, ?, ?)",
  25. "p", "618", "/ticket-machine/test", "GET",
  26. ).Error)
  27. require.NoError(t, db.Exec(
  28. "INSERT INTO casbin_rule (ptype, v0, v1, v2) VALUES (?, ?, ?, ?)",
  29. "p", "618", "/channel/test-event", "POST",
  30. ).Error)
  31. require.NoError(t, EnsureOperationPermissions())
  32. require.NoError(t, EnsureOperationPermissions())
  33. routes := [][2]string{
  34. {"/vehicle/entry", "POST"},
  35. {"/vehicle/operation/context", "POST"},
  36. {"/vehicle/passage", "POST"},
  37. {"/channel/events", "GET"},
  38. {"/parking/gate/devices", "GET"},
  39. {"/parking/gate/open", "POST"},
  40. {"/parking/gate/close", "POST"},
  41. {"/ticket-machine/button", "POST"},
  42. }
  43. for _, route := range routes {
  44. var apiCount int64
  45. require.NoError(t, db.Model(&dao.SysApi{}).
  46. Where("path = ? AND method = ?", route[0], route[1]).Count(&apiCount).Error)
  47. require.EqualValues(t, 1, apiCount, route)
  48. var ruleCount int64
  49. require.NoError(t, db.Table("casbin_rule").
  50. Where("v0 IN ? AND v1 = ? AND v2 = ?", []string{"618", "888", "9527"}, route[0], route[1]).
  51. Count(&ruleCount).Error)
  52. require.EqualValues(t, 3, ruleCount, route)
  53. }
  54. debugRoutes := [][2]string{
  55. {"/ticket-machine/test", "POST"},
  56. {"/ticket-machine/debug", "POST"},
  57. {"/ticket-machine/usb-list", "GET"},
  58. {"/channel/test-event", "POST"},
  59. }
  60. for _, route := range debugRoutes {
  61. var apiCount int64
  62. require.NoError(t, db.Model(&dao.SysApi{}).
  63. Where("path = ? AND method = ?", route[0], route[1]).Count(&apiCount).Error)
  64. require.EqualValues(t, 1, apiCount, route)
  65. var adminRuleCount int64
  66. require.NoError(t, db.Table("casbin_rule").
  67. Where("v0 IN ? AND v1 = ? AND v2 = ?", []string{"888", "9527"}, route[0], route[1]).
  68. Count(&adminRuleCount).Error)
  69. require.EqualValues(t, 2, adminRuleCount, route)
  70. var operatorRuleCount int64
  71. require.NoError(t, db.Table("casbin_rule").
  72. Where("v0 = ? AND v1 = ? AND v2 = ?", "618", route[0], route[1]).
  73. Count(&operatorRuleCount).Error)
  74. require.Zero(t, operatorRuleCount, route)
  75. }
  76. var legacyAPICount int64
  77. require.NoError(t, db.Unscoped().Model(&dao.SysApi{}).
  78. Where("path = ? AND method = ?", "/ticket-machine/test", "GET").Count(&legacyAPICount).Error)
  79. require.Zero(t, legacyAPICount)
  80. var legacyRuleCount int64
  81. require.NoError(t, db.Table("casbin_rule").
  82. Where("v1 = ? AND v2 = ?", "/ticket-machine/test", "GET").Count(&legacyRuleCount).Error)
  83. require.Zero(t, legacyRuleCount)
  84. }