kt-template-online-api/test/modules/qqbot/plugins/bilibili-card/bilibili-url-parser.spec.ts

98 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
cleanBilibiliUrlCandidate,
isAllowedBilibiliUrl,
parseBilibiliVideoReference,
} from '../../../../../src/modules/qqbot/plugins/bilibili-card/src/domain/bilibili-url-parser';
describe('Bilibili URL parser', () => {
it('parses BV video URLs while ignoring query, hash, and trailing punctuation', () => {
const reference = parseBilibiliVideoReference(
'https://www.bilibili.com/video/BV1xx411c7mD/?share_source=qq#reply。',
);
expect(reference).toEqual({
canonicalVideoId: 'BV1xx411c7mD',
kind: 'bvid',
sourceUrl:
'https://www.bilibili.com/video/BV1xx411c7mD/?share_source=qq#reply',
value: 'BV1xx411c7mD',
});
});
it('parses av video URLs from mobile Bilibili links', () => {
expect(
parseBilibiliVideoReference('https://m.bilibili.com/video/av170001'),
).toMatchObject({
canonicalVideoId: 'av170001',
kind: 'aid',
value: '170001',
});
});
it('parses b23.tv paths that directly embed BV or av ids', () => {
expect(parseBilibiliVideoReference('https://b23.tv/BV1xx411c7mD')).toEqual({
canonicalVideoId: 'BV1xx411c7mD',
kind: 'bvid',
sourceUrl: 'https://b23.tv/BV1xx411c7mD',
value: 'BV1xx411c7mD',
});
expect(parseBilibiliVideoReference('https://b23.tv/av170001')).toMatchObject(
{
canonicalVideoId: 'av170001',
kind: 'aid',
value: '170001',
},
);
});
it('allows only Bilibili and b23.tv hosts', () => {
expect(isAllowedBilibiliUrl('https://b23.tv/abc123')).toBe(true);
expect(isAllowedBilibiliUrl('https://space.bilibili.com/1')).toBe(true);
expect(isAllowedBilibiliUrl('https://example.com/video/BV1xx411c7mD')).toBe(
false,
);
});
it('cleans card wrappers, html entities, and trailing brackets', () => {
expect(
cleanBilibiliUrlCandidate(
'"https://www.bilibili.com/video/BV1xx411c7mD?p=1"',
),
).toBe('https://www.bilibili.com/video/BV1xx411c7mD?p=1');
});
it('does not parse video ids from query or hash on non-video Bilibili pages', () => {
expect(
parseBilibiliVideoReference(
'https://space.bilibili.com/1?from=/video/BV1xx411c7mD',
),
).toBeNull();
expect(
parseBilibiliVideoReference(
'https://www.bilibili.com/search?keyword=BV1xx411c7mD',
),
).toBeNull();
expect(
parseBilibiliVideoReference(
'https://space.bilibili.com/1#/video/BV1xx411c7mD',
),
).toBeNull();
});
it('rejects malformed BV path segments with extra characters', () => {
expect(
parseBilibiliVideoReference(
'https://www.bilibili.com/video/BV1xx411c7mDextra',
),
).toBeNull();
});
it('cleans xml html entities and full-width brackets', () => {
expect(
cleanBilibiliUrlCandidate(
'<【https://www.bilibili.com/video/BV1xx411c7mD】>',
),
).toBe('https://www.bilibili.com/video/BV1xx411c7mD');
});
});