import 'mocha' ; import * as chai from 'chai' ; import { testImage } from '@server/tests/shared' ; import { VideoPlaylistPrivacy } from '@shared/models' ; import { cleanupTests , createMultipleServers , doubleFollow , PeerTubeServer , setAccessTokensToServers , setDefaultVideoChannel , waitJobs } from '@shared/server-commands' ; const expect = chai . expect ; describe ( 'Playlist thumbnail' , function ( ) { let servers = [ ] ; let playlistWithoutThumbnailId ; let playlistWithThumbnailId ; let withThumbnailE1 ; let withThumbnailE2 ; let withoutThumbnailE1 ; let withoutThumbnailE2 ; let video1 ; let video2 ; async function getPlaylistWithoutThumbnail ( server ) { const body = await server . playlists . list ( { start : 0 , count : 10 } ) ; return body . data . find ( p => p . displayName === 'playlist without thumbnail' ) ; } async function getPlaylistWithThumbnail ( server ) { const body = await server . playlists . list ( { start : 0 , count : 10 } ) ; return body . data . find ( p => p . displayName === 'playlist with thumbnail' ) ; } before ( async function ( ) { this . timeout ( 120000 ) ; servers = await createMultipleServers ( 2 , { transcoding : { enabled : false } } ) ; await setAccessTokensToServers ( servers ) ; await setDefaultVideoChannel ( servers ) ; await doubleFollow ( servers [ 0 ] , servers [ 1 ] ) ; video1 = ( await servers [ 0 ] . videos . quickUpload ( { name : 'video 1' } ) ) . id ; video2 = ( await servers [ 0 ] . videos . quickUpload ( { name : 'video 2' } ) ) . id ; await waitJobs ( servers ) ; } ) ; it ( 'Should automatically update the thumbnail when adding an element' , async function ( ) { this . timeout ( 30000 ) ; const created = await servers [ 1 ] . playlists . create ( { attributes : { displayName : 'playlist without thumbnail' , privacy : VideoPlaylistPrivacy . PUBLIC , videoChannelId : servers [ 1 ] . store . channel . id } } ) ; playlistWithoutThumbnailId = created . id ; const added = await servers [ 1 ] . playlists . addElement ( { playlistId : playlistWithoutThumbnailId , attributes : { videoId : video1 } } ) ; withoutThumbnailE1 = added . id ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithoutThumbnail ( server ) ; await testImage ( server . url , 'thumbnail-playlist' , p . thumbnailPath ) ; } } ) ; it ( 'Should not update the thumbnail if we explicitly uploaded a thumbnail' , async function ( ) { this . timeout ( 30000 ) ; const created = await servers [ 1 ] . playlists . create ( { attributes : { displayName : 'playlist with thumbnail' , privacy : VideoPlaylistPrivacy . PUBLIC , videoChannelId : servers [ 1 ] . store . channel . id , thumbnailfile : 'thumbnail.jpg' } } ) ; playlistWithThumbnailId = created . id ; const added = await servers [ 1 ] . playlists . addElement ( { playlistId : playlistWithThumbnailId , attributes : { videoId : video1 } } ) ; withThumbnailE1 = added . id ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithThumbnail ( server ) ; await testImage ( server . url , 'thumbnail' , p . thumbnailPath ) ; } } ) ; it ( 'Should automatically update the thumbnail when moving the first element' , async function ( ) { this . timeout ( 30000 ) ; const added = await servers [ 1 ] . playlists . addElement ( { playlistId : playlistWithoutThumbnailId , attributes : { videoId : video2 } } ) ; withoutThumbnailE2 = added . id ; await servers [ 1 ] . playlists . reorderElements ( { playlistId : playlistWithoutThumbnailId , attributes : { startPosition : 1 , insertAfterPosition : 2 } } ) ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithoutThumbnail ( server ) ; await testImage ( server . url , 'thumbnail-playlist' , p . thumbnailPath ) ; } } ) ; it ( 'Should not update the thumbnail when moving the first element if we explicitly uploaded a thumbnail' , async function ( ) { this . timeout ( 30000 ) ; const added = await servers [ 1 ] . playlists . addElement ( { playlistId : playlistWithThumbnailId , attributes : { videoId : video2 } } ) ; withThumbnailE2 = added . id ; await servers [ 1 ] . playlists . reorderElements ( { playlistId : playlistWithThumbnailId , attributes : { startPosition : 1 , insertAfterPosition : 2 } } ) ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithThumbnail ( server ) ; await testImage ( server . url , 'thumbnail' , p . thumbnailPath ) ; } } ) ; it ( 'Should automatically update the thumbnail when deleting the first element' , async function ( ) { this . timeout ( 30000 ) ; await servers [ 1 ] . playlists . removeElement ( { playlistId : playlistWithoutThumbnailId , elementId : withoutThumbnailE1 } ) ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithoutThumbnail ( server ) ; await testImage ( server . url , 'thumbnail-playlist' , p . thumbnailPath ) ; } } ) ; it ( 'Should not update the thumbnail when deleting the first element if we explicitly uploaded a thumbnail' , async function ( ) { this . timeout ( 30000 ) ; await servers [ 1 ] . playlists . removeElement ( { playlistId : playlistWithThumbnailId , elementId : withThumbnailE1 } ) ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithThumbnail ( server ) ; await testImage ( server . url , 'thumbnail' , p . thumbnailPath ) ; } } ) ; it ( 'Should the thumbnail when we delete the last element' , async function ( ) { this . timeout ( 30000 ) ; await servers [ 1 ] . playlists . removeElement ( { playlistId : playlistWithoutThumbnailId , elementId : withoutThumbnailE2 } ) ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithoutThumbnail ( server ) ; expect ( p . thumbnailPath ) . to . be . null ; } } ) ; it ( 'Should not update the thumbnail when we delete the last element if we explicitly uploaded a thumbnail' , async function ( ) { this . timeout ( 30000 ) ; await servers [ 1 ] . playlists . removeElement ( { playlistId : playlistWithThumbnailId , elementId : withThumbnailE2 } ) ; await waitJobs ( servers ) ; for ( const server of servers ) { const p = await getPlaylistWithThumbnail ( server ) ; await testImage ( server . url , 'thumbnail' , p . thumbnailPath ) ; } } ) ; after ( async function ( ) { await cleanupTests ( servers ) ; } ) ; } ) ;