package dept import ( "errors" "testing" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/testutil" "perms-system-server/internal/testutil/ctxhelper" "perms-system-server/internal/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TC-0089: 正常更新 func TestUpdateDept_Normal(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() deptId, err := insertDeptRaw(ctx, svcCtx, 0, "upd_"+testutil.UniqueId(), "/") require.NoError(t, err) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", deptId) }) newName := "updated_" + testutil.UniqueId() l := NewUpdateDeptLogic(ctx, svcCtx) err = l.UpdateDept(&types.UpdateDeptReq{ Id: deptId, Name: newName, Sort: 99, Remark: "updated remark", Status: 2, }) require.NoError(t, err) d, err := svcCtx.SysDeptModel.FindOne(ctx, deptId) require.NoError(t, err) assert.Equal(t, newName, d.Name) assert.Equal(t, int64(99), d.Sort) assert.Equal(t, "updated remark", d.Remark) assert.Equal(t, int64(2), d.Status) } // TC-0090: 不存在 func TestUpdateDept_NotFound(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) l := NewUpdateDeptLogic(ctx, svcCtx) err := l.UpdateDept(&types.UpdateDeptReq{ Id: 999999999, Name: "ghost_" + testutil.UniqueId(), }) require.Error(t, err) var ce *response.CodeError require.True(t, errors.As(err, &ce)) assert.Equal(t, 404, ce.Code()) assert.Equal(t, "部门不存在", ce.Error()) } // TC-0089: 正常更新 func TestUpdateDept_StatusZeroUnchanged(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() deptId, err := insertDeptRaw(ctx, svcCtx, 0, "s0_"+testutil.UniqueId(), "/") require.NoError(t, err) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", deptId) }) before, err := svcCtx.SysDeptModel.FindOne(ctx, deptId) require.NoError(t, err) assert.Equal(t, int64(1), before.Status) l := NewUpdateDeptLogic(ctx, svcCtx) err = l.UpdateDept(&types.UpdateDeptReq{ Id: deptId, Name: "changed_" + testutil.UniqueId(), Status: 0, }) require.NoError(t, err) after, err := svcCtx.SysDeptModel.FindOne(ctx, deptId) require.NoError(t, err) assert.Equal(t, int64(1), after.Status) } // TC-0091: DeptType NORMAL→DEV func TestUpdateDept_DeptType_NormalToDev(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() deptId, err := insertDeptRaw(ctx, svcCtx, 0, "dt_"+testutil.UniqueId(), "/") require.NoError(t, err) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", deptId) }) before, err := svcCtx.SysDeptModel.FindOne(ctx, deptId) require.NoError(t, err) assert.Equal(t, "NORMAL", before.DeptType) l := NewUpdateDeptLogic(ctx, svcCtx) err = l.UpdateDept(&types.UpdateDeptReq{ Id: deptId, Name: "dt_changed_" + testutil.UniqueId(), DeptType: "DEV", }) require.NoError(t, err) after, err := svcCtx.SysDeptModel.FindOne(ctx, deptId) require.NoError(t, err) assert.Equal(t, "DEV", after.DeptType) } // TC-0092: DeptType无效值忽略 func TestUpdateDept_DeptType_InvalidIgnored(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() deptId, err := insertDeptRaw(ctx, svcCtx, 0, "dti_"+testutil.UniqueId(), "/") require.NoError(t, err) t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_dept`", deptId) }) l := NewUpdateDeptLogic(ctx, svcCtx) err = l.UpdateDept(&types.UpdateDeptReq{ Id: deptId, Name: "dti_changed_" + testutil.UniqueId(), DeptType: "INVALID_TYPE", }) require.NoError(t, err) after, err := svcCtx.SysDeptModel.FindOne(ctx, deptId) require.NoError(t, err) assert.Equal(t, "NORMAL", after.DeptType) } // TC-0512: updateDept非超管拒绝 func TestUpdateDept_NonSuperAdminRejected(t *testing.T) { ctx := ctxhelper.AdminCtx("test_product") svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) l := NewUpdateDeptLogic(ctx, svcCtx) err := l.UpdateDept(&types.UpdateDeptReq{Id: 1, Name: "test"}) require.Error(t, err) var ce *response.CodeError require.True(t, errors.As(err, &ce)) assert.Equal(t, 403, ce.Code()) }