var assert = require ( 'assert' ) ;
const low = require ( 'lowdb' )
var winston = require ( 'winston' ) ;
process . chdir ( './backend' )
const FileSync = require ( 'lowdb/adapters/FileSync' ) ;
const adapter = new FileSync ( './appdata/db.json' ) ;
const db = low ( adapter )
const users _adapter = new FileSync ( './appdata/users.json' ) ;
const users _db = low ( users _adapter ) ;
const defaultFormat = winston . format . printf ( ( { level , message , label , timestamp } ) => {
return ` ${ timestamp } ${ level . toUpperCase ( ) } : ${ message } ` ;
} ) ;
let debugMode = process . env . YTDL _MODE === 'debug' ;
const logger = winston . createLogger ( {
level : 'info' ,
format : winston . format . combine ( winston . format . timestamp ( ) , defaultFormat ) ,
defaultMeta : { } ,
transports : [
//
// - Write to all logs with level `info` and below to `combined.log`
// - Write all logs error (and below) to `error.log`.
//
new winston . transports . File ( { filename : 'appdata/logs/error.log' , level : 'error' } ) ,
new winston . transports . File ( { filename : 'appdata/logs/combined.log' } ) ,
new winston . transports . Console ( { level : 'debug' , name : 'console' } )
]
} ) ;
var auth _api = require ( '../authentication/auth' ) ;
var db _api = require ( '../db' ) ;
const utils = require ( '../utils' ) ;
const subscriptions _api = require ( '../subscriptions' ) ;
const fs = require ( 'fs-extra' ) ;
const { uuid } = require ( 'uuidv4' ) ;
db _api . initialize ( db , users _db , logger ) ;
describe ( 'Database' , async function ( ) {
describe ( 'Import' , async function ( ) {
it ( 'Migrate' , async function ( ) {
await db _api . connectToDB ( ) ;
await db _api . removeAllRecords ( ) ;
const success = await db _api . importJSONToDB ( db . value ( ) , users _db . value ( ) ) ;
assert ( success ) ;
} ) ;
it ( 'Transfer to remote' , async function ( ) {
await db _api . removeAllRecords ( 'test' ) ;
await db _api . insertRecordIntoTable ( 'test' , { test : 'test' } ) ;
await db _api . transferDB ( true ) ;
const success = await db _api . getRecord ( 'test' , { test : 'test' } ) ;
assert ( success ) ;
} ) ;
it ( 'Transfer to local' , async function ( ) {
await db _api . connectToDB ( ) ;
await db _api . removeAllRecords ( 'test' ) ;
await db _api . insertRecordIntoTable ( 'test' , { test : 'test' } ) ;
await db _api . transferDB ( false ) ;
const success = await db _api . getRecord ( 'test' , { test : 'test' } ) ;
assert ( success ) ;
} ) ;
} ) ;
describe ( 'Export' , function ( ) {
} ) ;
describe ( 'Basic functions' , async function ( ) {
beforeEach ( async function ( ) {
await db _api . connectToDB ( ) ;
await db _api . removeAllRecords ( 'test' ) ;
} ) ;
it ( 'Add and read record' , async function ( ) {
await db _api . insertRecordIntoTable ( 'test' , { test _add : 'test' , test _undefined : undefined , test _null : undefined } ) ;
const added _record = await db _api . getRecord ( 'test' , { test _add : 'test' , test _undefined : undefined , test _null : null } ) ;
assert ( added _record [ 'test_add' ] === 'test' ) ;
await db _api . removeRecord ( 'test' , { test _add : 'test' } ) ;
} ) ;
it ( 'Update record' , async function ( ) {
await db _api . insertRecordIntoTable ( 'test' , { test _update : 'test' } ) ;
await db _api . updateRecord ( 'test' , { test _update : 'test' } , { added _field : true } ) ;
const updated _record = await db _api . getRecord ( 'test' , { test _update : 'test' } ) ;
assert ( updated _record [ 'added_field' ] ) ;
await db _api . removeRecord ( 'test' , { test _update : 'test' } ) ;
} ) ;
it ( 'Remove record' , async function ( ) {
await db _api . insertRecordIntoTable ( 'test' , { test _remove : 'test' } ) ;
const delete _succeeded = await db _api . removeRecord ( 'test' , { test _remove : 'test' } ) ;
assert ( delete _succeeded ) ;
const deleted _record = await db _api . getRecord ( 'test' , { test _remove : 'test' } ) ;
assert ( ! deleted _record ) ;
} ) ;
it ( 'Push to record array' , async function ( ) {
await db _api . insertRecordIntoTable ( 'test' , { test : 'test' , test _array : [ ] } ) ;
await db _api . pushToRecordsArray ( 'test' , { test : 'test' } , 'test_array' , 'test_item' ) ;
const record = await db _api . getRecord ( 'test' , { test : 'test' } ) ;
assert ( record ) ;
assert ( record [ 'test_array' ] . length === 1 ) ;
} ) ;
it ( 'Pull from record array' , async function ( ) {
await db _api . insertRecordIntoTable ( 'test' , { test : 'test' , test _array : [ 'test_item' ] } ) ;
await db _api . pullFromRecordsArray ( 'test' , { test : 'test' } , 'test_array' , 'test_item' ) ;
const record = await db _api . getRecord ( 'test' , { test : 'test' } ) ;
assert ( record ) ;
assert ( record [ 'test_array' ] . length === 0 ) ;
} ) ;
it ( 'Bulk add' , async function ( ) {
const NUM _RECORDS _TO _ADD = 2002 ; // max batch ops is 1000
const test _records = [ ] ;
for ( let i = 0 ; i < NUM _RECORDS _TO _ADD ; i ++ ) {
test _records . push ( {
uid : uuid ( )
} ) ;
}
const succcess = await db _api . bulkInsertRecordsIntoTable ( 'test' , test _records ) ;
const received _records = await db _api . getRecords ( 'test' ) ;
assert ( succcess && received _records && received _records . length === NUM _RECORDS _TO _ADD ) ;
} ) ;
it ( 'Bulk update' , async function ( ) {
// bulk add records
const NUM _RECORDS _TO _ADD = 100 ; // max batch ops is 1000
const test _records = [ ] ;
const update _obj = { } ;
for ( let i = 0 ; i < NUM _RECORDS _TO _ADD ; i ++ ) {
const test _uid = uuid ( ) ;
test _records . push ( {
uid : test _uid
} ) ;
update _obj [ test _uid ] = { added _field : true } ;
}
let success = await db _api . bulkInsertRecordsIntoTable ( 'test' , test _records ) ;
assert ( success ) ;
// makes sure they are added
const received _records = await db _api . getRecords ( 'test' ) ;
assert ( received _records && received _records . length === NUM _RECORDS _TO _ADD ) ;
success = await db _api . bulkUpdateRecords ( 'test' , 'uid' , update _obj ) ;
assert ( success ) ;
const received _updated _records = await db _api . getRecords ( 'test' ) ;
for ( let i = 0 ; i < received _updated _records . length ; i ++ ) {
success &= received _updated _records [ i ] [ 'added_field' ] ;
}
assert ( success ) ;
} ) ;
it ( 'Stats' , async function ( ) {
const stats = await db _api . getDBStats ( ) ;
assert ( stats ) ;
} ) ;
it ( 'Query speed' , async function ( ) {
this . timeout ( 120000 ) ;
const NUM _RECORDS _TO _ADD = 300004 ; // max batch ops is 1000
const test _records = [ ] ;
let random _uid = '06241f83-d1b8-4465-812c-618dfa7f2943' ;
for ( let i = 0 ; i < NUM _RECORDS _TO _ADD ; i ++ ) {
const uid = uuid ( ) ;
if ( i === NUM _RECORDS _TO _ADD / 2 ) random _uid = uid ;
test _records . push ( { "id" : "A$AP Mob - Yamborghini High (Official Music Video) ft. Juicy J" , "title" : "A$AP Mob - Yamborghini High (Official Music Video) ft. Juicy J" , "thumbnailURL" : "https://i.ytimg.com/vi/tt7gP_IW-1w/maxresdefault.jpg" , "isAudio" : true , "duration" : 312 , "url" : "https://www.youtube.com/watch?v=tt7gP_IW-1w" , "uploader" : "asapmobVEVO" , "size" : 5060157 , "path" : "audio\\A$AP Mob - Yamborghini High (Official Music Video) ft. Juicy J.mp3" , "upload_date" : "2016-05-11" , "description" : "A$AP Mob ft. Juicy J - \"Yamborghini High\" Get it now on:\niTunes: http://smarturl.it/iYAMH?IQid=yt\nListen on Spotify: http://smarturl.it/sYAMH?IQid=yt\nGoogle Play: http://smarturl.it/gYAMH?IQid=yt\nAmazon: http://smarturl.it/aYAMH?IQid=yt\n\nFollow A$AP Mob:\nhttps://www.facebook.com/asapmobofficial\nhttps://twitter.com/ASAPMOB\nhttp://instagram.com/asapmob \nhttp://www.asapmob.com/\n\n#AsapMob #YamborghiniHigh #Vevo #HipHop #OfficialMusicVideo #JuicyJ" , "view_count" : 118689353 , "height" : null , "abr" : 160 , "uid" : uid , "registered" : 1626672120632 } ) ;
}
const insert _start = Date . now ( ) ;
let success = await db _api . bulkInsertRecordsIntoTable ( 'test' , test _records ) ;
const insert _end = Date . now ( ) ;
console . log ( ` Insert time: ${ ( insert _end - insert _start ) / 1000 } s ` ) ;
const query _start = Date . now ( ) ;
const random _record = await db _api . getRecord ( 'test' , { uid : random _uid } ) ;
const query _end = Date . now ( ) ;
console . log ( random _record )
console . log ( ` Query time: ${ ( query _end - query _start ) / 1000 } s ` ) ;
success = ! ! random _record ;
assert ( success ) ;
} ) ;
} ) ;
} ) ;
describe ( 'Multi User' , async function ( ) {
let user = null ;
const user _to _test = 'admin' ;
const sub _to _test = 'dc834388-3454-41bf-a618-e11cb8c7de1c' ;
const playlist _to _test = 'ysabVZz4x' ;
beforeEach ( async function ( ) {
await db _api . connectToDB ( ) ;
auth _api . initialize ( db _api , logger ) ;
subscriptions _api . initialize ( db _api , logger ) ;
user = await auth _api . login ( 'admin' , 'pass' ) ;
} ) ;
describe ( 'Authentication' , function ( ) {
it ( 'login' , async function ( ) {
assert ( user ) ;
} ) ;
} ) ;
describe ( 'Video player - normal' , function ( ) {
const video _to _test = 'ebbcfffb-d6f1-4510-ad25-d1ec82e0477e' ;
it ( 'Get video' , async function ( ) {
const video _obj = db _api . getVideo ( video _to _test , 'admin' ) ;
assert ( video _obj ) ;
} ) ;
it ( 'Video access - disallowed' , async function ( ) {
await db _api . setVideoProperty ( video _to _test , { sharingEnabled : false } , user _to _test ) ;
const video _obj = auth _api . getUserVideo ( 'admin' , video _to _test , true ) ;
assert ( ! video _obj ) ;
} ) ;
it ( 'Video access - allowed' , async function ( ) {
await db _api . setVideoProperty ( video _to _test , { sharingEnabled : true } , user _to _test ) ;
const video _obj = auth _api . getUserVideo ( 'admin' , video _to _test , true ) ;
assert ( video _obj ) ;
} ) ;
} ) ;
describe ( 'Zip generators' , function ( ) {
it ( 'Playlist zip generator' , async function ( ) {
const playlist = await db _api . getPlaylist ( playlist _to _test , user _to _test ) ;
assert ( playlist ) ;
const playlist _files _to _download = [ ] ;
for ( let i = 0 ; i < playlist [ 'uids' ] . length ; i ++ ) {
const uid = playlist [ 'uids' ] [ i ] ;
const playlist _file = await db _api . getVideo ( uid , user _to _test ) ;
playlist _files _to _download . push ( playlist _file ) ;
}
const zip _path = await utils . createContainerZipFile ( playlist , playlist _files _to _download ) ;
const zip _exists = fs . pathExistsSync ( zip _path ) ;
assert ( zip _exists ) ;
if ( zip _exists ) fs . unlinkSync ( zip _path ) ;
} ) ;
it ( 'Subscription zip generator' , async function ( ) {
const sub = await subscriptions _api . getSubscription ( sub _to _test , user _to _test ) ;
const sub _videos = await db _api . getRecords ( 'files' , { sub _id : sub . id } ) ;
assert ( sub ) ;
const sub _files _to _download = [ ] ;
for ( let i = 0 ; i < sub _videos . length ; i ++ ) {
const sub _file = sub _videos [ i ] ;
sub _files _to _download . push ( sub _file ) ;
}
const zip _path = await utils . createContainerZipFile ( sub , sub _files _to _download ) ;
const zip _exists = fs . pathExistsSync ( zip _path ) ;
assert ( zip _exists ) ;
if ( zip _exists ) fs . unlinkSync ( zip _path ) ;
} ) ;
} ) ;
// describe('Video player - subscription', function() {
// const sub_to_test = '';
// const video_to_test = 'ebbcfffb-d6f1-4510-ad25-d1ec82e0477e';
// it('Get video', async function() {
// const video_obj = db_api.getVideo(video_to_test, 'admin', );
// assert(video_obj);
// });
// it('Video access - disallowed', async function() {
// await db_api.setVideoProperty(video_to_test, {sharingEnabled: false}, user_to_test, sub_to_test);
// const video_obj = auth_api.getUserVideo('admin', video_to_test, true);
// assert(!video_obj);
// });
// it('Video access - allowed', async function() {
// await db_api.setVideoProperty(video_to_test, {sharingEnabled: true}, user_to_test, sub_to_test);
// const video_obj = auth_api.getUserVideo('admin', video_to_test, true);
// assert(video_obj);
// });
// });
describe ( 'Downloader' , function ( ) {
const url = '' ;
const options = {
ui _uid : uuid ( ) ,
user : 'admin'
}
const download = {
url : url ,
options : options ,
type : 'video'
}
beforeEach ( async function ( ) {
await db _api . connectToDB ( ) ;
await db _api . removeAllRecords ( 'download_queue' ) ;
await db _api . insertRecordIntoTable ( 'download_queue' , download )
} ) ;
it ( 'Get file info' , async function ( ) {
} ) ;
it ( 'Download file' , async function ( ) {
} ) ;
it ( 'Queue file' , async function ( ) {
} ) ;
it ( 'Pause file' , async function ( ) {
} ) ;
} ) ;
} ) ;