package common 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 extractFamilyEntitlementCode(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 TestBuildEntitlementContext(t *testing.T) { t.Run("default self entitlement", func(t *testing.T) { entitlement := buildEntitlementContext(1001, nil) require.Equal(t, int64(1001), entitlement.EffectiveUserID) require.Equal(t, EntitlementSourceSelf, entitlement.Source) require.Equal(t, int64(0), entitlement.OwnerUserID) require.False(t, entitlement.ReadOnly) }) t.Run("active family member uses owner entitlement", func(t *testing.T) { entitlement := buildEntitlementContext(1001, &familyEntitlementRelation{ Role: modelUser.FamilyRoleMember, FamilyStatus: modelUser.FamilyStatusActive, OwnerUserID: 2001, }) require.Equal(t, int64(2001), entitlement.EffectiveUserID) require.Equal(t, EntitlementSourceFamilyOwner, entitlement.Source) require.Equal(t, int64(2001), entitlement.OwnerUserID) require.True(t, entitlement.ReadOnly) }) t.Run("owner relation keeps self entitlement", func(t *testing.T) { entitlement := buildEntitlementContext(2001, &familyEntitlementRelation{ Role: modelUser.FamilyRoleOwner, FamilyStatus: modelUser.FamilyStatusActive, OwnerUserID: 2001, }) require.Equal(t, int64(2001), entitlement.EffectiveUserID) require.Equal(t, EntitlementSourceSelf, entitlement.Source) require.False(t, entitlement.ReadOnly) }) t.Run("disabled family keeps self entitlement", func(t *testing.T) { entitlement := buildEntitlementContext(1001, &familyEntitlementRelation{ Role: modelUser.FamilyRoleMember, FamilyStatus: 0, OwnerUserID: 2001, }) require.Equal(t, int64(1001), entitlement.EffectiveUserID) require.Equal(t, EntitlementSourceSelf, entitlement.Source) require.False(t, entitlement.ReadOnly) }) } func TestDenyReadonlyEntitlement(t *testing.T) { require.NoError(t, denyReadonlyEntitlement(&EntitlementContext{ReadOnly: false})) err := denyReadonlyEntitlement(&EntitlementContext{ Source: EntitlementSourceFamilyOwner, ReadOnly: true, }) require.Error(t, err) require.Equal(t, xerr.FamilyOwnerOperationForbidden, extractFamilyEntitlementCode(err)) }