|
@@ -0,0 +1,167 @@
|
|
|
|
|
+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)
|
|
|
|
|
+}
|