Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
74 lines
2.5 KiB
JavaScript
74 lines
2.5 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { isVideoId, pageFromPath, parseVideoLink } from '../src/lib/video-id.js';
|
|
|
|
test('isVideoId accepts only 11-character IDs', () => {
|
|
assert.equal(isVideoId('dQw4w9WgXcQ'), true);
|
|
assert.equal(isVideoId('abc_DEF-123'), true);
|
|
for (const value of ['short', 'waytoolongvideoid', 'has space!!', '', null, undefined, 12345678901]) {
|
|
assert.equal(isVideoId(value), false, String(value));
|
|
}
|
|
});
|
|
|
|
test('parseVideoLink reads an absolute watch URL', () => {
|
|
assert.deepEqual(parseVideoLink('https://www.youtube.com/watch?v=dQw4w9WgXcQ'), {
|
|
videoId: 'dQw4w9WgXcQ',
|
|
isShort: false,
|
|
});
|
|
});
|
|
|
|
test('parseVideoLink reads a relative watch href with extra params', () => {
|
|
assert.deepEqual(parseVideoLink('/watch?v=dQw4w9WgXcQ&t=42s&list=PL123'), {
|
|
videoId: 'dQw4w9WgXcQ',
|
|
isShort: false,
|
|
});
|
|
});
|
|
|
|
test('parseVideoLink marks /shorts/ links as shorts', () => {
|
|
assert.deepEqual(parseVideoLink('/shorts/abcdefghijk'), { videoId: 'abcdefghijk', isShort: true });
|
|
assert.deepEqual(parseVideoLink('/shorts/abcdefghijk?feature=share'), {
|
|
videoId: 'abcdefghijk',
|
|
isShort: true,
|
|
});
|
|
});
|
|
|
|
test('parseVideoLink ignores links that are not a single video', () => {
|
|
for (const href of ['/', '/@mrbeast', '/playlist?list=PL123', '/feed/subscriptions', '/results?search_query=x']) {
|
|
assert.equal(parseVideoLink(href), null, href);
|
|
}
|
|
});
|
|
|
|
test('parseVideoLink rejects malformed IDs', () => {
|
|
for (const href of [
|
|
'/watch',
|
|
'/watch?v=',
|
|
'/watch?v=short',
|
|
'/watch?v=waytoolongvideoid',
|
|
'/shorts/toolongidtoolong',
|
|
]) {
|
|
assert.equal(parseVideoLink(href), null, href);
|
|
}
|
|
});
|
|
|
|
test('parseVideoLink rejects other hosts and garbage', () => {
|
|
assert.equal(parseVideoLink('https://evil.example.com/watch?v=dQw4w9WgXcQ'), null);
|
|
for (const href of [null, undefined, '', 'http://[bad']) {
|
|
assert.equal(parseVideoLink(href), null, String(href));
|
|
}
|
|
});
|
|
|
|
test('pageFromPath maps the four supported page types', () => {
|
|
assert.equal(pageFromPath('/'), 'home');
|
|
assert.equal(pageFromPath('/watch'), 'watch');
|
|
assert.equal(pageFromPath('/results'), 'search');
|
|
for (const path of ['/@mrbeast', '/@mrbeast/videos', '/channel/UC123/videos', '/c/name', '/user/name']) {
|
|
assert.equal(pageFromPath(path), 'channel', path);
|
|
}
|
|
});
|
|
|
|
test('pageFromPath returns null for unsupported pages', () => {
|
|
for (const path of ['/feed/subscriptions', '/shorts/abcdefghijk', '/playlist', '/premium']) {
|
|
assert.equal(pageFromPath(path), null, path);
|
|
}
|
|
});
|