X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftests%2Fapi%2Fmultiple-pods.js;h=b281cc2492f559bafb1adb7c4dbf5eb5bd649aa6;hb=b0f9f39ed70299a208d1b388c72de8b7f3510cb7;hp=770cee035f093b6eb105b716c8a8efcad93b6dc7;hpb=7a2c9a8e55194342aa050147cf8b0564d4854966;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/multiple-pods.js b/server/tests/api/multiple-pods.js index 770cee035..b281cc249 100644 --- a/server/tests/api/multiple-pods.js +++ b/server/tests/api/multiple-pods.js @@ -1,10 +1,15 @@ +/* eslint-disable no-unused-expressions */ + 'use strict' const chai = require('chai') const each = require('async/each') +const eachSeries = require('async/eachSeries') const expect = chai.expect +const parallel = require('async/parallel') const series = require('async/series') -const webtorrent = new (require('webtorrent'))() +const WebTorrent = require('webtorrent') +const webtorrent = new WebTorrent() const loginUtils = require('../utils/login') const miscsUtils = require('../utils/miscs') @@ -15,9 +20,10 @@ const videosUtils = require('../utils/videos') describe('Test multiple pods', function () { let servers = [] const toRemove = [] + let videoUUID = '' before(function (done) { - this.timeout(30000) + this.timeout(120000) series([ // Run servers @@ -71,15 +77,22 @@ describe('Test multiple pods', function () { describe('Should upload the video and propagate on each pod', function () { it('Should upload the video on pod 1 and propagate on each pod', function (done) { + // Pod 1 has video transcoding activated this.timeout(15000) series([ function (next) { - const name = 'my super name for pod 1' - const description = 'my super description for pod 1' - const tags = [ 'tag1p1', 'tag2p1' ] - const file = 'video_short1.webm' - videosUtils.uploadVideo(servers[0].url, servers[0].accessToken, name, description, tags, file, next) + const videoAttributes = { + name: 'my super name for pod 1', + category: 5, + licence: 4, + language: 9, + nsfw: true, + description: 'my super description for pod 1', + tags: [ 'tag1p1', 'tag2p1' ], + fixture: 'video_short1.webm' + } + videosUtils.uploadVideo(servers[0].url, servers[0].accessToken, videoAttributes, next) }, function (next) { setTimeout(next, 11000) @@ -99,14 +112,30 @@ describe('Test multiple pods', function () { expect(videos.length).to.equal(1) const video = videos[0] expect(video.name).to.equal('my super name for pod 1') + expect(video.category).to.equal(5) + expect(video.categoryLabel).to.equal('Sports') + expect(video.licence).to.equal(4) + expect(video.licenceLabel).to.equal('Attribution - Non Commercial') + expect(video.language).to.equal(9) + expect(video.languageLabel).to.equal('Japanese') + expect(video.nsfw).to.be.ok expect(video.description).to.equal('my super description for pod 1') - expect(video.podUrl).to.equal('localhost:9001') - expect(video.magnetUri).to.exist + expect(video.podHost).to.equal('localhost:9001') expect(video.duration).to.equal(10) expect(video.tags).to.deep.equal([ 'tag1p1', 'tag2p1' ]) - expect(miscsUtils.dateIsValid(video.createdDate)).to.be.true + expect(miscsUtils.dateIsValid(video.createdAt)).to.be.true + expect(miscsUtils.dateIsValid(video.updatedAt)).to.be.true expect(video.author).to.equal('root') + expect(video.files).to.have.lengthOf(1) + + const file = video.files[0] + const magnetUri = file.magnetUri + expect(file.magnetUri).to.exist + expect(file.resolution).to.equal(0) + expect(file.resolutionLabel).to.equal('original') + expect(file.size).to.equal(572456) + if (server.url !== 'http://localhost:9001') { expect(video.isLocal).to.be.false } else { @@ -115,9 +144,9 @@ describe('Test multiple pods', function () { // All pods should have the same magnet Uri if (baseMagnet === null) { - baseMagnet = video.magnetUri + baseMagnet = magnetUri } else { - expect(video.magnetUri).to.equal.magnetUri + expect(baseMagnet).to.equal(magnetUri) } videosUtils.testVideoImage(server.url, 'video_short1.webm', video.thumbnailPath, function (err, test) { @@ -133,18 +162,25 @@ describe('Test multiple pods', function () { }) it('Should upload the video on pod 2 and propagate on each pod', function (done) { - this.timeout(15000) + this.timeout(60000) series([ function (next) { - const name = 'my super name for pod 2' - const description = 'my super description for pod 2' - const tags = [ 'tag1p2', 'tag2p2', 'tag3p2' ] - const file = 'video_short2.webm' - videosUtils.uploadVideo(servers[1].url, servers[1].accessToken, name, description, tags, file, next) + const videoAttributes = { + name: 'my super name for pod 2', + category: 4, + licence: 3, + language: 11, + nsfw: true, + description: 'my super description for pod 2', + tags: [ 'tag1p2', 'tag2p2', 'tag3p2' ], + fixture: 'video_short2.webm' + } + videosUtils.uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes, next) }, function (next) { - setTimeout(next, 11000) + // Transcoding, so wait more that 22 seconds + setTimeout(next, 42000) }], // All pods should have this video function (err) { @@ -161,14 +197,30 @@ describe('Test multiple pods', function () { expect(videos.length).to.equal(2) const video = videos[1] expect(video.name).to.equal('my super name for pod 2') + expect(video.category).to.equal(4) + expect(video.categoryLabel).to.equal('Art') + expect(video.licence).to.equal(3) + expect(video.licenceLabel).to.equal('Attribution - No Derivatives') + expect(video.language).to.equal(11) + expect(video.languageLabel).to.equal('German') + expect(video.nsfw).to.be.true expect(video.description).to.equal('my super description for pod 2') - expect(video.podUrl).to.equal('localhost:9002') - expect(video.magnetUri).to.exist + expect(video.podHost).to.equal('localhost:9002') expect(video.duration).to.equal(5) expect(video.tags).to.deep.equal([ 'tag1p2', 'tag2p2', 'tag3p2' ]) - expect(miscsUtils.dateIsValid(video.createdDate)).to.be.true + expect(miscsUtils.dateIsValid(video.createdAt)).to.be.true + expect(miscsUtils.dateIsValid(video.updatedAt)).to.be.true expect(video.author).to.equal('root') + expect(video.files).to.have.lengthOf(1) + + const file = video.files[0] + const magnetUri = file.magnetUri + expect(file.magnetUri).to.exist + expect(file.resolution).to.equal(0) + expect(file.resolutionLabel).to.equal('original') + expect(file.size).to.equal(942961) + if (server.url !== 'http://localhost:9002') { expect(video.isLocal).to.be.false } else { @@ -177,9 +229,9 @@ describe('Test multiple pods', function () { // All pods should have the same magnet Uri if (baseMagnet === null) { - baseMagnet = video.magnetUri + baseMagnet = magnetUri } else { - expect(video.magnetUri).to.equal.magnetUri + expect(baseMagnet).to.equal(magnetUri) } videosUtils.testVideoImage(server.url, 'video_short2.webm', video.thumbnailPath, function (err, test) { @@ -195,25 +247,37 @@ describe('Test multiple pods', function () { }) it('Should upload two videos on pod 3 and propagate on each pod', function (done) { - this.timeout(30000) + this.timeout(45000) series([ function (next) { - const name = 'my super name for pod 3' - const description = 'my super description for pod 3' - const tags = [ 'tag1p3' ] - const file = 'video_short3.webm' - videosUtils.uploadVideo(servers[2].url, servers[2].accessToken, name, description, tags, file, next) + const videoAttributes = { + name: 'my super name for pod 3', + category: 6, + licence: 5, + language: 11, + nsfw: true, + description: 'my super description for pod 3', + tags: [ 'tag1p3' ], + fixture: 'video_short3.webm' + } + videosUtils.uploadVideo(servers[2].url, servers[2].accessToken, videoAttributes, next) }, function (next) { - const name = 'my super name for pod 3-2' - const description = 'my super description for pod 3-2' - const tags = [ 'tag2p3', 'tag3p3', 'tag4p3' ] - const file = 'video_short.webm' - videosUtils.uploadVideo(servers[2].url, servers[2].accessToken, name, description, tags, file, next) + const videoAttributes = { + name: 'my super name for pod 3-2', + category: 7, + licence: 6, + language: 12, + nsfw: false, + description: 'my super description for pod 3-2', + tags: [ 'tag2p3', 'tag3p3', 'tag4p3' ], + fixture: 'video_short.webm' + } + videosUtils.uploadVideo(servers[2].url, servers[2].accessToken, videoAttributes, next) }, function (next) { - setTimeout(next, 22000) + setTimeout(next, 33000) }], function (err) { if (err) throw err @@ -240,22 +304,54 @@ describe('Test multiple pods', function () { } expect(video1.name).to.equal('my super name for pod 3') + expect(video1.category).to.equal(6) + expect(video1.categoryLabel).to.equal('Travels') + expect(video1.licence).to.equal(5) + expect(video1.licenceLabel).to.equal('Attribution - Non Commercial - Share Alike') + expect(video1.language).to.equal(11) + expect(video1.languageLabel).to.equal('German') + expect(video1.nsfw).to.be.ok expect(video1.description).to.equal('my super description for pod 3') - expect(video1.podUrl).to.equal('localhost:9003') - expect(video1.magnetUri).to.exist + expect(video1.podHost).to.equal('localhost:9003') expect(video1.duration).to.equal(5) expect(video1.tags).to.deep.equal([ 'tag1p3' ]) expect(video1.author).to.equal('root') - expect(miscsUtils.dateIsValid(video1.createdDate)).to.be.true + expect(miscsUtils.dateIsValid(video1.createdAt)).to.be.true + expect(miscsUtils.dateIsValid(video1.updatedAt)).to.be.true + + expect(video1.files).to.have.lengthOf(1) + + const file1 = video1.files[0] + const magnetUri1 = file1.magnetUri + expect(file1.magnetUri).to.exist + expect(file1.resolution).to.equal(0) + expect(file1.resolutionLabel).to.equal('original') + expect(file1.size).to.equal(292677) expect(video2.name).to.equal('my super name for pod 3-2') + expect(video2.category).to.equal(7) + expect(video2.categoryLabel).to.equal('Gaming') + expect(video2.licence).to.equal(6) + expect(video2.licenceLabel).to.equal('Attribution - Non Commercial - No Derivatives') + expect(video2.language).to.equal(12) + expect(video2.languageLabel).to.equal('Korean') + expect(video2.nsfw).to.be.false expect(video2.description).to.equal('my super description for pod 3-2') - expect(video2.podUrl).to.equal('localhost:9003') - expect(video2.magnetUri).to.exist + expect(video2.podHost).to.equal('localhost:9003') expect(video2.duration).to.equal(5) expect(video2.tags).to.deep.equal([ 'tag2p3', 'tag3p3', 'tag4p3' ]) expect(video2.author).to.equal('root') - expect(miscsUtils.dateIsValid(video2.createdDate)).to.be.true + expect(miscsUtils.dateIsValid(video2.createdAt)).to.be.true + expect(miscsUtils.dateIsValid(video2.updatedAt)).to.be.true + + expect(video2.files).to.have.lengthOf(1) + + const file2 = video2.files[0] + const magnetUri2 = file2.magnetUri + expect(file2.magnetUri).to.exist + expect(file2.resolution).to.equal(0) + expect(file2.resolutionLabel).to.equal('original') + expect(file2.size).to.equal(218910) if (server.url !== 'http://localhost:9003') { expect(video1.isLocal).to.be.false @@ -267,9 +363,9 @@ describe('Test multiple pods', function () { // All pods should have the same magnet Uri if (baseMagnet === null) { - baseMagnet = video2.magnetUri + baseMagnet = magnetUri2 } else { - expect(video2.magnetUri).to.equal.magnetUri + expect(baseMagnet).to.equal(magnetUri2) } videosUtils.testVideoImage(server.url, 'video_short3.webm', video1.thumbnailPath, function (err, test) { @@ -299,10 +395,10 @@ describe('Test multiple pods', function () { if (err) throw err const video = res.body.data[0] - toRemove.push(res.body.data[2].id) - toRemove.push(res.body.data[3].id) + toRemove.push(res.body.data[2]) + toRemove.push(res.body.data[3]) - webtorrent.add(video.magnetUri, function (torrent) { + webtorrent.add(video.files[0].magnetUri, function (torrent) { expect(torrent.files).to.exist expect(torrent.files.length).to.equal(1) expect(torrent.files[0].path).to.exist.and.to.not.equal('') @@ -321,7 +417,7 @@ describe('Test multiple pods', function () { const video = res.body.data[1] - webtorrent.add(video.magnetUri, function (torrent) { + webtorrent.add(video.files[0].magnetUri, function (torrent) { expect(torrent.files).to.exist expect(torrent.files.length).to.equal(1) expect(torrent.files[0].path).to.exist.and.to.not.equal('') @@ -340,7 +436,7 @@ describe('Test multiple pods', function () { const video = res.body.data[2] - webtorrent.add(video.magnetUri, function (torrent) { + webtorrent.add(video.files[0].magnetUri, function (torrent) { expect(torrent.files).to.exist expect(torrent.files.length).to.equal(1) expect(torrent.files[0].path).to.exist.and.to.not.equal('') @@ -359,7 +455,7 @@ describe('Test multiple pods', function () { const video = res.body.data[3] - webtorrent.add(video.magnetUri, function (torrent) { + webtorrent.add(video.files[0].magnetUri, function (torrent) { expect(torrent.files).to.exist expect(torrent.files.length).to.equal(1) expect(torrent.files[0].path).to.exist.and.to.not.equal('') @@ -368,16 +464,306 @@ describe('Test multiple pods', function () { }) }) }) + }) + + describe('Should update video views, likes and dislikes', function () { + let localVideosPod3 = [] + let remoteVideosPod1 = [] + let remoteVideosPod2 = [] + let remoteVideosPod3 = [] + + before(function (done) { + parallel([ + function (callback) { + videosUtils.getVideosList(servers[0].url, function (err, res) { + if (err) throw err + + remoteVideosPod1 = res.body.data.filter(video => video.isLocal === false).map(video => video.id) + + callback() + }) + }, + + function (callback) { + videosUtils.getVideosList(servers[1].url, function (err, res) { + if (err) throw err + + remoteVideosPod2 = res.body.data.filter(video => video.isLocal === false).map(video => video.id) + + callback() + }) + }, + + function (callback) { + videosUtils.getVideosList(servers[2].url, function (err, res) { + if (err) throw err + + localVideosPod3 = res.body.data.filter(video => video.isLocal === true).map(video => video.id) + remoteVideosPod3 = res.body.data.filter(video => video.isLocal === false).map(video => video.id) + + callback() + }) + } + ], done) + }) + + it('Should view multiple videos on owned servers', function (done) { + this.timeout(30000) + + parallel([ + function (callback) { + videosUtils.getVideo(servers[2].url, localVideosPod3[0], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, localVideosPod3[0], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, localVideosPod3[0], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, localVideosPod3[1], callback) + }, + + function (callback) { + setTimeout(callback, 22000) + } + ], function (err) { + if (err) throw err + + eachSeries(servers, function (server, callback) { + videosUtils.getVideosList(server.url, function (err, res) { + if (err) throw err + + const videos = res.body.data + expect(videos.find(video => video.views === 3)).to.exist + expect(videos.find(video => video.views === 1)).to.exist + + callback() + }) + }, done) + }) + }) + + it('Should view multiple videos on each servers', function (done) { + this.timeout(30000) + + parallel([ + function (callback) { + videosUtils.getVideo(servers[0].url, remoteVideosPod1[0], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[1].url, remoteVideosPod2[0], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[1].url, remoteVideosPod2[0], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, remoteVideosPod3[0], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, remoteVideosPod3[1], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, remoteVideosPod3[1], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, remoteVideosPod3[1], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, localVideosPod3[1], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, localVideosPod3[1], callback) + }, + + function (callback) { + videosUtils.getVideo(servers[2].url, localVideosPod3[1], callback) + }, + + function (callback) { + setTimeout(callback, 22000) + } + ], function (err) { + if (err) throw err + + let baseVideos = null + eachSeries(servers, function (server, callback) { + videosUtils.getVideosList(server.url, function (err, res) { + if (err) throw err + + const videos = res.body.data + + // Initialize base videos for future comparisons + if (baseVideos === null) { + baseVideos = videos + return callback() + } + + baseVideos.forEach(baseVideo => { + const sameVideo = videos.find(video => video.name === baseVideo.name) + expect(baseVideo.views).to.equal(sameVideo.views) + }) + + callback() + }) + }, done) + }) + }) + + it('Should like and dislikes videos on different services', function (done) { + this.timeout(30000) + + parallel([ + function (callback) { + videosUtils.rateVideo(servers[0].url, servers[0].accessToken, remoteVideosPod1[0], 'like', callback) + }, + + function (callback) { + videosUtils.rateVideo(servers[0].url, servers[0].accessToken, remoteVideosPod1[0], 'dislike', callback) + }, + + function (callback) { + videosUtils.rateVideo(servers[0].url, servers[0].accessToken, remoteVideosPod1[0], 'like', callback) + }, + + function (callback) { + videosUtils.rateVideo(servers[2].url, servers[2].accessToken, localVideosPod3[1], 'like', callback) + }, + + function (callback) { + videosUtils.rateVideo(servers[2].url, servers[2].accessToken, localVideosPod3[1], 'dislike', callback) + }, + + function (callback) { + videosUtils.rateVideo(servers[2].url, servers[2].accessToken, remoteVideosPod3[1], 'dislike', callback) + }, + + function (callback) { + videosUtils.rateVideo(servers[2].url, servers[2].accessToken, remoteVideosPod3[0], 'like', callback) + }, + + function (callback) { + setTimeout(callback, 22000) + } + ], function (err) { + if (err) throw err + + let baseVideos = null + eachSeries(servers, function (server, callback) { + videosUtils.getVideosList(server.url, function (err, res) { + if (err) throw err + + const videos = res.body.data + + // Initialize base videos for future comparisons + if (baseVideos === null) { + baseVideos = videos + return callback() + } + + baseVideos.forEach(baseVideo => { + const sameVideo = videos.find(video => video.name === baseVideo.name) + expect(baseVideo.likes).to.equal(sameVideo.likes) + expect(baseVideo.dislikes).to.equal(sameVideo.dislikes) + }) + + callback() + }) + }, done) + }) + }) + }) - it('Should remove the file 3 and 3-2 by asking pod 3', function (done) { + describe('Should manipulate these videos', function () { + it('Should update the video 3 by asking pod 3', function (done) { + this.timeout(15000) + + const attributes = { + name: 'my super video updated', + category: 10, + licence: 7, + language: 13, + nsfw: true, + description: 'my super description updated', + tags: [ 'tagup1', 'tagup2' ] + } + videosUtils.updateVideo(servers[2].url, servers[2].accessToken, toRemove[0].id, attributes, function (err) { + if (err) throw err + + setTimeout(done, 11000) + }) + }) + + it('Should have the video 3 updated on each pod', function (done) { + this.timeout(200000) + + each(servers, function (server, callback) { + // Avoid "duplicate torrent" errors + const webtorrent = new WebTorrent() + + videosUtils.getVideosList(server.url, function (err, res) { + if (err) throw err + + const videos = res.body.data + const videoUpdated = videos.find(function (video) { + return video.name === 'my super video updated' + }) + + expect(!!videoUpdated).to.be.true + expect(videoUpdated.category).to.equal(10) + expect(videoUpdated.categoryLabel).to.equal('Entertainment') + expect(videoUpdated.licence).to.equal(7) + expect(videoUpdated.licenceLabel).to.equal('Public Domain Dedication') + expect(videoUpdated.language).to.equal(13) + expect(videoUpdated.languageLabel).to.equal('French') + expect(videoUpdated.nsfw).to.be.ok + expect(videoUpdated.description).to.equal('my super description updated') + expect(videoUpdated.tags).to.deep.equal([ 'tagup1', 'tagup2' ]) + expect(miscsUtils.dateIsValid(videoUpdated.updatedAt, 20000)).to.be.true + + const file = videoUpdated.files[0] + const magnetUri = file.magnetUri + expect(file.magnetUri).to.exist + expect(file.resolution).to.equal(0) + expect(file.resolutionLabel).to.equal('original') + expect(file.size).to.equal(292677) + + videosUtils.testVideoImage(server.url, 'video_short3.webm', videoUpdated.thumbnailPath, function (err, test) { + if (err) throw err + expect(test).to.equal(true) + + webtorrent.add(videoUpdated.files[0].magnetUri, function (torrent) { + expect(torrent.files).to.exist + expect(torrent.files.length).to.equal(1) + expect(torrent.files[0].path).to.exist.and.to.not.equal('') + + callback() + }) + }) + }) + }, done) + }) + + it('Should remove the videos 3 and 3-2 by asking pod 3', function (done) { this.timeout(15000) series([ function (next) { - videosUtils.removeVideo(servers[2].url, servers[2].accessToken, toRemove[0], next) + videosUtils.removeVideo(servers[2].url, servers[2].accessToken, toRemove[0].id, next) }, function (next) { - videosUtils.removeVideo(servers[2].url, servers[2].accessToken, toRemove[1], next) + videosUtils.removeVideo(servers[2].url, servers[2].accessToken, toRemove[1].id, next) }], function (err) { if (err) throw err @@ -394,16 +780,63 @@ describe('Test multiple pods', function () { const videos = res.body.data expect(videos).to.be.an('array') expect(videos.length).to.equal(2) - expect(videos[0].id).not.to.equal(videos[1].id) - expect(videos[0].id).not.to.equal(toRemove[0]) - expect(videos[1].id).not.to.equal(toRemove[0]) - expect(videos[0].id).not.to.equal(toRemove[1]) - expect(videos[1].id).not.to.equal(toRemove[1]) + expect(videos[0].name).not.to.equal(videos[1].name) + expect(videos[0].name).not.to.equal(toRemove[0].name) + expect(videos[1].name).not.to.equal(toRemove[0].name) + expect(videos[0].name).not.to.equal(toRemove[1].name) + expect(videos[1].name).not.to.equal(toRemove[1].name) + + videoUUID = videos.find(video => video.name === 'my super name for pod 1').uuid callback() }) }, done) }) + + it('Should get the same video by UUID on each pod', function (done) { + let baseVideo = null + each(servers, function (server, callback) { + videosUtils.getVideo(server.url, videoUUID, function (err, res) { + if (err) throw err + + const video = res.body + + if (baseVideo === null) { + baseVideo = video + return callback() + } + + expect(baseVideo.name).to.equal(video.name) + expect(baseVideo.uuid).to.equal(video.uuid) + expect(baseVideo.category).to.equal(video.category) + expect(baseVideo.language).to.equal(video.language) + expect(baseVideo.licence).to.equal(video.licence) + expect(baseVideo.category).to.equal(video.category) + expect(baseVideo.nsfw).to.equal(video.nsfw) + expect(baseVideo.author).to.equal(video.author) + expect(baseVideo.tags).to.deep.equal(video.tags) + + callback() + }) + }, done) + }) + + it('Should get the preview from each pod', function (done) { + each(servers, function (server, callback) { + videosUtils.getVideo(server.url, videoUUID, function (err, res) { + if (err) throw err + + const video = res.body + + videosUtils.testVideoImage(server.url, 'video_short1-preview.webm', video.previewPath, function (err, test) { + if (err) throw err + expect(test).to.equal(true) + + callback() + }) + }) + }, done) + }) }) after(function (done) {