]>
Commit | Line | Data |
---|---|---|
a1587156 | 1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ |
0f91ae62 | 2 | |
0f91ae62 | 3 | import 'mocha' |
2b02c520 | 4 | import * as chai from 'chai' |
0f91ae62 | 5 | import { |
2b02c520 C |
6 | cleanupTests, |
7 | completeVideoCheck, | |
4c7e60bc | 8 | createMultipleServers, |
2b02c520 | 9 | dateIsValid, |
2b02c520 | 10 | expectAccountFollows, |
c3d29f69 | 11 | FollowsCommand, |
254d3579 | 12 | PeerTubeServer, |
2b02c520 C |
13 | setAccessTokensToServers, |
14 | testCaptionFile, | |
2b02c520 C |
15 | waitJobs |
16 | } from '@shared/extra-utils' | |
12edc149 | 17 | import { Video, VideoPrivacy } from '@shared/models' |
0f91ae62 C |
18 | |
19 | const expect = chai.expect | |
20 | ||
21 | describe('Test follows', function () { | |
254d3579 | 22 | let servers: PeerTubeServer[] = [] |
c3d29f69 | 23 | let followsCommands: FollowsCommand[] |
0f91ae62 C |
24 | |
25 | before(async function () { | |
e212f887 | 26 | this.timeout(30000) |
0f91ae62 | 27 | |
254d3579 | 28 | servers = await createMultipleServers(3) |
89d241a7 | 29 | followsCommands = servers.map(s => s.follows) |
0f91ae62 C |
30 | |
31 | // Get the access tokens | |
32 | await setAccessTokensToServers(servers) | |
33 | }) | |
34 | ||
35 | it('Should not have followers', async function () { | |
36 | for (const server of servers) { | |
89d241a7 | 37 | const body = await server.follows.getFollowers({ start: 0, count: 5, sort: 'createdAt' }) |
c3d29f69 | 38 | expect(body.total).to.equal(0) |
0f91ae62 | 39 | |
c3d29f69 | 40 | const follows = body.data |
0f91ae62 C |
41 | expect(follows).to.be.an('array') |
42 | expect(follows.length).to.equal(0) | |
43 | } | |
44 | }) | |
45 | ||
46 | it('Should not have following', async function () { | |
47 | for (const server of servers) { | |
89d241a7 | 48 | const body = await server.follows.getFollowings({ start: 0, count: 5, sort: 'createdAt' }) |
c3d29f69 | 49 | expect(body.total).to.equal(0) |
0f91ae62 | 50 | |
c3d29f69 | 51 | const follows = body.data |
0f91ae62 C |
52 | expect(follows).to.be.an('array') |
53 | expect(follows.length).to.equal(0) | |
54 | } | |
55 | }) | |
56 | ||
57 | it('Should have server 1 following server 2 and 3', async function () { | |
288178bf | 58 | this.timeout(30000) |
0f91ae62 | 59 | |
c3d29f69 | 60 | await followsCommands[0].follow({ targets: [ servers[1].url, servers[2].url ] }) |
0f91ae62 | 61 | |
3cd0734f | 62 | await waitJobs(servers) |
0f91ae62 C |
63 | }) |
64 | ||
65 | it('Should have 2 followings on server 1', async function () { | |
c3d29f69 C |
66 | const body = await followsCommands[0].getFollowings({ start: 0, count: 1, sort: 'createdAt' }) |
67 | expect(body.total).to.equal(2) | |
0f91ae62 | 68 | |
c3d29f69 | 69 | let follows = body.data |
0f91ae62 C |
70 | expect(follows).to.be.an('array') |
71 | expect(follows.length).to.equal(1) | |
72 | ||
c3d29f69 C |
73 | const body2 = await followsCommands[0].getFollowings({ start: 1, count: 1, sort: 'createdAt' }) |
74 | follows = follows.concat(body2.data) | |
0f91ae62 | 75 | |
7243f84d C |
76 | const server2Follow = follows.find(f => f.following.host === 'localhost:' + servers[1].port) |
77 | const server3Follow = follows.find(f => f.following.host === 'localhost:' + servers[2].port) | |
0f91ae62 C |
78 | |
79 | expect(server2Follow).to.not.be.undefined | |
80 | expect(server3Follow).to.not.be.undefined | |
81 | expect(server2Follow.state).to.equal('accepted') | |
82 | expect(server3Follow.state).to.equal('accepted') | |
0f91ae62 C |
83 | }) |
84 | ||
b8f4167f | 85 | it('Should search/filter followings on server 1', async function () { |
97ecddae C |
86 | const sort = 'createdAt' |
87 | const start = 0 | |
88 | const count = 1 | |
97ecddae | 89 | |
b014b6b9 | 90 | { |
b8f4167f | 91 | const search = ':' + servers[1].port |
b8f4167f | 92 | |
97ecddae | 93 | { |
c3d29f69 C |
94 | const body = await followsCommands[0].getFollowings({ start, count, sort, search }) |
95 | expect(body.total).to.equal(1) | |
97ecddae | 96 | |
c3d29f69 | 97 | const follows = body.data |
97ecddae | 98 | expect(follows.length).to.equal(1) |
a1587156 | 99 | expect(follows[0].following.host).to.equal('localhost:' + servers[1].port) |
97ecddae C |
100 | } |
101 | ||
102 | { | |
c3d29f69 C |
103 | const body = await followsCommands[0].getFollowings({ start, count, sort, search, state: 'accepted' }) |
104 | expect(body.total).to.equal(1) | |
105 | expect(body.data).to.have.lengthOf(1) | |
97ecddae C |
106 | } |
107 | ||
108 | { | |
c3d29f69 C |
109 | const body = await followsCommands[0].getFollowings({ start, count, sort, search, state: 'accepted', actorType: 'Person' }) |
110 | expect(body.total).to.equal(0) | |
111 | expect(body.data).to.have.lengthOf(0) | |
97ecddae C |
112 | } |
113 | ||
114 | { | |
c3d29f69 | 115 | const body = await followsCommands[0].getFollowings({ |
97ecddae C |
116 | start, |
117 | count, | |
118 | sort, | |
119 | search, | |
120 | state: 'accepted', | |
121 | actorType: 'Application' | |
122 | }) | |
c3d29f69 C |
123 | expect(body.total).to.equal(1) |
124 | expect(body.data).to.have.lengthOf(1) | |
97ecddae C |
125 | } |
126 | ||
127 | { | |
c3d29f69 C |
128 | const body = await followsCommands[0].getFollowings({ start, count, sort, search, state: 'pending' }) |
129 | expect(body.total).to.equal(0) | |
130 | expect(body.data).to.have.lengthOf(0) | |
97ecddae | 131 | } |
b014b6b9 C |
132 | } |
133 | ||
134 | { | |
c3d29f69 C |
135 | const body = await followsCommands[0].getFollowings({ start, count, sort, search: 'bla' }) |
136 | expect(body.total).to.equal(0) | |
b014b6b9 | 137 | |
c3d29f69 | 138 | expect(body.data.length).to.equal(0) |
b014b6b9 C |
139 | } |
140 | }) | |
141 | ||
142 | it('Should have 0 followings on server 2 and 3', async function () { | |
0f91ae62 | 143 | for (const server of [ servers[1], servers[2] ]) { |
89d241a7 | 144 | const body = await server.follows.getFollowings({ start: 0, count: 5, sort: 'createdAt' }) |
c3d29f69 | 145 | expect(body.total).to.equal(0) |
0f91ae62 | 146 | |
c3d29f69 | 147 | const follows = body.data |
0f91ae62 C |
148 | expect(follows).to.be.an('array') |
149 | expect(follows.length).to.equal(0) | |
150 | } | |
151 | }) | |
152 | ||
153 | it('Should have 1 followers on server 2 and 3', async function () { | |
154 | for (const server of [ servers[1], servers[2] ]) { | |
89d241a7 | 155 | const body = await server.follows.getFollowers({ start: 0, count: 1, sort: 'createdAt' }) |
c3d29f69 | 156 | expect(body.total).to.equal(1) |
0f91ae62 | 157 | |
c3d29f69 | 158 | const follows = body.data |
0f91ae62 C |
159 | expect(follows).to.be.an('array') |
160 | expect(follows.length).to.equal(1) | |
7243f84d | 161 | expect(follows[0].follower.host).to.equal('localhost:' + servers[0].port) |
0f91ae62 C |
162 | } |
163 | }) | |
164 | ||
b8f4167f | 165 | it('Should search/filter followers on server 2', async function () { |
97ecddae C |
166 | const start = 0 |
167 | const count = 5 | |
168 | const sort = 'createdAt' | |
169 | ||
b014b6b9 | 170 | { |
b8f4167f | 171 | const search = servers[0].port + '' |
b8f4167f | 172 | |
97ecddae | 173 | { |
c3d29f69 C |
174 | const body = await followsCommands[2].getFollowers({ start, count, sort, search }) |
175 | expect(body.total).to.equal(1) | |
97ecddae | 176 | |
c3d29f69 | 177 | const follows = body.data |
97ecddae | 178 | expect(follows.length).to.equal(1) |
a1587156 | 179 | expect(follows[0].following.host).to.equal('localhost:' + servers[2].port) |
97ecddae C |
180 | } |
181 | ||
182 | { | |
c3d29f69 C |
183 | const body = await followsCommands[2].getFollowers({ start, count, sort, search, state: 'accepted' }) |
184 | expect(body.total).to.equal(1) | |
185 | expect(body.data).to.have.lengthOf(1) | |
97ecddae C |
186 | } |
187 | ||
188 | { | |
c3d29f69 C |
189 | const body = await followsCommands[2].getFollowers({ start, count, sort, search, state: 'accepted', actorType: 'Person' }) |
190 | expect(body.total).to.equal(0) | |
191 | expect(body.data).to.have.lengthOf(0) | |
97ecddae C |
192 | } |
193 | ||
194 | { | |
c3d29f69 | 195 | const body = await followsCommands[2].getFollowers({ |
97ecddae C |
196 | start, |
197 | count, | |
198 | sort, | |
199 | search, | |
200 | state: 'accepted', | |
201 | actorType: 'Application' | |
202 | }) | |
c3d29f69 C |
203 | expect(body.total).to.equal(1) |
204 | expect(body.data).to.have.lengthOf(1) | |
97ecddae C |
205 | } |
206 | ||
207 | { | |
c3d29f69 C |
208 | const body = await followsCommands[2].getFollowers({ start, count, sort, search, state: 'pending' }) |
209 | expect(body.total).to.equal(0) | |
210 | expect(body.data).to.have.lengthOf(0) | |
97ecddae | 211 | } |
b014b6b9 C |
212 | } |
213 | ||
214 | { | |
c3d29f69 C |
215 | const body = await followsCommands[2].getFollowers({ start, count, sort, search: 'bla' }) |
216 | expect(body.total).to.equal(0) | |
b014b6b9 | 217 | |
c3d29f69 | 218 | const follows = body.data |
b014b6b9 C |
219 | expect(follows.length).to.equal(0) |
220 | } | |
221 | }) | |
222 | ||
0f91ae62 | 223 | it('Should have 0 followers on server 1', async function () { |
c3d29f69 C |
224 | const body = await followsCommands[0].getFollowers({ start: 0, count: 5, sort: 'createdAt' }) |
225 | expect(body.total).to.equal(0) | |
0f91ae62 | 226 | |
c3d29f69 | 227 | const follows = body.data |
0f91ae62 C |
228 | expect(follows).to.be.an('array') |
229 | expect(follows.length).to.equal(0) | |
230 | }) | |
231 | ||
38768a36 | 232 | it('Should have the correct follows counts', async function () { |
9fff08cf C |
233 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 2 }) |
234 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[1].port, followers: 1, following: 0 }) | |
235 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[2].port, followers: 1, following: 0 }) | |
32b2b43c C |
236 | |
237 | // Server 2 and 3 does not know server 1 follow another server (there was not a refresh) | |
9fff08cf C |
238 | await expectAccountFollows({ server: servers[1], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 1 }) |
239 | await expectAccountFollows({ server: servers[1], handle: 'peertube@localhost:' + servers[1].port, followers: 1, following: 0 }) | |
32b2b43c | 240 | |
9fff08cf C |
241 | await expectAccountFollows({ server: servers[2], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 1 }) |
242 | await expectAccountFollows({ server: servers[2], handle: 'peertube@localhost:' + servers[2].port, followers: 1, following: 0 }) | |
32b2b43c C |
243 | }) |
244 | ||
0f91ae62 C |
245 | it('Should unfollow server 3 on server 1', async function () { |
246 | this.timeout(5000) | |
247 | ||
c3d29f69 | 248 | await followsCommands[0].unfollow({ target: servers[2] }) |
0f91ae62 | 249 | |
3cd0734f | 250 | await waitJobs(servers) |
0f91ae62 C |
251 | }) |
252 | ||
253 | it('Should not follow server 3 on server 1 anymore', async function () { | |
c3d29f69 C |
254 | const body = await followsCommands[0].getFollowings({ start: 0, count: 2, sort: 'createdAt' }) |
255 | expect(body.total).to.equal(1) | |
0f91ae62 | 256 | |
c3d29f69 | 257 | const follows = body.data |
0f91ae62 C |
258 | expect(follows).to.be.an('array') |
259 | expect(follows.length).to.equal(1) | |
260 | ||
7243f84d | 261 | expect(follows[0].following.host).to.equal('localhost:' + servers[1].port) |
0f91ae62 C |
262 | }) |
263 | ||
264 | it('Should not have server 1 as follower on server 3 anymore', async function () { | |
c3d29f69 C |
265 | const body = await followsCommands[2].getFollowers({ start: 0, count: 1, sort: 'createdAt' }) |
266 | expect(body.total).to.equal(0) | |
0f91ae62 | 267 | |
c3d29f69 | 268 | const follows = body.data |
0f91ae62 C |
269 | expect(follows).to.be.an('array') |
270 | expect(follows.length).to.equal(0) | |
271 | }) | |
272 | ||
38768a36 | 273 | it('Should have the correct follows counts 2', async function () { |
9fff08cf C |
274 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 1 }) |
275 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[1].port, followers: 1, following: 0 }) | |
32b2b43c | 276 | |
9fff08cf C |
277 | await expectAccountFollows({ server: servers[1], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 1 }) |
278 | await expectAccountFollows({ server: servers[1], handle: 'peertube@localhost:' + servers[1].port, followers: 1, following: 0 }) | |
32b2b43c | 279 | |
9fff08cf C |
280 | await expectAccountFollows({ server: servers[2], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 0 }) |
281 | await expectAccountFollows({ server: servers[2], handle: 'peertube@localhost:' + servers[2].port, followers: 0, following: 0 }) | |
32b2b43c C |
282 | }) |
283 | ||
2bb0f9d5 | 284 | it('Should upload a video on server 2 and 3 and propagate only the video of server 2', async function () { |
e0783718 | 285 | this.timeout(60000) |
0f91ae62 | 286 | |
89d241a7 C |
287 | await servers[1].videos.upload({ attributes: { name: 'server2' } }) |
288 | await servers[2].videos.upload({ attributes: { name: 'server3' } }) | |
0f91ae62 | 289 | |
3cd0734f | 290 | await waitJobs(servers) |
0f91ae62 | 291 | |
d23dd9fb | 292 | { |
89d241a7 | 293 | const { total, data } = await servers[0].videos.list() |
d23dd9fb C |
294 | expect(total).to.equal(1) |
295 | expect(data[0].name).to.equal('server2') | |
296 | } | |
0f91ae62 | 297 | |
d23dd9fb | 298 | { |
89d241a7 | 299 | const { total, data } = await servers[1].videos.list() |
d23dd9fb C |
300 | expect(total).to.equal(1) |
301 | expect(data[0].name).to.equal('server2') | |
302 | } | |
0f91ae62 | 303 | |
d23dd9fb | 304 | { |
89d241a7 | 305 | const { total, data } = await servers[2].videos.list() |
d23dd9fb C |
306 | expect(total).to.equal(1) |
307 | expect(data[0].name).to.equal('server3') | |
308 | } | |
0f91ae62 C |
309 | }) |
310 | ||
9b39106d | 311 | describe('Should propagate data on a new following', function () { |
b1f5b93e | 312 | let video4: Video |
d8553faa | 313 | |
b1f5b93e | 314 | before(async function () { |
8b381422 | 315 | this.timeout(50000) |
c46edbc2 | 316 | |
b1f5b93e C |
317 | const video4Attributes = { |
318 | name: 'server3-4', | |
319 | category: 2, | |
320 | nsfw: true, | |
321 | licence: 6, | |
322 | tags: [ 'tag1', 'tag2', 'tag3' ] | |
323 | } | |
d8553faa | 324 | |
89d241a7 C |
325 | await servers[2].videos.upload({ attributes: { name: 'server3-2' } }) |
326 | await servers[2].videos.upload({ attributes: { name: 'server3-3' } }) | |
327 | await servers[2].videos.upload({ attributes: video4Attributes }) | |
328 | await servers[2].videos.upload({ attributes: { name: 'server3-5' } }) | |
329 | await servers[2].videos.upload({ attributes: { name: 'server3-6' } }) | |
d8553faa | 330 | |
db799da3 | 331 | { |
89d241a7 | 332 | const userAccessToken = await servers[2].users.generateUserAndToken('captain') |
db799da3 | 333 | |
89d241a7 | 334 | const { data } = await servers[2].videos.list() |
d23dd9fb | 335 | video4 = data.find(v => v.name === 'server3-4') |
db799da3 | 336 | |
b1f5b93e | 337 | { |
89d241a7 C |
338 | await servers[2].videos.rate({ id: video4.id, rating: 'like' }) |
339 | await servers[2].videos.rate({ token: userAccessToken, id: video4.id, rating: 'dislike' }) | |
b1f5b93e | 340 | } |
db799da3 | 341 | |
b1f5b93e | 342 | { |
c883db6d C |
343 | { |
344 | const text = 'my super first comment' | |
89d241a7 | 345 | const created = await servers[2].comments.createThread({ videoId: video4.id, text }) |
12edc149 | 346 | const threadId = created.id |
c883db6d C |
347 | |
348 | const text1 = 'my super answer to thread 1' | |
89d241a7 | 349 | const childComment = await servers[2].comments.addReply({ videoId: video4.id, toCommentId: threadId, text: text1 }) |
c883db6d C |
350 | |
351 | const text2 = 'my super answer to answer of thread 1' | |
89d241a7 | 352 | await servers[2].comments.addReply({ videoId: video4.id, toCommentId: childComment.id, text: text2 }) |
c883db6d C |
353 | |
354 | const text3 = 'my second answer to thread 1' | |
89d241a7 | 355 | await servers[2].comments.addReply({ videoId: video4.id, toCommentId: threadId, text: text3 }) |
c883db6d C |
356 | } |
357 | ||
358 | { | |
359 | const text = 'will be deleted' | |
89d241a7 | 360 | const created = await servers[2].comments.createThread({ videoId: video4.id, text }) |
12edc149 | 361 | const threadId = created.id |
c883db6d C |
362 | |
363 | const text1 = 'answer to deleted' | |
89d241a7 | 364 | await servers[2].comments.addReply({ videoId: video4.id, toCommentId: threadId, text: text1 }) |
db799da3 | 365 | |
c883db6d | 366 | const text2 = 'will also be deleted' |
89d241a7 | 367 | const childComment = await servers[2].comments.addReply({ videoId: video4.id, toCommentId: threadId, text: text2 }) |
d8553faa | 368 | |
c883db6d | 369 | const text3 = 'my second answer to deleted' |
89d241a7 | 370 | await servers[2].comments.addReply({ videoId: video4.id, toCommentId: childComment.id, text: text3 }) |
c46edbc2 | 371 | |
89d241a7 C |
372 | await servers[2].comments.delete({ videoId: video4.id, commentId: threadId }) |
373 | await servers[2].comments.delete({ videoId: video4.id, commentId: childComment.id }) | |
c883db6d | 374 | } |
b1f5b93e | 375 | } |
40e87e9e C |
376 | |
377 | { | |
89d241a7 | 378 | await servers[2].captions.createVideoCaption({ |
40e87e9e C |
379 | language: 'ar', |
380 | videoId: video4.id, | |
381 | fixture: 'subtitle-good2.vtt' | |
382 | }) | |
383 | } | |
b1f5b93e | 384 | } |
c46edbc2 | 385 | |
3cd0734f | 386 | await waitJobs(servers) |
b1f5b93e C |
387 | |
388 | // Server 1 follows server 3 | |
c3d29f69 | 389 | await followsCommands[0].follow({ targets: [ servers[2].url ] }) |
b1f5b93e | 390 | |
3cd0734f | 391 | await waitJobs(servers) |
b1f5b93e C |
392 | }) |
393 | ||
38768a36 | 394 | it('Should have the correct follows counts 3', async function () { |
9fff08cf C |
395 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 2 }) |
396 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[1].port, followers: 1, following: 0 }) | |
397 | await expectAccountFollows({ server: servers[0], handle: 'peertube@localhost:' + servers[2].port, followers: 1, following: 0 }) | |
32b2b43c | 398 | |
9fff08cf C |
399 | await expectAccountFollows({ server: servers[1], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 1 }) |
400 | await expectAccountFollows({ server: servers[1], handle: 'peertube@localhost:' + servers[1].port, followers: 1, following: 0 }) | |
32b2b43c | 401 | |
9fff08cf C |
402 | await expectAccountFollows({ server: servers[2], handle: 'peertube@localhost:' + servers[0].port, followers: 0, following: 1 }) |
403 | await expectAccountFollows({ server: servers[2], handle: 'peertube@localhost:' + servers[2].port, followers: 1, following: 0 }) | |
32b2b43c C |
404 | }) |
405 | ||
40e87e9e | 406 | it('Should have propagated videos', async function () { |
89d241a7 | 407 | const { total, data } = await servers[0].videos.list() |
d23dd9fb | 408 | expect(total).to.equal(7) |
b1f5b93e | 409 | |
d23dd9fb C |
410 | const video2 = data.find(v => v.name === 'server3-2') |
411 | video4 = data.find(v => v.name === 'server3-4') | |
412 | const video6 = data.find(v => v.name === 'server3-6') | |
b1f5b93e C |
413 | |
414 | expect(video2).to.not.be.undefined | |
415 | expect(video4).to.not.be.undefined | |
416 | expect(video6).to.not.be.undefined | |
417 | ||
418 | const isLocal = false | |
419 | const checkAttributes = { | |
420 | name: 'server3-4', | |
421 | category: 2, | |
422 | licence: 6, | |
9d3ef9fe | 423 | language: 'zh', |
b1f5b93e C |
424 | nsfw: true, |
425 | description: 'my super description', | |
2422c46b | 426 | support: 'my super support text', |
b64c950a C |
427 | account: { |
428 | name: 'root', | |
7243f84d | 429 | host: 'localhost:' + servers[2].port |
b64c950a | 430 | }, |
b1f5b93e | 431 | isLocal, |
47564bbe | 432 | commentsEnabled: true, |
7f2cfe3a | 433 | downloadEnabled: true, |
b1f5b93e C |
434 | duration: 5, |
435 | tags: [ 'tag1', 'tag2', 'tag3' ], | |
436 | privacy: VideoPrivacy.PUBLIC, | |
437 | likes: 1, | |
438 | dislikes: 1, | |
439 | channel: { | |
f6eebcb3 C |
440 | displayName: 'Main root channel', |
441 | name: 'root_channel', | |
b1f5b93e C |
442 | description: '', |
443 | isLocal | |
444 | }, | |
445 | fixture: 'video_short.webm', | |
446 | files: [ | |
447 | { | |
448 | resolution: 720, | |
449 | size: 218910 | |
450 | } | |
451 | ] | |
452 | } | |
d23dd9fb | 453 | await completeVideoCheck(servers[0], video4, checkAttributes) |
b1f5b93e | 454 | }) |
c46edbc2 | 455 | |
40e87e9e | 456 | it('Should have propagated comments', async function () { |
89d241a7 | 457 | const { total, data } = await servers[0].comments.listThreads({ videoId: video4.id, sort: 'createdAt' }) |
db799da3 | 458 | |
12edc149 C |
459 | expect(total).to.equal(2) |
460 | expect(data).to.be.an('array') | |
461 | expect(data).to.have.lengthOf(2) | |
c883db6d C |
462 | |
463 | { | |
12edc149 | 464 | const comment = data[0] |
c883db6d C |
465 | expect(comment.inReplyToCommentId).to.be.null |
466 | expect(comment.text).equal('my super first comment') | |
467 | expect(comment.videoId).to.equal(video4.id) | |
468 | expect(comment.id).to.equal(comment.threadId) | |
469 | expect(comment.account.name).to.equal('root') | |
a1587156 | 470 | expect(comment.account.host).to.equal('localhost:' + servers[2].port) |
c883db6d C |
471 | expect(comment.totalReplies).to.equal(3) |
472 | expect(dateIsValid(comment.createdAt as string)).to.be.true | |
473 | expect(dateIsValid(comment.updatedAt as string)).to.be.true | |
474 | ||
475 | const threadId = comment.threadId | |
476 | ||
89d241a7 | 477 | const tree = await servers[0].comments.getThread({ videoId: video4.id, threadId }) |
c883db6d C |
478 | expect(tree.comment.text).equal('my super first comment') |
479 | expect(tree.children).to.have.lengthOf(2) | |
480 | ||
a1587156 | 481 | const firstChild = tree.children[0] |
c883db6d C |
482 | expect(firstChild.comment.text).to.equal('my super answer to thread 1') |
483 | expect(firstChild.children).to.have.lengthOf(1) | |
484 | ||
a1587156 | 485 | const childOfFirstChild = firstChild.children[0] |
c883db6d C |
486 | expect(childOfFirstChild.comment.text).to.equal('my super answer to answer of thread 1') |
487 | expect(childOfFirstChild.children).to.have.lengthOf(0) | |
488 | ||
a1587156 | 489 | const secondChild = tree.children[1] |
c883db6d C |
490 | expect(secondChild.comment.text).to.equal('my second answer to thread 1') |
491 | expect(secondChild.children).to.have.lengthOf(0) | |
492 | } | |
493 | ||
494 | { | |
12edc149 | 495 | const deletedComment = data[1] |
c883db6d C |
496 | expect(deletedComment).to.not.be.undefined |
497 | expect(deletedComment.isDeleted).to.be.true | |
498 | expect(deletedComment.deletedAt).to.not.be.null | |
499 | expect(deletedComment.text).to.equal('') | |
500 | expect(deletedComment.inReplyToCommentId).to.be.null | |
501 | expect(deletedComment.account).to.be.null | |
9de33c6b | 502 | expect(deletedComment.totalReplies).to.equal(2) |
c883db6d C |
503 | expect(dateIsValid(deletedComment.deletedAt as string)).to.be.true |
504 | ||
89d241a7 | 505 | const tree = await servers[0].comments.getThread({ videoId: video4.id, threadId: deletedComment.threadId }) |
c883db6d C |
506 | const [ commentRoot, deletedChildRoot ] = tree.children |
507 | ||
508 | expect(deletedChildRoot).to.not.be.undefined | |
509 | expect(deletedChildRoot.comment.isDeleted).to.be.true | |
510 | expect(deletedChildRoot.comment.deletedAt).to.not.be.null | |
511 | expect(deletedChildRoot.comment.text).to.equal('') | |
512 | expect(deletedChildRoot.comment.inReplyToCommentId).to.equal(deletedComment.id) | |
513 | expect(deletedChildRoot.comment.account).to.be.null | |
514 | expect(deletedChildRoot.children).to.have.lengthOf(1) | |
515 | ||
516 | const answerToDeletedChild = deletedChildRoot.children[0] | |
517 | expect(answerToDeletedChild.comment).to.not.be.undefined | |
518 | expect(answerToDeletedChild.comment.inReplyToCommentId).to.equal(deletedChildRoot.comment.id) | |
519 | expect(answerToDeletedChild.comment.text).to.equal('my second answer to deleted') | |
520 | expect(answerToDeletedChild.comment.account.name).to.equal('root') | |
521 | ||
522 | expect(commentRoot.comment).to.not.be.undefined | |
523 | expect(commentRoot.comment.inReplyToCommentId).to.equal(deletedComment.id) | |
524 | expect(commentRoot.comment.text).to.equal('answer to deleted') | |
525 | expect(commentRoot.comment.account.name).to.equal('root') | |
526 | } | |
b1f5b93e | 527 | }) |
f05a1c30 | 528 | |
40e87e9e | 529 | it('Should have propagated captions', async function () { |
89d241a7 | 530 | const body = await servers[0].captions.listVideoCaptions({ videoId: video4.id }) |
a2470c9f C |
531 | expect(body.total).to.equal(1) |
532 | expect(body.data).to.have.lengthOf(1) | |
40e87e9e | 533 | |
a2470c9f | 534 | const caption1 = body.data[0] |
40e87e9e C |
535 | expect(caption1.language.id).to.equal('ar') |
536 | expect(caption1.language.label).to.equal('Arabic') | |
a35a2279 | 537 | expect(caption1.captionPath).to.match(new RegExp('^/lazy-static/video-captions/.+-ar.vtt$')) |
40e87e9e C |
538 | await testCaptionFile(servers[0].url, caption1.captionPath, 'Subtitle good 2.') |
539 | }) | |
540 | ||
f05a1c30 C |
541 | it('Should unfollow server 3 on server 1 and does not list server 3 videos', async function () { |
542 | this.timeout(5000) | |
543 | ||
c3d29f69 | 544 | await followsCommands[0].unfollow({ target: servers[2] }) |
f05a1c30 | 545 | |
3cd0734f | 546 | await waitJobs(servers) |
f05a1c30 | 547 | |
89d241a7 | 548 | const { total } = await servers[0].videos.list() |
d23dd9fb | 549 | expect(total).to.equal(1) |
f05a1c30 C |
550 | }) |
551 | ||
c46edbc2 C |
552 | }) |
553 | ||
7c3b7976 C |
554 | after(async function () { |
555 | await cleanupTests(servers) | |
0f91ae62 C |
556 | }) |
557 | }) |