]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/tests/cli/create-import-video-file-job.ts
Merge branch 'next' into develop
[github/Chocobozzz/PeerTube.git] / server / tests / cli / create-import-video-file-job.ts
CommitLineData
a1587156 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
0138af92
FF
2
3import 'mocha'
4import * as chai from 'chai'
0305db28
JB
5import {
6 areObjectStorageTestsDisabled,
7 cleanupTests,
8 createMultipleServers,
9 doubleFollow,
10 expectStartWith,
11 makeRawRequest,
12 ObjectStorageCommand,
13 PeerTubeServer,
14 setAccessTokensToServers,
15 waitJobs
16} from '@shared/extra-utils'
17import { HttpStatusCode, VideoDetails, VideoFile } from '@shared/models'
0138af92 18
28be8916
C
19const expect = chai.expect
20
21function assertVideoProperties (video: VideoFile, resolution: number, extname: string, size?: number) {
0138af92 22 expect(video).to.have.nested.property('resolution.id', resolution)
0138af92
FF
23 expect(video).to.have.property('torrentUrl').that.includes(`-${resolution}.torrent`)
24 expect(video).to.have.property('fileUrl').that.includes(`.${extname}`)
2451916e 25 expect(video).to.have.property('magnetUri').that.includes(`.${extname}`)
0138af92 26 expect(video).to.have.property('size').that.is.above(0)
28be8916
C
27
28 if (size) expect(video.size).to.equal(size)
0138af92
FF
29}
30
0305db28
JB
31async function checkFiles (video: VideoDetails, objectStorage: boolean) {
32 for (const file of video.files) {
33 if (objectStorage) expectStartWith(file.fileUrl, ObjectStorageCommand.getWebTorrentBaseUrl())
0138af92 34
0305db28
JB
35 await makeRawRequest(file.fileUrl, HttpStatusCode.OK_200)
36 }
37}
38
39function runTests (objectStorage: boolean) {
c186a67f 40 let video1ShortId: string
0138af92
FF
41 let video2UUID: string
42
0305db28
JB
43 let servers: PeerTubeServer[] = []
44
0138af92
FF
45 before(async function () {
46 this.timeout(90000)
0138af92 47
0305db28
JB
48 const config = objectStorage
49 ? ObjectStorageCommand.getDefaultConfig()
50 : {}
51
0138af92 52 // Run server 2 to have transcoding enabled
0305db28 53 servers = await createMultipleServers(2, config)
0138af92
FF
54 await setAccessTokensToServers(servers)
55
56 await doubleFollow(servers[0], servers[1])
57
0305db28
JB
58 if (objectStorage) await ObjectStorageCommand.prepareDefaultBuckets()
59
0138af92 60 // Upload two videos for our needs
d23dd9fb 61 {
c186a67f
C
62 const { shortUUID } = await servers[0].videos.upload({ attributes: { name: 'video1' } })
63 video1ShortId = shortUUID
d23dd9fb
C
64 }
65
66 {
89d241a7 67 const { uuid } = await servers[1].videos.upload({ attributes: { name: 'video2' } })
d23dd9fb
C
68 video2UUID = uuid
69 }
0138af92 70
3cd0734f 71 await waitJobs(servers)
0138af92
FF
72 })
73
74 it('Should run a import job on video 1 with a lower resolution', async function () {
c186a67f 75 const command = `npm run create-import-video-file-job -- -v ${video1ShortId} -i server/tests/fixtures/video_short-480.webm`
89d241a7 76 await servers[0].cli.execWithEnv(command)
0138af92 77
3cd0734f 78 await waitJobs(servers)
0138af92
FF
79
80 for (const server of servers) {
89d241a7 81 const { data: videos } = await server.videos.list()
0138af92
FF
82 expect(videos).to.have.lengthOf(2)
83
c186a67f
C
84 const video = videos.find(({ shortUUID }) => shortUUID === video1ShortId)
85 const videoDetails = await server.videos.get({ id: video.shortUUID })
0138af92 86
d23dd9fb
C
87 expect(videoDetails.files).to.have.lengthOf(2)
88 const [ originalVideo, transcodedVideo ] = videoDetails.files
6ccdf3a2
C
89 assertVideoProperties(originalVideo, 720, 'webm', 218910)
90 assertVideoProperties(transcodedVideo, 480, 'webm', 69217)
0305db28
JB
91
92 await checkFiles(videoDetails, objectStorage)
0138af92
FF
93 }
94 })
95
6ccdf3a2 96 it('Should run a import job on video 2 with the same resolution and a different extension', async function () {
329619b3 97 const command = `npm run create-import-video-file-job -- -v ${video2UUID} -i server/tests/fixtures/video_short.ogv`
89d241a7 98 await servers[1].cli.execWithEnv(command)
0138af92 99
3cd0734f 100 await waitJobs(servers)
0138af92 101
6ccdf3a2 102 for (const server of servers) {
89d241a7 103 const { data: videos } = await server.videos.list()
0138af92
FF
104 expect(videos).to.have.lengthOf(2)
105
0138af92 106 const video = videos.find(({ uuid }) => uuid === video2UUID)
89d241a7 107 const videoDetails = await server.videos.get({ id: video.uuid })
0138af92 108
d23dd9fb
C
109 expect(videoDetails.files).to.have.lengthOf(4)
110 const [ originalVideo, transcodedVideo420, transcodedVideo320, transcodedVideo240 ] = videoDetails.files
28be8916 111 assertVideoProperties(originalVideo, 720, 'ogv', 140849)
0138af92
FF
112 assertVideoProperties(transcodedVideo420, 480, 'mp4')
113 assertVideoProperties(transcodedVideo320, 360, 'mp4')
114 assertVideoProperties(transcodedVideo240, 240, 'mp4')
0305db28
JB
115
116 await checkFiles(videoDetails, objectStorage)
0138af92
FF
117 }
118 })
119
6ccdf3a2 120 it('Should run a import job on video 2 with the same resolution and the same extension', async function () {
c186a67f 121 const command = `npm run create-import-video-file-job -- -v ${video1ShortId} -i server/tests/fixtures/video_short2.webm`
89d241a7 122 await servers[0].cli.execWithEnv(command)
6ccdf3a2 123
3cd0734f 124 await waitJobs(servers)
6ccdf3a2 125
6ccdf3a2 126 for (const server of servers) {
89d241a7 127 const { data: videos } = await server.videos.list()
6ccdf3a2
C
128 expect(videos).to.have.lengthOf(2)
129
c186a67f 130 const video = videos.find(({ shortUUID }) => shortUUID === video1ShortId)
89d241a7 131 const videoDetails = await server.videos.get({ id: video.uuid })
6ccdf3a2 132
d23dd9fb
C
133 expect(videoDetails.files).to.have.lengthOf(2)
134 const [ video720, video480 ] = videoDetails.files
6ccdf3a2
C
135 assertVideoProperties(video720, 720, 'webm', 942961)
136 assertVideoProperties(video480, 480, 'webm', 69217)
0305db28
JB
137
138 await checkFiles(videoDetails, objectStorage)
6ccdf3a2
C
139 }
140 })
141
7c3b7976
C
142 after(async function () {
143 await cleanupTests(servers)
0138af92 144 })
0305db28
JB
145}
146
147describe('Test create import video jobs', function () {
148
149 describe('On filesystem', function () {
150 runTests(false)
151 })
152
153 describe('On object storage', function () {
154 if (areObjectStorageTestsDisabled()) return
155
156 runTests(true)
157 })
0138af92 158})