109 lines
3.4 KiB
TypeScript
109 lines
3.4 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
import { resolveAvatarSource } from '../../server/utils/user-avatar.ts'
|
|
|
|
test('清除聚合登录绑定:准确识别聚合登录身份并排除其他提供商', () => {
|
|
const identities = [
|
|
{ id: 1, userId: 101, provider: 'aggregate:qq', providerUserId: 'qq_123' },
|
|
{ id: 2, userId: 101, provider: 'aggregate:wx', providerUserId: 'wx_456' },
|
|
{ id: 3, userId: 101, provider: 'github', providerUserId: 'gh_789' },
|
|
{ id: 4, userId: 102, provider: 'aggregate', providerUserId: 'agg_999' },
|
|
{ id: 5, userId: 102, provider: 'casdoor', providerUserId: 'cas_888' },
|
|
{ id: 6, userId: 103, provider: 'google', providerUserId: 'goog_777' }
|
|
]
|
|
|
|
const isAggregate = (provider: string) => provider === 'aggregate' || provider.startsWith('aggregate:')
|
|
|
|
const targetIdentities = identities.filter((i) => isAggregate(i.provider))
|
|
const remainingIdentities = identities.filter((i) => !isAggregate(i.provider))
|
|
|
|
assert.equal(targetIdentities.length, 3)
|
|
assert.deepEqual(
|
|
targetIdentities.map((i) => i.id),
|
|
[1, 2, 4]
|
|
)
|
|
|
|
const affectedUserIds = Array.from(new Set(targetIdentities.map((i) => i.userId)))
|
|
assert.deepEqual(affectedUserIds, [101, 102])
|
|
|
|
assert.equal(remainingIdentities.length, 3)
|
|
assert.deepEqual(
|
|
remainingIdentities.map((i) => i.id),
|
|
[3, 5, 6]
|
|
)
|
|
})
|
|
|
|
test('清除聚合登录绑定:当用户头像来源为聚合登录且拥有其他第三方身份时,正确回退头像', () => {
|
|
const user = {
|
|
id: 101,
|
|
avatarProvider: 'aggregate:qq',
|
|
avatarProviderUserId: 'qq_123'
|
|
}
|
|
|
|
const allUserIdentities = [
|
|
{
|
|
id: 1,
|
|
userId: 101,
|
|
provider: 'aggregate:qq',
|
|
providerUserId: 'qq_123',
|
|
avatar: 'https://example.com/qq.png',
|
|
createdAt: new Date('2024-01-01')
|
|
},
|
|
{
|
|
id: 2,
|
|
userId: 101,
|
|
provider: 'github',
|
|
providerUserId: 'gh_789',
|
|
avatar: 'https://example.com/gh.png',
|
|
createdAt: new Date('2024-01-02')
|
|
}
|
|
]
|
|
|
|
const targetKeys = new Set(['aggregate:qq:qq_123'])
|
|
const remainingIdentities = allUserIdentities.filter(
|
|
(i) => !targetKeys.has(`${i.provider}:${i.providerUserId}`)
|
|
)
|
|
|
|
const isAvatarSourceDeleted =
|
|
user.avatarProvider &&
|
|
(user.avatarProvider === 'aggregate' ||
|
|
user.avatarProvider.startsWith('aggregate:') ||
|
|
targetKeys.has(`${user.avatarProvider}:${user.avatarProviderUserId}`))
|
|
|
|
assert.equal(isAvatarSourceDeleted, true)
|
|
|
|
const fallback = resolveAvatarSource(user, remainingIdentities)
|
|
assert.deepEqual(fallback, {
|
|
provider: 'github',
|
|
providerUserId: 'gh_789',
|
|
url: 'https://example.com/gh.png'
|
|
})
|
|
})
|
|
|
|
test('清除聚合登录绑定:当用户头像来源为聚合登录且无其他第三方身份时,头像源置为 null', () => {
|
|
const user = {
|
|
id: 102,
|
|
avatarProvider: 'aggregate',
|
|
avatarProviderUserId: 'agg_999'
|
|
}
|
|
|
|
const allUserIdentities = [
|
|
{
|
|
id: 4,
|
|
userId: 102,
|
|
provider: 'aggregate',
|
|
providerUserId: 'agg_999',
|
|
avatar: 'https://example.com/agg.png',
|
|
createdAt: new Date('2024-01-01')
|
|
}
|
|
]
|
|
|
|
const targetKeys = new Set(['aggregate:agg_999'])
|
|
const remainingIdentities = allUserIdentities.filter(
|
|
(i) => !targetKeys.has(`${i.provider}:${i.providerUserId}`)
|
|
)
|
|
|
|
const fallback = resolveAvatarSource(user, remainingIdentities)
|
|
assert.equal(fallback, null)
|
|
})
|