package member import ( "database/sql" "testing" "time" "perms-system-server/internal/consts" "perms-system-server/internal/loaders" productModel "perms-system-server/internal/model/product" memberModel "perms-system-server/internal/model/productmember" userModel "perms-system-server/internal/model/user" "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-1270: 超管查询他人产品列表,正常返回 func TestUserProducts_SuperAdmin_OK(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() now := time.Now().Unix() uid := testutil.UniqueId() pRes, err := svcCtx.SysProductModel.Insert(ctx, &productModel.SysProduct{ Code: uid, Name: "TestProd", AppKey: uid, AppSecret: "s1", Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) pId, _ := pRes.LastInsertId() uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{ Username: uid, Password: testutil.HashPassword("pass"), Nickname: "Nick", Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2, Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) uId, _ := uRes.LastInsertId() mRes, err := svcCtx.SysProductMemberModel.Insert(ctx, &memberModel.SysProductMember{ ProductCode: uid, UserId: uId, MemberType: "MEMBER", Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) mId, _ := mRes.LastInsertId() t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_product_member`", mId) testutil.CleanTable(ctx, conn, "`sys_user`", uId) testutil.CleanTable(ctx, conn, "`sys_product`", pId) }) logic := NewUserProductsLogic(ctx, svcCtx) resp, err := logic.UserProducts(&types.UserProductsReq{UserId: uId}) require.NoError(t, err) require.Len(t, resp.List, 1) assert.Equal(t, uid, resp.List[0].ProductCode) assert.Equal(t, "TestProd", resp.List[0].ProductName) assert.Equal(t, "MEMBER", resp.List[0].MemberType) assert.Equal(t, int64(1), resp.List[0].Status) } // TC-1271: 本人查询自己的产品列表,正常返回 func TestUserProducts_Self_OK(t *testing.T) { svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() now := time.Now().Unix() uid := testutil.UniqueId() pRes, err := svcCtx.SysProductModel.Insert(ctxhelper.SuperAdminCtx(), &productModel.SysProduct{ Code: uid, Name: "TestProd2", AppKey: uid, AppSecret: "s2", Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) pId, _ := pRes.LastInsertId() uRes, err := svcCtx.SysUserModel.Insert(ctxhelper.SuperAdminCtx(), &userModel.SysUser{ Username: uid, Password: testutil.HashPassword("pass"), Nickname: "Nick2", Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2, Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) uId, _ := uRes.LastInsertId() mRes, err := svcCtx.SysProductMemberModel.Insert(ctxhelper.SuperAdminCtx(), &memberModel.SysProductMember{ ProductCode: uid, UserId: uId, MemberType: "ADMIN", Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) mId, _ := mRes.LastInsertId() t.Cleanup(func() { testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_product_member`", mId) testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_user`", uId) testutil.CleanTable(ctxhelper.SuperAdminCtx(), conn, "`sys_product`", pId) }) // 本人上下文 ctx := ctxhelper.CustomCtx(&loaders.UserDetails{ UserId: uId, Username: uid, IsSuperAdmin: false, MemberType: consts.MemberTypeAdmin, Status: consts.StatusEnabled, ProductCode: uid, }) logic := NewUserProductsLogic(ctx, svcCtx) resp, err := logic.UserProducts(&types.UserProductsReq{UserId: uId}) require.NoError(t, err) require.Len(t, resp.List, 1) assert.Equal(t, uid, resp.List[0].ProductCode) assert.Equal(t, "ADMIN", resp.List[0].MemberType) } // TC-1272: 非超管查询他人产品列表,返回 403 func TestUserProducts_OtherUser_Forbidden(t *testing.T) { svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) ctx := ctxhelper.CustomCtx(&loaders.UserDetails{ UserId: 20, Username: "user20", IsSuperAdmin: false, MemberType: consts.MemberTypeMember, Status: consts.StatusEnabled, ProductCode: "crm", }) logic := NewUserProductsLogic(ctx, svcCtx) resp, err := logic.UserProducts(&types.UserProductsReq{UserId: 99}) assert.Nil(t, resp) assert.Error(t, err) assert.Contains(t, err.Error(), "无权查看他人") } // TC-1273: 用户未加入任何产品,返回空列表 func TestUserProducts_Empty(t *testing.T) { ctx := ctxhelper.SuperAdminCtx() svcCtx := svc.NewServiceContext(testutil.GetTestConfig()) conn := testutil.GetTestSqlConn() now := time.Now().Unix() uid := testutil.UniqueId() uRes, err := svcCtx.SysUserModel.Insert(ctx, &userModel.SysUser{ Username: uid, Password: testutil.HashPassword("pass"), Nickname: "Nick3", Avatar: sql.NullString{}, IsSuperAdmin: 2, MustChangePassword: 2, Status: 1, CreateTime: now, UpdateTime: now, }) require.NoError(t, err) uId, _ := uRes.LastInsertId() t.Cleanup(func() { testutil.CleanTable(ctx, conn, "`sys_user`", uId) }) logic := NewUserProductsLogic(ctx, svcCtx) resp, err := logic.UserProducts(&types.UserProductsReq{UserId: uId}) require.NoError(t, err) assert.Empty(t, resp.List) }