284 lines
18 KiB
Go
284 lines
18 KiB
Go
package rolesync
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
|
|
"github.com/gogf/gf/v2/database/gdb"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/library/rolepolicy"
|
|
"git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/model"
|
|
"git.5iot.com/iotlcm-public/iotlcm-worker-svr/internal/model/entity"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestTemplateSwitchOverwritesDefaultRolesAndPreservesOtherRoles(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_dept(dept_id,tenant_id,parent_id,dept_type,dept_role) VALUES (1,'000000',0,1,0),(2,'000000',1,1,21),(3,'000000',2,1,31),(4,'000000',0,1,41)")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role(role_id,tenant_id,dept_id,role_name,role_key,status,data_scope,is_pass,created_dept) VALUES (10,'000000',1,'模板','template','0','4',0,1),(11,'000000',1,'新模板','next','0','4',0,1),(21,'000000',2,'管理员','admin','0','4',0,1),(31,'000000',3,'三级管理员','admin','0','4',0,2),(22,'000000',2,'财务','finance','0','3',0,2),(41,'000000',4,'其他机构','other','0','4',0,4)")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_config(tenant_id,config_key,config_value) VALUES ('000000','agent.role.template.role_id','10')")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role_menu(tenant_id,role_id,menu_id,data_scope) VALUES ('000000',10,100,'0'),('000000',10,200,'0'),('000000',11,200,'0'),('000000',22,100,'3'),('000000',41,100,'0')")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_user_role(user_id,role_id) VALUES(99,21)")
|
|
message := &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1, TemplateRole: true}
|
|
for attempt := 0; attempt < 2; attempt++ {
|
|
if err := SyncInheritedRole(ctx, message); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
if message.TotalCount != 2 || message.SuccessCount != 2 {
|
|
t.Fatalf("unexpected hierarchy counts: %+v", message)
|
|
}
|
|
for _, roleID := range []int64{21, 31} {
|
|
assertAgentRoleSyncCount(t, ctx, fmt.Sprintf("SELECT COUNT(*) FROM sys_role_menu WHERE role_id=%d AND menu_id IN(100,200)", roleID), 2)
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id=22 AND menu_id=200", 0)
|
|
mustExecAgentRoleSyncTest(t, ctx, "UPDATE sys_config SET config_value='11'")
|
|
ids, err := rolepolicy.RestrictMenus(ctx, "000000", 3, []int64{100, 200})
|
|
if err != nil || !reflect.DeepEqual(ids, []int64{100, 200}) {
|
|
t.Fatalf("template switch must wait for confirmed distribution: %v %v", ids, err)
|
|
}
|
|
if err := SyncInheritedRole(ctx, message); err != nil || !message.Superseded {
|
|
t.Fatalf("obsolete template must not propagate: %+v %v", message, err)
|
|
}
|
|
next := &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 11, SourceDeptId: 1, TemplateRole: true}
|
|
if err := SyncInheritedRole(ctx, next); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, roleID := range []int64{21, 31} {
|
|
assertAgentRoleSyncCount(t, ctx, fmt.Sprintf("SELECT COUNT(*) FROM sys_role_menu WHERE role_id=%d AND menu_id=100", roleID), 0)
|
|
assertAgentRoleSyncCount(t, ctx, fmt.Sprintf("SELECT COUNT(*) FROM sys_role_menu WHERE role_id=%d AND menu_id=200", roleID), 1)
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE role_id=31 AND created_dept=2", 1)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id=22 AND menu_id=100", 1)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id=41 AND menu_id=100", 1)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_user_role WHERE user_id=99 AND role_id=21", 1)
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role(role_id,tenant_id,dept_id,is_pass,status,data_scope) VALUES(25,'000000',2,1,'0','4')")
|
|
legacy := &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 25, SourceDeptId: 2}
|
|
if err := SyncInheritedRole(ctx, legacy); err != nil || !legacy.Superseded {
|
|
t.Fatalf("legacy local templates must not overwrite configured hierarchy: %+v %v", legacy, err)
|
|
}
|
|
mustExecAgentRoleSyncTest(t, ctx, "UPDATE sys_config SET config_value='invalid'")
|
|
if _, err := rolepolicy.RestrictMenus(ctx, "000000", 3, []int64{200}); err == nil {
|
|
t.Fatal("invalid template must deny")
|
|
}
|
|
}
|
|
|
|
func TestSyncInheritedRoleOnlyUpdatesDirectEnterpriseChildren(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_dept (dept_id, tenant_id, parent_id, dept_type, dept_role) VALUES
|
|
(1, '000000', 0, 1, 0),
|
|
(2, '000000', 1, 1, 21),
|
|
(3, '000000', 2, 1, 0),
|
|
(4, '000000', 1, 0, 0)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role
|
|
(role_id, tenant_id, dept_id, role_name, role_key, role_sort, data_scope, menu_check_strictly, dept_check_strictly, status, is_pass, created_dept, created_by, updated_by, remark)
|
|
VALUES
|
|
(10, '000000', 1, '企业客户', 'enterpriseCustomer', 1, '4', 1, 1, '0', 1, 1, 1, 1, 'source'),
|
|
(20, '000000', 2, '下级自建角色', 'localRole', 5, '3', 1, 1, '0', 0, 2, 2, 2, 'local'),
|
|
(21, '000000', 2, '旧下发角色', 'enterpriseCustomer', 1, '4', 1, 1, '0', 0, 1, 1, 1, 'legacy')`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role_menu (tenant_id, role_id, menu_id, data_scope) VALUES ('000000', 10, 100, '7')`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role_menu (tenant_id, role_id, menu_id, data_scope) VALUES ('000000', 21, 200, '7')`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_user_role (user_id, role_id) VALUES (99, 21)`)
|
|
|
|
message := &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1, ActorId: 9}
|
|
if err := SyncInheritedRole(ctx, message); err != nil {
|
|
t.Fatalf("first sync failed: %v", err)
|
|
}
|
|
if err := SyncInheritedRole(ctx, message); err != nil {
|
|
t.Fatalf("second sync failed: %v", err)
|
|
}
|
|
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE dept_id = 2 AND created_dept = 1", 1)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE role_id = 21 AND created_dept = 1", 1)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_user_role WHERE user_id = 99 AND role_id = 21", 1)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id = 21 AND menu_id = 200", 0)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE dept_id = 3 AND created_dept = 1", 0)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE dept_id = 4 AND created_dept = 1", 0)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE role_id = 20 AND role_name = '下级自建角色' AND created_dept = 2", 1)
|
|
|
|
menuScope, err := g.DB().GetValue(ctx, `SELECT rm.data_scope FROM sys_role_menu rm JOIN sys_role r ON r.role_id = rm.role_id WHERE r.dept_id = 2 AND r.created_dept = 1 AND rm.menu_id = 100`)
|
|
if err != nil {
|
|
t.Fatalf("query inherited menu data scope failed: %v", err)
|
|
}
|
|
if menuScope.String() != "7" {
|
|
t.Fatalf("inherited menu data scope = %q, want 7", menuScope.String())
|
|
}
|
|
|
|
mustExecAgentRoleSyncTest(t, ctx, `UPDATE sys_role SET role_name = '停止下发后的名称', is_pass = 0 WHERE role_id = 10`)
|
|
if err := SyncInheritedRole(ctx, message); err != nil {
|
|
t.Fatalf("disabled source sync failed: %v", err)
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE dept_id = 2 AND created_dept = 1 AND role_name = '企业客户'", 1)
|
|
}
|
|
|
|
func TestSyncInheritedRoleRejectsUnrelatedDefaultRole(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_dept (dept_id, tenant_id, parent_id, dept_type, dept_role) VALUES (1, '000000', 0, 1, 0), (2, '000000', 1, 1, 21)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role (role_id, tenant_id, dept_id, role_name, role_key, is_pass, created_dept) VALUES (10, '000000', 1, '下发角色', 'source', 1, 1), (21, '000000', 2, '自建默认角色', 'local', 0, 2)`)
|
|
err := SyncInheritedRole(ctx, &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1})
|
|
if err == nil {
|
|
t.Fatal("expected ambiguous default role to be rejected")
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role WHERE role_id = 21 AND created_dept = 2 AND role_name = '自建默认角色'", 1)
|
|
}
|
|
|
|
func TestTemplateSyncReportsMissingRoles(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_dept (dept_id,tenant_id,parent_id,dept_type,dept_role) VALUES (1,'000000',0,1,10),(2,'000000',1,1,0),(3,'000000',1,1,31)")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role (role_id,tenant_id,dept_id,status,data_scope,is_pass) VALUES (10,'000000',1,'0','4',1),(31,'000000',3,'0','4',0)")
|
|
mustExecAgentRoleSyncTest(t, ctx, "UPDATE sys_role SET created_dept=1 WHERE role_id=31")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_config (config_id,tenant_id,config_key,config_value) VALUES (1,'000000','agent.role.template.role_id','10')")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role_menu (tenant_id,role_id,menu_id,data_scope) VALUES ('000000',10,200,'0')")
|
|
if err := SyncInheritedRole(ctx, &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1}); err == nil {
|
|
t.Fatal("missing default role must report partial failure")
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id=31 AND menu_id=200", 1)
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role (role_id,tenant_id,dept_id,status,data_scope) VALUES (21,'000000',2,'0','4')")
|
|
mustExecAgentRoleSyncTest(t, ctx, "UPDATE sys_role SET created_dept=1 WHERE role_id=21")
|
|
mustExecAgentRoleSyncTest(t, ctx, "UPDATE sys_dept SET dept_role=21 WHERE dept_id=2")
|
|
if err := SyncInheritedRole(ctx, &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id=31 AND menu_id=200", 1)
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id=21 AND menu_id=200", 1)
|
|
}
|
|
func setupAgentRoleSyncTestDB(t *testing.T) {
|
|
t.Helper()
|
|
if err := gdb.SetConfig(gdb.Config{
|
|
"default": gdb.ConfigGroup{
|
|
{Type: "sqlite", Link: "sqlite::@file(:memory:)", Debug: false},
|
|
},
|
|
}); err != nil {
|
|
t.Fatalf("configure sqlite failed: %v", err)
|
|
}
|
|
ctx := context.Background()
|
|
t.Cleanup(func() { _ = g.DB().Close(ctx) })
|
|
mustExecAgentRoleSyncTest(t, ctx, `CREATE TABLE sys_dept (dept_id INTEGER PRIMARY KEY, tenant_id TEXT, parent_id INTEGER, dept_type INTEGER, status TEXT DEFAULT '0', dept_role INTEGER, deleted_at DATETIME)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `CREATE TABLE sys_config (config_id INTEGER PRIMARY KEY, tenant_id TEXT, config_name TEXT, config_key TEXT, config_value TEXT, config_type TEXT, created_dept INTEGER, created_by INTEGER, created_at DATETIME, updated_by INTEGER, updated_at DATETIME, remark TEXT)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `CREATE TABLE sys_role (
|
|
role_id INTEGER PRIMARY KEY AUTOINCREMENT, tenant_id TEXT, dept_id INTEGER, role_name TEXT, role_key TEXT, role_sort INTEGER, data_scope TEXT,
|
|
menu_check_strictly INTEGER, dept_check_strictly INTEGER, status TEXT, is_pass INTEGER, created_dept INTEGER, created_by INTEGER, created_at DATETIME, updated_by INTEGER, updated_at DATETIME, deleted_by INTEGER, deleted_at DATETIME, remark TEXT)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `CREATE TABLE sys_role_menu (tenant_id TEXT, role_id INTEGER, menu_id INTEGER, data_scope TEXT)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `CREATE TABLE sys_role_dept (tenant_id TEXT, role_id INTEGER, dept_id INTEGER)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `CREATE TABLE sys_user_role (tenant_id TEXT DEFAULT '000000', user_id INTEGER, role_id INTEGER)`)
|
|
}
|
|
|
|
func mustExecAgentRoleSyncTest(t *testing.T, ctx context.Context, sql string) {
|
|
t.Helper()
|
|
if _, err := g.DB().Exec(ctx, sql); err != nil {
|
|
t.Fatalf("execute sql failed: %v", err)
|
|
}
|
|
}
|
|
|
|
func assertAgentRoleSyncCount(t *testing.T, ctx context.Context, sql string, expected int) {
|
|
t.Helper()
|
|
count, err := g.DB().GetValue(ctx, sql)
|
|
if err != nil {
|
|
t.Fatalf("query count failed: %v", err)
|
|
}
|
|
if count.Int() != expected {
|
|
t.Fatalf("count = %d, want %d, sql=%s", count.Int(), expected, sql)
|
|
}
|
|
}
|
|
|
|
func TestRoleSyncRetriesOnlyFailedDepartments(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_dept (dept_id,tenant_id,parent_id,dept_type,dept_role) VALUES (1,'000000',0,1,0),(2,'000000',1,1,21),(3,'000000',1,1,31)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role (role_id,tenant_id,dept_id,role_name,role_key,is_pass,created_dept) VALUES (10,'000000',1,'source','source',1,1),(21,'000000',2,'before','source',0,1),(31,'000000',3,'local','local',0,3)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role_menu (tenant_id,role_id,menu_id,data_scope) VALUES ('000000',10,100,'7')`)
|
|
message := &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1}
|
|
if err := SyncInheritedRole(ctx, message); err == nil {
|
|
t.Fatal("expected invalid department failure")
|
|
}
|
|
if !reflect.DeepEqual(message.ChildDeptIds, []int64{3}) {
|
|
t.Fatalf("unexpected failures: %v", message.ChildDeptIds)
|
|
}
|
|
mustExecAgentRoleSyncTest(t, ctx, `UPDATE sys_role SET role_name='already-successful' WHERE role_id=21`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `UPDATE sys_role SET created_dept=1,role_key='source' WHERE role_id=31`)
|
|
if err := SyncInheritedRole(ctx, message); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, `SELECT COUNT(*) FROM sys_role WHERE role_id=21 AND role_name='already-successful'`, 1)
|
|
assertAgentRoleSyncCount(t, ctx, `SELECT COUNT(*) FROM sys_role_menu WHERE role_id=31 AND menu_id=100`, 1)
|
|
if len(message.ChildDeptIds) != 0 {
|
|
t.Fatal("failure list must clear after success")
|
|
}
|
|
}
|
|
|
|
func TestObsoleteTemplateTaskDoesNotPropagateAsNormalRole(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_dept (dept_id,tenant_id,parent_id,dept_type,dept_role) VALUES (1,'000000',0,1,10),(2,'000000',1,1,21)")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role (role_id,tenant_id,dept_id,role_key,is_pass,created_dept) VALUES (10,'000000',1,'source',1,1),(21,'000000',2,'source',0,1)")
|
|
mustExecAgentRoleSyncTest(t, ctx, "INSERT INTO sys_role_menu (tenant_id,role_id,menu_id,data_scope) VALUES ('000000',10,100,'7'),('000000',21,200,'7')")
|
|
message := &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1, TemplateRole: true}
|
|
if err := SyncInheritedRole(ctx, message); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !message.Superseded {
|
|
t.Fatal("obsolete template task must be marked superseded")
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, "SELECT COUNT(*) FROM sys_role_menu WHERE role_id=21 AND menu_id=200", 1)
|
|
}
|
|
|
|
func TestMissingDefaultRoleDoesNotCreateOrphanRole(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_dept(dept_id,tenant_id,parent_id,dept_type,dept_role) VALUES(1,'000000',0,1,0),(2,'000000',1,1,0)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role(role_id,tenant_id,dept_id,role_name,role_key,is_pass,created_dept) VALUES(10,'000000',1,'source','source',1,1)`)
|
|
for attempt := 0; attempt < 2; attempt++ {
|
|
if err := SyncInheritedRole(ctx, &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1}); err == nil {
|
|
t.Fatal("missing role must fail")
|
|
}
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, `SELECT COUNT(*) FROM sys_role WHERE dept_id=2`, 0)
|
|
}
|
|
|
|
func TestTemplateChildRevalidatesCurrentBindingAndSource(t *testing.T) {
|
|
for _, change := range []string{
|
|
"UPDATE sys_dept SET parent_id=99 WHERE dept_id=2",
|
|
"UPDATE sys_dept SET dept_type=0 WHERE dept_id=2",
|
|
"UPDATE sys_role SET status='1' WHERE role_id=10",
|
|
"UPDATE sys_role_menu SET data_scope='1' WHERE role_id=10",
|
|
} {
|
|
t.Run(change, func(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_dept(dept_id,tenant_id,parent_id,dept_type,dept_role) VALUES(1,'000000',0,1,0),(2,'000000',1,1,21)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role(role_id,tenant_id,dept_id,status,data_scope,is_pass) VALUES(10,'000000',1,'0','4',1),(21,'000000',2,'0','3',0)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, "UPDATE sys_role SET created_dept=1 WHERE role_id=21")
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_config(tenant_id,config_key,config_value) VALUES('000000','agent.role.template.role_id','10')`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role_menu(tenant_id,role_id,menu_id,data_scope) VALUES('000000',10,100,'0'),('000000',21,200,'0')`)
|
|
mustExecAgentRoleSyncTest(t, ctx, change)
|
|
err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
|
return syncTemplateChildTx(ctx, tx, &entity.SysRole{RoleId: 10, TenantId: "000000", DeptId: 1}, &entity.SysDept{DeptId: 2, DeptRole: 21, ParentId: 1}, 7)
|
|
})
|
|
if err == nil {
|
|
t.Fatal("changed source or binding must fail")
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, `SELECT COUNT(*) FROM sys_role_menu WHERE role_id=21 AND menu_id=200`, 1)
|
|
assertAgentRoleSyncCount(t, ctx, `SELECT COUNT(*) FROM sys_role_menu WHERE role_id=21 AND menu_id=100`, 0)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDeletedDefaultRoleIsNotRestoredBySynchronization(t *testing.T) {
|
|
setupAgentRoleSyncTestDB(t)
|
|
ctx := context.Background()
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_dept(dept_id,tenant_id,parent_id,dept_type,dept_role) VALUES(1,'000000',0,1,0),(2,'000000',1,1,21)`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role(role_id,tenant_id,dept_id,role_name,role_key,is_pass,created_dept,deleted_at) VALUES(10,'000000',1,'source','source',1,1,NULL),(21,'000000',2,'deleted','source',0,1,'2026-10-13 00:00:00')`)
|
|
mustExecAgentRoleSyncTest(t, ctx, `INSERT INTO sys_role_menu(tenant_id,role_id,menu_id,data_scope) VALUES('000000',10,100,'0'),('000000',21,200,'0')`)
|
|
if err := SyncInheritedRole(ctx, &model.AgentRoleSyncMessage{TenantId: "000000", SourceRoleId: 10, SourceDeptId: 1}); err == nil {
|
|
t.Fatal("deleted default role must fail")
|
|
}
|
|
assertAgentRoleSyncCount(t, ctx, `SELECT COUNT(*) FROM sys_role_menu WHERE role_id=21 AND menu_id=200`, 1)
|
|
assertAgentRoleSyncCount(t, ctx, `SELECT COUNT(*) FROM sys_role_menu WHERE role_id=21 AND menu_id=100`, 0)
|
|
}
|