import 'mocha' ; import * as chai from 'chai' ; import { wait } from '@shared/core-utils' ; import { VideoChannel } from '@shared/models' ; import { cleanupTests , createMultipleServers , PeerTubeServer , SearchCommand , setAccessTokensToServers , waitJobs } from '@shared/server-commands' ; const expect = chai . expect ; describe ( 'Test ActivityPub video channels search' , function ( ) { let servers ; let userServer2Token ; let videoServer2UUID ; let channelIdServer2 ; let command ; before ( async function ( ) { this . timeout ( 120000 ) ; servers = await createMultipleServers ( 2 ) ; await setAccessTokensToServers ( servers ) ; { await servers [ 0 ] . users . create ( { username : 'user1_server1' , password : 'password' } ) ; const channel = { name : 'channel1_server1' , displayName : 'Channel 1 server 1' } ; await servers [ 0 ] . channels . create ( { attributes : channel } ) ; } { const user = { username : 'user1_server2' , password : 'password' } ; await servers [ 1 ] . users . create ( { username : user . username , password : user . password } ) ; userServer2Token = await servers [ 1 ] . login . getAccessToken ( user ) ; const channel = { name : 'channel1_server2' , displayName : 'Channel 1 server 2' } ; const created = await servers [ 1 ] . channels . create ( { token : userServer2Token , attributes : channel } ) ; channelIdServer2 = created . id ; const attributes = { name : 'video 1 server 2' , channelId : channelIdServer2 } ; const { uuid } = await servers [ 1 ] . videos . upload ( { token : userServer2Token , attributes } ) ; videoServer2UUID = uuid ; } await waitJobs ( servers ) ; command = servers [ 0 ] . search ; } ) ; it ( 'Should not find a remote video channel' , async function ( ) { this . timeout ( 15000 ) ; { const search = servers [ 1 ] . url + '/video-channels/channel1_server3' ; const body = await command . searchChannels ( { search , token : servers [ 0 ] . accessToken } ) ; expect ( body . total ) . to . equal ( 0 ) ; expect ( body . data ) . to . be . an ( 'array' ) ; expect ( body . data ) . to . have . lengthOf ( 0 ) ; } { const search = servers [ 1 ] . url + '/video-channels/channel1_server2' ; const body = await command . searchChannels ( { search } ) ; expect ( body . total ) . to . equal ( 0 ) ; expect ( body . data ) . to . be . an ( 'array' ) ; expect ( body . data ) . to . have . lengthOf ( 0 ) ; } } ) ; it ( 'Should search a local video channel' , async function ( ) { const searches = [ servers [ 0 ] . url + '/video-channels/channel1_server1' , 'channel1_server1@localhost:' + servers [ 0 ] . port ] ; for ( const search of searches ) { const body = await command . searchChannels ( { search } ) ; expect ( body . total ) . to . equal ( 1 ) ; expect ( body . data ) . to . be . an ( 'array' ) ; expect ( body . data ) . to . have . lengthOf ( 1 ) ; expect ( body . data [ 0 ] . name ) . to . equal ( 'channel1_server1' ) ; expect ( body . data [ 0 ] . displayName ) . to . equal ( 'Channel 1 server 1' ) ; } } ) ; it ( 'Should search a local video channel with an alternative URL' , async function ( ) { const search = servers [ 0 ] . url + '/c/channel1_server1' ; for ( const token of [ undefined , servers [ 0 ] . accessToken ] ) { const body = await command . searchChannels ( { search , token } ) ; expect ( body . total ) . to . equal ( 1 ) ; expect ( body . data ) . to . be . an ( 'array' ) ; expect ( body . data ) . to . have . lengthOf ( 1 ) ; expect ( body . data [ 0 ] . name ) . to . equal ( 'channel1_server1' ) ; expect ( body . data [ 0 ] . displayName ) . to . equal ( 'Channel 1 server 1' ) ; } } ) ; it ( 'Should search a local video channel with a query in URL' , async function ( ) { const searches = [ servers [ 0 ] . url + '/video-channels/channel1_server1' , servers [ 0 ] . url + '/c/channel1_server1' ] ; for ( const search of searches ) { for ( const token of [ undefined , servers [ 0 ] . accessToken ] ) { const body = await command . searchChannels ( { search : search + '?param=2' , token } ) ; expect ( body . total ) . to . equal ( 1 ) ; expect ( body . data ) . to . be . an ( 'array' ) ; expect ( body . data ) . to . have . lengthOf ( 1 ) ; expect ( body . data [ 0 ] . name ) . to . equal ( 'channel1_server1' ) ; expect ( body . data [ 0 ] . displayName ) . to . equal ( 'Channel 1 server 1' ) ; } } } ) ; it ( 'Should search a remote video channel with URL or handle' , async function ( ) { const searches = [ servers [ 1 ] . url + '/video-channels/channel1_server2' , servers [ 1 ] . url + '/c/channel1_server2' , servers [ 1 ] . url + '/c/channel1_server2/videos' , 'channel1_server2@localhost:' + servers [ 1 ] . port ] ; for ( const search of searches ) { const body = await command . searchChannels ( { search , token : servers [ 0 ] . accessToken } ) ; expect ( body . total ) . to . equal ( 1 ) ; expect ( body . data ) . to . be . an ( 'array' ) ; expect ( body . data ) . to . have . lengthOf ( 1 ) ; expect ( body . data [ 0 ] . name ) . to . equal ( 'channel1_server2' ) ; expect ( body . data [ 0 ] . displayName ) . to . equal ( 'Channel 1 server 2' ) ; } } ) ; it ( 'Should not list this remote video channel' , async function ( ) { const body = await servers [ 0 ] . channels . list ( ) ; expect ( body . total ) . to . equal ( 3 ) ; expect ( body . data ) . to . have . lengthOf ( 3 ) ; expect ( body . data [ 0 ] . name ) . to . equal ( 'channel1_server1' ) ; expect ( body . data [ 1 ] . name ) . to . equal ( 'user1_server1_channel' ) ; expect ( body . data [ 2 ] . name ) . to . equal ( 'root_channel' ) ; } ) ; it ( 'Should list video channel videos of server 2 without token' , async function ( ) { this . timeout ( 30000 ) ; await waitJobs ( servers ) ; const { total , data } = await servers [ 0 ] . videos . listByChannel ( { token : null , handle : 'channel1_server2@localhost:' + servers [ 1 ] . port } ) ; expect ( total ) . to . equal ( 0 ) ; expect ( data ) . to . have . lengthOf ( 0 ) ; } ) ; it ( 'Should list video channel videos of server 2 with token' , async function ( ) { const { total , data } = await servers [ 0 ] . videos . listByChannel ( { handle : 'channel1_server2@localhost:' + servers [ 1 ] . port } ) ; expect ( total ) . to . equal ( 1 ) ; expect ( data [ 0 ] . name ) . to . equal ( 'video 1 server 2' ) ; } ) ; it ( 'Should update video channel of server 2, and refresh it on server 1' , async function ( ) { this . timeout ( 60000 ) ; await servers [ 1 ] . channels . update ( { token : userServer2Token , channelName : 'channel1_server2' , attributes : { displayName : 'channel updated' } } ) ; await servers [ 1 ] . users . updateMe ( { token : userServer2Token , displayName : 'user updated' } ) ; await waitJobs ( servers ) ; await wait ( 10000 ) ; const search = servers [ 1 ] . url + '/video-channels/channel1_server2' ; const body = await command . searchChannels ( { search , token : servers [ 0 ] . accessToken } ) ; expect ( body . total ) . to . equal ( 1 ) ; expect ( body . data ) . to . have . lengthOf ( 1 ) ; const videoChannel = body . data [ 0 ] ; expect ( videoChannel . displayName ) . to . equal ( 'channel updated' ) ; } ) ; it ( 'Should update and add a video on server 2, and update it on server 1 after a search' , async function ( ) { this . timeout ( 60000 ) ; await servers [ 1 ] . videos . update ( { token : userServer2Token , id : videoServer2UUID , attributes : { name : 'video 1 updated' } } ) ; await servers [ 1 ] . videos . upload ( { token : userServer2Token , attributes : { name : 'video 2 server 2' , channelId : channelIdServer2 } } ) ; await waitJobs ( servers ) ; await wait ( 10000 ) ; const search = servers [ 1 ] . url + '/video-channels/channel1_server2' ; await command . searchChannels ( { search , token : servers [ 0 ] . accessToken } ) ; await waitJobs ( servers ) ; const handle = 'channel1_server2@localhost:' + servers [ 1 ] . port ; const { total , data } = await servers [ 0 ] . videos . listByChannel ( { handle , sort : '-createdAt' } ) ; expect ( total ) . to . equal ( 2 ) ; expect ( data [ 0 ] . name ) . to . equal ( 'video 2 server 2' ) ; expect ( data [ 1 ] . name ) . to . equal ( 'video 1 updated' ) ; } ) ; it ( 'Should delete video channel of server 2, and delete it on server 1' , async function ( ) { this . timeout ( 60000 ) ; await servers [ 1 ] . channels . delete ( { token : userServer2Token , channelName : 'channel1_server2' } ) ; await waitJobs ( servers ) ; await wait ( 10000 ) ; const search = servers [ 1 ] . url + '/video-channels/channel1_server2' ; const body = await command . searchChannels ( { search , token : servers [ 0 ] . accessToken } ) ; expect ( body . total ) . to . equal ( 0 ) ; expect ( body . data ) . to . have . lengthOf ( 0 ) ; } ) ; after ( async function ( ) { await cleanupTests ( servers ) ; } ) ; } ) ;