PeerTube/server/tests/utils/videos/videos.ts

336 lines
9.2 KiB
TypeScript
Raw Normal View History

2017-09-07 15:27:35 +02:00
import { readFile } from 'fs'
import * as parseTorrent from 'parse-torrent'
2017-12-28 13:59:22 +01:00
import { isAbsolute, join } from 'path'
import * as request from 'supertest'
import { getMyUserInformation, makeGetRequest, readFilePromise, ServerInfo } from '../'
import { VideoPrivacy } from '../../../../shared/models/videos'
2017-09-04 21:21:47 +02:00
type VideoAttributes = {
name?: string
category?: number
licence?: number
language?: number
nsfw?: boolean
description?: string
tags?: string[]
2017-10-24 19:41:30 +02:00
channelId?: number
privacy?: VideoPrivacy
2017-09-04 21:21:47 +02:00
fixture?: string
}
function getVideoCategories (url: string) {
const path = '/api/v1/videos/categories'
2017-12-28 14:29:57 +01:00
return makeGetRequest({
url,
path
})
2017-09-04 21:21:47 +02:00
}
function getVideoLicences (url: string) {
const path = '/api/v1/videos/licences'
2017-12-28 14:29:57 +01:00
return makeGetRequest({
url,
path
})
2017-09-04 21:21:47 +02:00
}
function getVideoLanguages (url: string) {
const path = '/api/v1/videos/languages'
2017-12-28 14:29:57 +01:00
return makeGetRequest({
url,
path
})
2017-09-04 21:21:47 +02:00
}
function getVideoPrivacies (url: string) {
const path = '/api/v1/videos/privacies'
2017-12-28 14:29:57 +01:00
return makeGetRequest({
url,
path
})
}
function getVideo (url: string, id: number | string, expectedStatus = 200) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/videos/' + id
return request(url)
.get(path)
.set('Accept', 'application/json')
.expect(expectedStatus)
}
2017-11-30 09:21:11 +01:00
function viewVideo (url: string, id: number | string, expectedStatus = 204) {
const path = '/api/v1/videos/' + id + '/views'
return request(url)
.post(path)
.set('Accept', 'application/json')
.expect(expectedStatus)
}
function getVideoWithToken (url: string, token: string, id: number | string, expectedStatus = 200) {
const path = '/api/v1/videos/' + id
return request(url)
.get(path)
.set('Authorization', 'Bearer ' + token)
.set('Accept', 'application/json')
.expect(expectedStatus)
2017-09-04 21:21:47 +02:00
}
2017-10-30 10:16:27 +01:00
function getVideoDescription (url: string, descriptionPath: string) {
return request(url)
.get(descriptionPath)
.set('Accept', 'application/json')
.expect(200)
.expect('Content-Type', /json/)
}
2017-09-04 21:21:47 +02:00
function getVideosList (url: string) {
const path = '/api/v1/videos'
return request(url)
.get(path)
.query({ sort: 'name' })
.set('Accept', 'application/json')
.expect(200)
.expect('Content-Type', /json/)
}
function getMyVideos (url: string, accessToken: string, start: number, count: number, sort?: string) {
const path = '/api/v1/users/me/videos'
const req = request(url)
.get(path)
.query({ start: start })
.query({ count: count })
if (sort) req.query({ sort })
return req.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(200)
.expect('Content-Type', /json/)
}
2017-09-04 21:21:47 +02:00
function getVideosListPagination (url: string, start: number, count: number, sort?: string) {
const path = '/api/v1/videos'
const req = request(url)
.get(path)
.query({ start: start })
.query({ count: count })
if (sort) req.query({ sort })
return req.set('Accept', 'application/json')
.expect(200)
.expect('Content-Type', /json/)
}
function getVideosListSort (url: string, sort: string) {
const path = '/api/v1/videos'
return request(url)
.get(path)
.query({ sort: sort })
.set('Accept', 'application/json')
.expect(200)
.expect('Content-Type', /json/)
}
function removeVideo (url: string, token: string, id: number, expectedStatus = 204) {
const path = '/api/v1/videos'
return request(url)
.delete(path + '/' + id)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + token)
.expect(expectedStatus)
}
2017-12-05 17:46:33 +01:00
function searchVideo (url: string, search: string) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/videos'
const req = request(url)
2017-12-05 17:46:33 +01:00
.get(path + '/search')
.query({ search })
.set('Accept', 'application/json')
2017-09-04 21:21:47 +02:00
return req.expect(200)
2017-12-05 17:46:33 +01:00
.expect('Content-Type', /json/)
2017-09-04 21:21:47 +02:00
}
2017-12-05 17:46:33 +01:00
function searchVideoWithPagination (url: string, search: string, start: number, count: number, sort?: string) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/videos'
const req = request(url)
2017-12-05 17:46:33 +01:00
.get(path + '/search')
2017-09-04 21:21:47 +02:00
.query({ start })
2017-12-05 17:46:33 +01:00
.query({ search })
2017-09-04 21:21:47 +02:00
.query({ count })
if (sort) req.query({ sort })
return req.set('Accept', 'application/json')
.expect(200)
.expect('Content-Type', /json/)
}
function searchVideoWithSort (url: string, search: string, sort: string) {
const path = '/api/v1/videos'
return request(url)
2017-12-05 17:46:33 +01:00
.get(path + '/search')
.query({ search })
2017-09-04 21:21:47 +02:00
.query({ sort })
.set('Accept', 'application/json')
.expect(200)
.expect('Content-Type', /json/)
}
async function testVideoImage (url: string, imageName: string, imagePath: string) {
// Don't test images if the node env is not set
// Because we need a special ffmpeg version for this test
if (process.env['NODE_TEST_IMAGE']) {
const res = await request(url)
.get(imagePath)
.expect(200)
const data = await readFilePromise(join(__dirname, '..', '..', 'api', 'fixtures', imageName + '.jpg'))
2017-09-04 21:21:47 +02:00
return data.equals(res.body)
} else {
console.log('Do not test images. Enable it by setting NODE_TEST_IMAGE env variable.')
return true
}
}
2017-12-08 10:08:36 +01:00
async function uploadVideo (url: string, accessToken: string, videoAttributesArg: VideoAttributes, specialStatus = 200) {
const path = '/api/v1/videos/upload'
2017-10-24 19:41:30 +02:00
let defaultChannelId = '1'
try {
const res = await getMyUserInformation(url, accessToken)
defaultChannelId = res.body.videoChannels[0].id
} catch (e) { /* empty */ }
2017-09-04 21:21:47 +02:00
// Default attributes
let attributes = {
name: 'my super video',
category: 5,
licence: 4,
language: 3,
2017-10-24 19:41:30 +02:00
channelId: defaultChannelId,
2017-09-04 21:21:47 +02:00
nsfw: true,
description: 'my super description',
tags: [ 'tag' ],
privacy: VideoPrivacy.PUBLIC,
2017-09-04 21:21:47 +02:00
fixture: 'video_short.webm'
}
attributes = Object.assign(attributes, videoAttributesArg)
const req = request(url)
.post(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.field('name', attributes.name)
.field('category', attributes.category.toString())
.field('licence', attributes.licence.toString())
.field('nsfw', JSON.stringify(attributes.nsfw))
.field('description', attributes.description)
.field('privacy', attributes.privacy.toString())
2017-10-24 19:41:30 +02:00
.field('channelId', attributes.channelId)
2017-09-04 21:21:47 +02:00
2017-09-07 17:58:09 +02:00
if (attributes.language !== undefined) {
req.field('language', attributes.language.toString())
}
2017-09-04 21:21:47 +02:00
for (let i = 0; i < attributes.tags.length; i++) {
req.field('tags[' + i + ']', attributes.tags[i])
}
let filePath = ''
2017-09-04 21:21:47 +02:00
if (isAbsolute(attributes.fixture)) {
filePath = attributes.fixture
2017-09-04 21:21:47 +02:00
} else {
filePath = join(__dirname, '..', '..', 'api', 'fixtures', attributes.fixture)
2017-09-04 21:21:47 +02:00
}
return req.attach('videofile', filePath)
2017-09-04 21:21:47 +02:00
.expect(specialStatus)
}
function updateVideo (url: string, accessToken: string, id: number, attributes: VideoAttributes, specialStatus = 204) {
const path = '/api/v1/videos/' + id
const body = {}
if (attributes.name) body['name'] = attributes.name
if (attributes.category) body['category'] = attributes.category
if (attributes.licence) body['licence'] = attributes.licence
if (attributes.language) body['language'] = attributes.language
if (attributes.nsfw) body['nsfw'] = attributes.nsfw
if (attributes.description) body['description'] = attributes.description
if (attributes.tags) body['tags'] = attributes.tags
if (attributes.privacy) body['privacy'] = attributes.privacy
2017-09-04 21:21:47 +02:00
return request(url)
.put(path)
.send(body)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(specialStatus)
}
function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) {
const path = '/api/v1/videos/' + id + '/rate'
return request(url)
.put(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.send({ rating })
.expect(specialStatus)
}
function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
2017-09-07 15:27:35 +02:00
return new Promise<any>((res, rej) => {
const torrentName = videoUUID + '-' + resolution + '.torrent'
const torrentPath = join(__dirname, '..', '..', '..', '..', 'test' + server.serverNumber, 'torrents', torrentName)
2017-09-07 15:27:35 +02:00
readFile(torrentPath, (err, data) => {
if (err) return rej(err)
return res(parseTorrent(data))
})
})
}
2017-09-04 21:21:47 +02:00
// ---------------------------------------------------------------------------
export {
2017-10-30 10:16:27 +01:00
getVideoDescription,
2017-09-04 21:21:47 +02:00
getVideoCategories,
getVideoLicences,
getVideoPrivacies,
2017-09-04 21:21:47 +02:00
getVideoLanguages,
getMyVideos,
2017-09-04 21:21:47 +02:00
getVideo,
getVideoWithToken,
2017-09-04 21:21:47 +02:00
getVideosList,
getVideosListPagination,
getVideosListSort,
removeVideo,
searchVideo,
searchVideoWithPagination,
searchVideoWithSort,
testVideoImage,
uploadVideo,
updateVideo,
2017-09-07 15:27:35 +02:00
rateVideo,
2017-11-30 09:21:11 +01:00
viewVideo,
2017-09-07 15:27:35 +02:00
parseTorrentVideo
2017-09-04 21:21:47 +02:00
}