Add concept of video state, and add ability to wait transcoding before
[oweals/peertube.git] / server / tests / api / videos / video-channels.ts
1 /* tslint:disable:no-unused-expression */
2
3 import * as chai from 'chai'
4 import 'mocha'
5 import { User, Video } from '../../../../shared/index'
6 import { doubleFollow, flushAndRunMultipleServers, getVideoChannelVideos, updateVideo, uploadVideo, wait } from '../../utils'
7 import {
8   addVideoChannel,
9   deleteVideoChannel,
10   flushTests,
11   getAccountVideoChannelsList,
12   getMyUserInformation,
13   getVideoChannel,
14   getVideoChannelsList,
15   killallServers,
16   ServerInfo,
17   setAccessTokensToServers,
18   updateVideoChannel
19 } from '../../utils/index'
20
21 const expect = chai.expect
22
23 describe('Test video channels', function () {
24   let servers: ServerInfo[]
25   let userInfo: User
26   let accountUUID: string
27   let firstVideoChannelId: number
28   let firstVideoChannelUUID: string
29   let secondVideoChannelId: number
30   let secondVideoChannelUUID: string
31   let videoUUID: string
32
33   before(async function () {
34     this.timeout(30000)
35
36     await flushTests()
37
38     servers = await flushAndRunMultipleServers(2)
39
40     await setAccessTokensToServers(servers)
41     await doubleFollow(servers[0], servers[1])
42
43     {
44       const res = await getMyUserInformation(servers[0].url, servers[0].accessToken)
45       const user: User = res.body
46       accountUUID = user.account.uuid
47
48       firstVideoChannelId = user.videoChannels[0].id
49       firstVideoChannelUUID = user.videoChannels[0].uuid
50     }
51
52     await wait(5000)
53   })
54
55   it('Should have one video channel (created with root)', async () => {
56     const res = await getVideoChannelsList(servers[0].url, 0, 2)
57
58     expect(res.body.total).to.equal(1)
59     expect(res.body.data).to.be.an('array')
60     expect(res.body.data).to.have.lengthOf(1)
61   })
62
63   it('Should create another video channel', async function () {
64     this.timeout(10000)
65
66     {
67       const videoChannel = {
68         displayName: 'second video channel',
69         description: 'super video channel description',
70         support: 'super video channel support text'
71       }
72       const res = await addVideoChannel(servers[ 0 ].url, servers[ 0 ].accessToken, videoChannel)
73       secondVideoChannelId = res.body.videoChannel.id
74       secondVideoChannelUUID = res.body.videoChannel.uuid
75     }
76
77     // The channel is 1 is propagated to servers 2
78     {
79       const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'my video name', channelId: secondVideoChannelId })
80       videoUUID = res.body.video.uuid
81     }
82
83     await wait(3000)
84   })
85
86   it('Should have two video channels when getting my information', async () => {
87     const res = await getMyUserInformation(servers[0].url, servers[0].accessToken)
88     userInfo = res.body
89
90     expect(userInfo.videoChannels).to.be.an('array')
91     expect(userInfo.videoChannels).to.have.lengthOf(2)
92
93     const videoChannels = userInfo.videoChannels
94     expect(videoChannels[0].displayName).to.equal('Default root channel')
95     expect(videoChannels[1].displayName).to.equal('second video channel')
96     expect(videoChannels[1].description).to.equal('super video channel description')
97     expect(videoChannels[1].support).to.equal('super video channel support text')
98   })
99
100   it('Should have two video channels when getting account channels on server 1', async function () {
101     const res = await getAccountVideoChannelsList(servers[0].url, userInfo.account.name + '@' + userInfo.account.host)
102     expect(res.body.total).to.equal(2)
103     expect(res.body.data).to.be.an('array')
104     expect(res.body.data).to.have.lengthOf(2)
105
106     const videoChannels = res.body.data
107     expect(videoChannels[0].displayName).to.equal('Default root channel')
108     expect(videoChannels[1].displayName).to.equal('second video channel')
109     expect(videoChannels[1].description).to.equal('super video channel description')
110     expect(videoChannels[1].support).to.equal('super video channel support text')
111   })
112
113   it('Should have one video channel when getting account channels on server 2', async function () {
114     const res = await getAccountVideoChannelsList(servers[1].url, userInfo.account.name + '@' + userInfo.account.host)
115     expect(res.body.total).to.equal(1)
116     expect(res.body.data).to.be.an('array')
117     expect(res.body.data).to.have.lengthOf(1)
118
119     const videoChannels = res.body.data
120     expect(videoChannels[0].displayName).to.equal('second video channel')
121     expect(videoChannels[0].description).to.equal('super video channel description')
122     expect(videoChannels[0].support).to.equal('super video channel support text')
123   })
124
125   it('Should list video channels', async function () {
126     const res = await getVideoChannelsList(servers[0].url, 1, 1, '-name')
127
128     expect(res.body.total).to.equal(2)
129     expect(res.body.data).to.be.an('array')
130     expect(res.body.data).to.have.lengthOf(1)
131     expect(res.body.data[0].displayName).to.equal('Default root channel')
132   })
133
134   it('Should update video channel', async function () {
135     this.timeout(5000)
136
137     const videoChannelAttributes = {
138       displayName: 'video channel updated',
139       description: 'video channel description updated',
140       support: 'video channel support text updated'
141     }
142
143     await updateVideoChannel(servers[0].url, servers[0].accessToken, secondVideoChannelId, videoChannelAttributes)
144
145     await wait(3000)
146   })
147
148   it('Should have video channel updated', async function () {
149     for (const server of servers) {
150       const res = await getVideoChannelsList(server.url, 0, 1, '-name')
151
152       expect(res.body.total).to.equal(2)
153       expect(res.body.data).to.be.an('array')
154       expect(res.body.data).to.have.lengthOf(1)
155       expect(res.body.data[0].displayName).to.equal('video channel updated')
156       expect(res.body.data[0].description).to.equal('video channel description updated')
157       expect(res.body.data[0].support).to.equal('video channel support text updated')
158     }
159   })
160
161   it('Should get video channel', async function () {
162     const res = await getVideoChannel(servers[0].url, secondVideoChannelId)
163
164     const videoChannel = res.body
165     expect(videoChannel.displayName).to.equal('video channel updated')
166     expect(videoChannel.description).to.equal('video channel description updated')
167     expect(videoChannel.support).to.equal('video channel support text updated')
168   })
169
170   it('Should list the second video channel videos', async function () {
171     this.timeout(10000)
172
173     for (const server of servers) {
174       const res1 = await getVideoChannelVideos(server.url, server.accessToken, secondVideoChannelUUID, 0, 5)
175       expect(res1.body.total).to.equal(1)
176       expect(res1.body.data).to.be.an('array')
177       expect(res1.body.data).to.have.lengthOf(1)
178       expect(res1.body.data[0].name).to.equal('my video name')
179     }
180   })
181
182   it('Should change the video channel of a video', async function () {
183     this.timeout(10000)
184
185     await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, { channelId: firstVideoChannelId })
186
187     await wait(5000)
188   })
189
190   it('Should list the first video channel videos', async function () {
191     this.timeout(10000)
192
193     for (const server of servers) {
194       const res1 = await getVideoChannelVideos(server.url, server.accessToken, secondVideoChannelUUID, 0, 5)
195       expect(res1.body.total).to.equal(0)
196
197       const res2 = await getVideoChannelVideos(server.url, server.accessToken, firstVideoChannelUUID, 0, 5)
198       expect(res2.body.total).to.equal(1)
199
200       const videos: Video[] = res2.body.data
201       expect(videos).to.be.an('array')
202       expect(videos).to.have.lengthOf(1)
203       expect(videos[0].name).to.equal('my video name')
204     }
205   })
206
207   it('Should delete video channel', async function () {
208     await deleteVideoChannel(servers[0].url, servers[0].accessToken, secondVideoChannelId)
209   })
210
211   it('Should have video channel deleted', async function () {
212     const res = await getVideoChannelsList(servers[0].url, 0, 10)
213
214     expect(res.body.total).to.equal(1)
215     expect(res.body.data).to.be.an('array')
216     expect(res.body.data).to.have.lengthOf(1)
217     expect(res.body.data[0].displayName).to.equal('Default root channel')
218   })
219
220   after(async function () {
221     killallServers(servers)
222
223     // Keep the logs if the test failed
224     if (this['ok']) {
225       await flushTests()
226     }
227   })
228 })