package user import ( stderrors "errors" "testing" modelUser "github.com/perfect-panel/server/internal/model/user" "github.com/perfect-panel/server/pkg/xerr" pkgerrors "github.com/pkg/errors" "github.com/stretchr/testify/require" ) func extractFamilyJoinCode(err error) uint32 { if err == nil { return 0 } var codeErr *xerr.CodeError if stderrors.As(pkgerrors.Cause(err), &codeErr) { return codeErr.GetErrCode() } return 0 } func TestValidateMemberJoinConflict(t *testing.T) { ownerFamilyID := int64(11) testCases := []struct { name string ownerFamily int64 memberRecord *modelUser.UserFamilyMember wantCode uint32 }{ { name: "no member record", ownerFamily: ownerFamilyID, wantCode: 0, }, { name: "same family active member", ownerFamily: ownerFamilyID, memberRecord: &modelUser.UserFamilyMember{ FamilyId: ownerFamilyID, Status: modelUser.FamilyMemberActive, }, wantCode: xerr.FamilyAlreadyBound, }, { name: "same family left member", ownerFamily: ownerFamilyID, memberRecord: &modelUser.UserFamilyMember{ FamilyId: ownerFamilyID, Status: modelUser.FamilyMemberLeft, }, wantCode: 0, }, { name: "same family removed member", ownerFamily: ownerFamilyID, memberRecord: &modelUser.UserFamilyMember{ FamilyId: ownerFamilyID, Status: modelUser.FamilyMemberRemoved, }, wantCode: 0, }, { name: "cross family active member", ownerFamily: ownerFamilyID, memberRecord: &modelUser.UserFamilyMember{ FamilyId: ownerFamilyID + 1, Status: modelUser.FamilyMemberActive, }, wantCode: xerr.FamilyCrossBindForbidden, }, { name: "cross family left member", ownerFamily: ownerFamilyID, memberRecord: &modelUser.UserFamilyMember{ FamilyId: ownerFamilyID + 1, Status: modelUser.FamilyMemberLeft, }, wantCode: 0, }, { name: "cross family removed member", ownerFamily: ownerFamilyID, memberRecord: &modelUser.UserFamilyMember{ FamilyId: ownerFamilyID + 1, Status: modelUser.FamilyMemberRemoved, }, wantCode: 0, }, } for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { err := validateMemberJoinConflict(testCase.ownerFamily, testCase.memberRecord) if testCase.wantCode == 0 { require.NoError(t, err) return } require.Error(t, err) require.Equal(t, testCase.wantCode, extractFamilyJoinCode(err)) }) } } func TestBuildRemovedSubscribeCacheMeta(t *testing.T) { removed := []modelUser.Subscribe{ {Id: 1, SubscribeId: 10, Token: "member-token-1"}, {Id: 2, SubscribeId: 11, Token: "member-token-2"}, {Id: 3, SubscribeId: 0, Token: "member-token-3"}, } models, subscribeIDSet := buildRemovedSubscribeCacheMeta(removed) require.Len(t, models, 3) require.Equal(t, int64(1), models[0].Id) require.Equal(t, "member-token-2", models[1].Token) require.Len(t, subscribeIDSet, 2) _, has10 := subscribeIDSet[10] _, has11 := subscribeIDSet[11] _, has0 := subscribeIDSet[0] require.True(t, has10) require.True(t, has11) require.False(t, has0) }