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