opex-yt-info
Version:
Node.js library for searching YouTube (videos, channels, live), getting video/playlist metadata, and fetching homepage/trending videos.
153 lines (131 loc) • 7.53 kB
JavaScript
import {
searchVideos,
searchChannels,
searchLive,
searchAll,
getVideo,
getPlaylist
} from './index.js';
// Используем твои ID для тестов
const TEST_VIDEO_ID = 'dQw4w9WgXcQ'; // Rick Astley
const TEST_VIDEO_URL = `https://www.youtube.com/watch?v=${TEST_VIDEO_ID}`;
const TEST_PLAYLIST_ID = 'PLzDFYTz8KSyBUDaNaPOKVjomV2lCm5W4G'; // Твой плейлист
const TEST_PLAYLIST_URL = `https://www.youtube.com/playlist?list=${TEST_PLAYLIST_ID}`;
const TEST_INVALID_ID = 'invalid_id_string';
const TEST_INVALID_URL = 'https://example.com';
// Helper for logging test results
function logTestResult(testName, success, details = '') {
const prefix = success ? '✅ PASS:' : '❌ FAIL:';
console.log(`${prefix} ${testName}${details ? ` - ${details}` : ''}`);
if (!success) {
// Optionally throw an error to stop execution on failure
// throw new Error(`Test failed: ${testName}`);
}
}
async function runTests() {
console.log('--- Starting opex-yt-info tests (using yt-search) ---');
let overallSuccess = true;
let success = true;
let result;
// --- Search Tests ---
try {
result = await searchVideos('synthwave', { pageEnd: 1 });
success = Array.isArray(result) && result.length > 0 && result[0].type === 'video';
logTestResult('searchVideos', success, `Found ${result.length} videos`);
if (!success) overallSuccess = false;
} catch (e) { logTestResult('searchVideos', false, e.message); overallSuccess = false; }
try {
result = await searchChannels('freecodecamp', { pageEnd: 1 });
success = Array.isArray(result) && result.length > 0 && result[0].type === 'channel';
logTestResult('searchChannels', success, `Found ${result.length} channels`);
if (!success) overallSuccess = false;
} catch (e) { logTestResult('searchChannels', false, e.message); overallSuccess = false; }
try {
result = await searchLive('live news', { pageEnd: 1 });
success = Array.isArray(result);
logTestResult('searchLive', success, `Found ${result.length} live streams (can be 0)`);
if (!success && !(Array.isArray(result))) overallSuccess = false; // Fail only if error or not array
} catch (e) { logTestResult('searchLive', false, e.message); overallSuccess = false; }
try {
result = await searchAll('coding music', { pageEnd: 1 });
success = Array.isArray(result) && result.length > 0 && result.some(r => ['video', 'channel', 'live', 'list'].includes(r.type));
logTestResult('searchAll', success, `Found ${result.length} mixed results`);
if (!success) overallSuccess = false;
} catch (e) { logTestResult('searchAll', false, e.message); overallSuccess = false; }
// --- Get Metadata Tests (using yt-search) ---
try {
result = await getVideo(TEST_VIDEO_ID);
// Проверяем ключевые поля, которые yt-search должен вернуть для видео
success = result !== null && result.videoId === TEST_VIDEO_ID && typeof result.title === 'string' && typeof result.seconds === 'number' && typeof result.views === 'number';
logTestResult('getVideo (by ID)', success, result ? `Title: ${result.title.substring(0, 30)}...` : 'Not found or error');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getVideo (by ID)', false, e.message); overallSuccess = false; }
try {
result = await getVideo(TEST_VIDEO_URL);
success = result !== null && result.videoId === TEST_VIDEO_ID && typeof result.uploadDate === 'string'; // Проверяем uploadDate
logTestResult('getVideo (by URL)', success, result ? `Upload Date: ${result.uploadDate}` : 'Not found or error');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getVideo (by URL)', false, e.message); overallSuccess = false; }
try {
result = await getVideo(TEST_INVALID_ID);
success = result === null;
logTestResult('getVideo (invalid ID)', success, 'Correctly returned null');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getVideo (invalid ID)', false, `Unexpected error: ${e.message}`); overallSuccess = false; }
try {
result = await getVideo(TEST_INVALID_URL);
success = result === null;
logTestResult('getVideo (invalid URL)', success, 'Correctly returned null');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getVideo (invalid URL)', false, `Unexpected error: ${e.message}`); overallSuccess = false; }
try {
result = await getPlaylist(TEST_PLAYLIST_ID);
// Проверяем ключевые поля для плейлиста
success = result !== null && result.listId === TEST_PLAYLIST_ID && Array.isArray(result.videos) && typeof result.title === 'string';
logTestResult('getPlaylist (by ID)', success, result ? `Title: ${result.title}, Videos found: ${result.videos.length}` : 'Not found or error');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getPlaylist (by ID)', false, e.message); overallSuccess = false; }
try {
result = await getPlaylist(TEST_PLAYLIST_URL);
success = result !== null && result.listId === TEST_PLAYLIST_ID && typeof result.size === 'number';
logTestResult('getPlaylist (by URL)', success, result ? `Size: ${result.size}` : 'Not found or error');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getPlaylist (by URL)', false, e.message); overallSuccess = false; }
try {
result = await getPlaylist(TEST_INVALID_ID);
success = result === null;
logTestResult('getPlaylist (invalid ID)', success, 'Correctly returned null');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getPlaylist (invalid ID)', false, `Unexpected error: ${e.message}`); overallSuccess = false; }
try {
result = await getPlaylist(TEST_INVALID_URL);
success = result === null;
logTestResult('getPlaylist (invalid URL)', success, 'Correctly returned null');
if (!success) overallSuccess = false;
} catch (e) { logTestResult('getPlaylist (invalid URL)', false, `Unexpected error: ${e.message}`); overallSuccess = false; }
// --- Test empty query ---
try {
result = await searchVideos('');
success = Array.isArray(result) && result.length === 0;
logTestResult('searchVideos (empty query)', success, `Returned ${result.length} results`);
if (!success) overallSuccess = false;
} catch (e) { logTestResult('searchVideos (empty query)', false, e.message); overallSuccess = false; }
try {
result = await searchAll('');
success = Array.isArray(result) && result.length === 0;
logTestResult('searchAll (empty query)', success, `Returned ${result.length} results`);
if (!success) overallSuccess = false;
} catch (e) { logTestResult('searchAll (empty query)', false, e.message); overallSuccess = false; }
console.log('--- Tests finished ---');
if (!overallSuccess) {
console.error('\n❌ Some tests failed!');
process.exit(1);
} else {
console.log('\n✅ All tests passed!');
process.exit(0);
}
}
runTests().catch(err => {
console.error("Unhandled error during tests:", err);
process.exit(1);
});