From 46d62bf83f1b527e80d15594ee8f0eb3101d1b7e Mon Sep 17 00:00:00 2001 From: "luan.lrt4@gmail.com" Date: Wed, 13 Apr 2022 18:50:23 -0300 Subject: [PATCH] chore: add more tests for better coverage --- test/constants.js | 1 + test/index.js | 156 ++++++++++++++++++++++++---------------------- 2 files changed, 82 insertions(+), 75 deletions(-) diff --git a/test/constants.js b/test/constants.js index 525bfb28..6350a72a 100644 --- a/test/constants.js +++ b/test/constants.js @@ -7,6 +7,7 @@ module.exports = { expected_ntoken: 'AxwyS-osUl1WhMUd1', client_version: '2.20211101.01.00', test_video_id: 'dQw4w9WgXcQ', + test_song_id: '-aIiQj79b6Q', sig_decipher_sc: `fB={RP:function(a,b){a.splice(0,b)}, Td:function(a){a.reverse()}, kq:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c};fB.kq(a,35);fB.RP(a,2);fB.kq(a,46);fB.Td(a,6);`, diff --git a/test/index.js b/test/index.js index 689b236c..ce87c104 100644 --- a/test/index.js +++ b/test/index.js @@ -1,75 +1,81 @@ -'use strict'; - -const Fs = require('fs'); -const Innertube = require('..'); -const NToken = require('../lib/deciphers/NToken'); -const SigDecipher = require('../lib/deciphers/Sig'); -const Constants = require('./constants'); - -let failed_tests = 0; - -async function performTests() { - const youtube = await new Innertube().catch((error) => error); - assert(!(youtube instanceof Error), `should retrieve Innertube configuration data`, youtube); - - if (!(youtube instanceof Error)) { - const homefeed = await youtube.getHomeFeed(); - assert(!(homefeed instanceof Error), `should retrieve recommendations`, homefeed); - - const ytsearch = await youtube.search('Carl Sagan - Documentary').catch((error) => error); - assert(!(ytsearch instanceof Error) && ytsearch.videos.length, `should search on YouTube`, ytsearch); - - const ytmsearch = await youtube.search('Logic - Obediently Yours', { client: 'YTMUSIC' }).catch((error) => error); - assert(!(ytmsearch instanceof Error), `should search on YouTube Music`, ytmsearch); - - const details = await youtube.getDetails(Constants.test_video_id).catch((error) => error); - assert(!(details instanceof Error), `should retrieve details for ${Constants.test_video_id}`, details); - - const comments = await youtube.getComments(Constants.test_video_id).catch((error) => error); - assert(!(comments instanceof Error), `should retrieve comments for ${Constants.test_video_id}`, comments); - - const ytplaylist = await youtube.getPlaylist(ytmsearch.results.community_playlists[0].id, { client: 'YOUTUBE' }); - assert(!(ytplaylist instanceof Error), `should retrieve and parse playlist with YouTube`, ytplaylist); - - const ytmplaylist = await youtube.getPlaylist(ytmsearch.results.community_playlists[0].id, { client: 'YTMUSIC' }); - assert(!(ytmplaylist instanceof Error), `should retrieve and parse playlist with YouTube Music`, ytmplaylist); - - const lyrics = await youtube.getLyrics(ytmsearch.results.songs[0].id); - assert(!(lyrics instanceof Error), `should retrieve song lyrics`, lyrics); - - const video = await downloadVideo(Constants.test_video_id, youtube).catch((error) => error); - assert(!(video instanceof Error), `should download video (${Constants.test_video_id})`, video); - } - - const n_token = new NToken(Constants.n_scramble_sc, Constants.original_ntoken).transform(); - assert(n_token == Constants.expected_ntoken, `should transform n token into ${Constants.expected_ntoken}`, n_token); - - const transformed_url = new SigDecipher(Constants.test_url, { sig_decipher_sc: Constants.sig_decipher_sc }).decipher(); - assert(transformed_url == Constants.expected_url, `should correctly decipher signature`, transformed_url); - - if (failed_tests > 0) - throw new Error('Some tests have failed'); -} - -function downloadVideo(id, youtube) { - return new Promise((resolve, reject) => { - let got_video_info = false; - const stream = youtube.download(id, { type: 'videoandaudio' }); - stream.pipe(Fs.createWriteStream(`./${id}.mp4`)); - stream.on('end', () => Fs.existsSync(`./${id}.mp4`) && got_video_info && resolve() || reject()); - stream.on('info', () => got_video_info = true); - stream.on('error', (err) => reject(err)); - }); -} - -function assert(outcome, description, data) { - const pass_fail = outcome ? 'pass' : 'fail'; - - console.info(pass_fail, ':', description); - !outcome && (failed_tests += 1); - !outcome && console.error('Error: ', data); - - return outcome; -} - -performTests(); +'use strict'; + +const Fs = require('fs'); +const Innertube = require('..'); +const NToken = require('../lib/deciphers/NToken'); +const SigDecipher = require('../lib/deciphers/Sig'); +const Constants = require('./constants'); + +let failed_tests = 0; + +async function performTests() { + const youtube = await new Innertube().catch((error) => error); + assert(!(youtube instanceof Error), `should retrieve Innertube configuration data`, youtube); + + if (!(youtube instanceof Error)) { + const homefeed = await youtube.getHomeFeed(); + assert(!(homefeed instanceof Error), `should retrieve recommendations`, homefeed); + + const ytsearch = await youtube.search('Carl Sagan - Documentary').catch((error) => error); + assert(!(ytsearch instanceof Error) && ytsearch.videos.length, `should search on YouTube`, ytsearch); + + const ytmsearch = await youtube.search('Logic - Obediently Yours', { client: 'YTMUSIC' }).catch((error) => error); + assert(!(ytmsearch instanceof Error), `should search on YouTube Music`, ytmsearch); + + const ytsearch_suggestions = await youtube.getSearchSuggestions('test', { client: 'YOUTUBE' }); + assert(!(ytsearch_suggestions instanceof Error), `should retrieve YouTube search suggestions`); + + const ytmsearch_suggestions = await youtube.getSearchSuggestions('test', { client: 'YTMUSIC' }); + assert(!(ytmsearch_suggestions instanceof Error), `should retrieve YouTube Music search suggestions`); + + const details = await youtube.getDetails(Constants.test_video_id).catch((error) => error); + assert(!(details instanceof Error), `should retrieve details for ${Constants.test_video_id}`, details); + + const comments = await youtube.getComments(Constants.test_video_id).catch((error) => error); + assert(!(comments instanceof Error), `should retrieve comments for ${Constants.test_video_id}`, comments); + + const ytplaylist = await youtube.getPlaylist(ytmsearch.results.community_playlists[0].id, { client: 'YOUTUBE' }); + assert(!(ytplaylist instanceof Error), `should retrieve and parse playlist with YouTube`, ytplaylist); + + const ytmplaylist = await youtube.getPlaylist(ytmsearch.results.community_playlists[0].id, { client: 'YTMUSIC' }); + assert(!(ytmplaylist instanceof Error), `should retrieve and parse playlist with YouTube Music`, ytmplaylist); + + const lyrics = await youtube.getLyrics(Constants.test_song_id); + assert(!(lyrics instanceof Error), `should retrieve song lyrics`, lyrics); + + const video = await downloadVideo(Constants.test_video_id, youtube).catch((error) => error); + assert(!(video instanceof Error), `should download video (${Constants.test_video_id})`, video); + } + + const n_token = new NToken(Constants.n_scramble_sc, Constants.original_ntoken).transform(); + assert(n_token == Constants.expected_ntoken, `should transform n token into ${Constants.expected_ntoken}`, n_token); + + const transformed_url = new SigDecipher(Constants.test_url, { sig_decipher_sc: Constants.sig_decipher_sc }).decipher(); + assert(transformed_url == Constants.expected_url, `should correctly decipher signature`, transformed_url); + + if (failed_tests > 0) + throw new Error('Some tests have failed'); +} + +function downloadVideo(id, youtube) { + return new Promise((resolve, reject) => { + let got_video_info = false; + const stream = youtube.download(id, { type: 'videoandaudio' }); + stream.pipe(Fs.createWriteStream(`./${id}.mp4`)); + stream.on('end', () => Fs.existsSync(`./${id}.mp4`) && got_video_info && resolve() || reject()); + stream.on('info', () => got_video_info = true); + stream.on('error', (err) => reject(err)); + }); +} + +function assert(outcome, description, data) { + const pass_fail = outcome ? 'pass' : 'fail'; + + console.info(pass_fail, ':', description); + !outcome && (failed_tests += 1); + !outcome && console.error('Error: ', data); + + return outcome; +} + +performTests(); \ No newline at end of file