Add comments federation tests
This commit is contained in:
parent
ae45f988bb
commit
d50acfab69
|
@ -66,7 +66,7 @@ export class VideoCommentAddComponent extends FormReactive implements OnInit {
|
||||||
|
|
||||||
err => this.notificationsService.error('Error', err.text)
|
err => this.notificationsService.error('Error', err.text)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
isAddButtonDisplayed () {
|
isAddButtonDisplayed () {
|
||||||
return this.form.value['text']
|
return this.form.value['text']
|
||||||
|
|
|
@ -17,12 +17,12 @@ import {
|
||||||
sendUndoLikeToVideoFollowers
|
sendUndoLikeToVideoFollowers
|
||||||
} from './send'
|
} from './send'
|
||||||
|
|
||||||
function fetchRemoteVideoPreview (video: VideoModel) {
|
function fetchRemoteVideoPreview (video: VideoModel, reject: Function) {
|
||||||
// FIXME: use url
|
// FIXME: use url
|
||||||
const host = video.VideoChannel.Account.Actor.Server.host
|
const host = video.VideoChannel.Account.Actor.Server.host
|
||||||
const path = join(STATIC_PATHS.PREVIEWS, video.getPreviewName())
|
const path = join(STATIC_PATHS.PREVIEWS, video.getPreviewName())
|
||||||
|
|
||||||
return request.get(REMOTE_SCHEME.HTTP + '://' + host + path)
|
return request.get(REMOTE_SCHEME.HTTP + '://' + host + path, err => reject(err))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchRemoteVideoDescription (video: VideoModel) {
|
async function fetchRemoteVideoDescription (video: VideoModel) {
|
||||||
|
|
|
@ -52,21 +52,19 @@ class VideosPreviewCache {
|
||||||
|
|
||||||
if (video.isOwned()) throw new Error('Cannot load preview of owned video.')
|
if (video.isOwned()) throw new Error('Cannot load preview of owned video.')
|
||||||
|
|
||||||
const res = await this.saveRemotePreviewAndReturnPath(video)
|
return this.saveRemotePreviewAndReturnPath(video)
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private saveRemotePreviewAndReturnPath (video: VideoModel) {
|
private saveRemotePreviewAndReturnPath (video: VideoModel) {
|
||||||
const req = fetchRemoteVideoPreview(video)
|
|
||||||
|
|
||||||
return new Promise<string>((res, rej) => {
|
return new Promise<string>((res, rej) => {
|
||||||
|
const req = fetchRemoteVideoPreview(video, rej)
|
||||||
const path = join(CACHE.DIRECTORIES.PREVIEWS, video.getPreviewName())
|
const path = join(CACHE.DIRECTORIES.PREVIEWS, video.getPreviewName())
|
||||||
const stream = createWriteStream(path)
|
const stream = createWriteStream(path)
|
||||||
|
|
||||||
req.pipe(stream)
|
req.pipe(stream)
|
||||||
.on('finish', () => res(path))
|
.on('error', (err) => rej(err))
|
||||||
.on('error', (err) => rej(err))
|
.on('finish', () => res(path))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ const videoChannelsUpdateValidator = [
|
||||||
if (!await isVideoChannelExist(req.params.id, res)) return
|
if (!await isVideoChannelExist(req.params.id, res)) return
|
||||||
|
|
||||||
// We need to make additional checks
|
// We need to make additional checks
|
||||||
if (res.locals.videoChannel.isOwned() === false) {
|
if (res.locals.videoChannel.Actor.isOwned() === false) {
|
||||||
return res.status(403)
|
return res.status(403)
|
||||||
.json({ error: 'Cannot update video channel of another server' })
|
.json({ error: 'Cannot update video channel of another server' })
|
||||||
.end()
|
.end()
|
||||||
|
|
|
@ -212,7 +212,7 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
|
||||||
url: this.url,
|
url: this.url,
|
||||||
text: this.text,
|
text: this.text,
|
||||||
threadId: this.originCommentId || this.id,
|
threadId: this.originCommentId || this.id,
|
||||||
inReplyToCommentId: this.inReplyToCommentId,
|
inReplyToCommentId: this.inReplyToCommentId || null,
|
||||||
videoId: this.videoId,
|
videoId: this.videoId,
|
||||||
createdAt: this.createdAt,
|
createdAt: this.createdAt,
|
||||||
updatedAt: this.updatedAt,
|
updatedAt: this.updatedAt,
|
||||||
|
|
|
@ -69,9 +69,9 @@ describe('Test videos API validator', function () {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('When listing author video channels', function () {
|
describe('When listing account video channels', function () {
|
||||||
it('Should fail with bad author', async function () {
|
it('Should fail with bad account', async function () {
|
||||||
const path = '/api/v1/videos/authors/hello/channels'
|
const path = '/api/v1/videos/accounts/hello/channels'
|
||||||
|
|
||||||
await request(server.url)
|
await request(server.url)
|
||||||
.get(path)
|
.get(path)
|
||||||
|
@ -79,8 +79,8 @@ describe('Test videos API validator', function () {
|
||||||
.expect(400)
|
.expect(400)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should fail with a unknown author', async function () {
|
it('Should fail with a unknown account', async function () {
|
||||||
const path = '/api/v1/videos/authors/156/channels'
|
const path = '/api/v1/videos/accounts/156/channels'
|
||||||
|
|
||||||
await request(server.url)
|
await request(server.url)
|
||||||
.get(path)
|
.get(path)
|
||||||
|
|
|
@ -2,17 +2,13 @@
|
||||||
|
|
||||||
import 'mocha'
|
import 'mocha'
|
||||||
import * as request from 'supertest'
|
import * as request from 'supertest'
|
||||||
import {
|
import { flushTests, killallServers, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils'
|
||||||
createUser, flushTests, getUserAccessToken, killallServers, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers,
|
|
||||||
uploadVideo
|
|
||||||
} from '../../utils'
|
|
||||||
import { addVideoCommentThread } from '../../utils/video-comments'
|
import { addVideoCommentThread } from '../../utils/video-comments'
|
||||||
|
|
||||||
describe('Test video comments API validator', function () {
|
describe('Test video comments API validator', function () {
|
||||||
let pathThread: string
|
let pathThread: string
|
||||||
let pathComment: string
|
let pathComment: string
|
||||||
let server: ServerInfo
|
let server: ServerInfo
|
||||||
let accessTokenUser: string
|
|
||||||
let videoUUID: string
|
let videoUUID: string
|
||||||
let commentId: number
|
let commentId: number
|
||||||
|
|
||||||
|
@ -27,16 +23,6 @@ describe('Test video comments API validator', function () {
|
||||||
|
|
||||||
await setAccessTokensToServers([ server ])
|
await setAccessTokensToServers([ server ])
|
||||||
|
|
||||||
{
|
|
||||||
const user = {
|
|
||||||
username: 'fake',
|
|
||||||
password: 'fake_password'
|
|
||||||
}
|
|
||||||
await createUser(server.url, server.accessToken, user.username, user.password)
|
|
||||||
|
|
||||||
accessTokenUser = await getUserAccessToken(server, user)
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const res = await uploadVideo(server.url, server.accessToken, {})
|
const res = await uploadVideo(server.url, server.accessToken, {})
|
||||||
videoUUID = res.body.video.uuid
|
videoUUID = res.body.video.uuid
|
||||||
|
|
|
@ -1,32 +1,18 @@
|
||||||
/* tslint:disable:no-unused-expression */
|
/* tslint:disable:no-unused-expression */
|
||||||
|
|
||||||
import 'mocha'
|
|
||||||
import * as chai from 'chai'
|
import * as chai from 'chai'
|
||||||
|
import 'mocha'
|
||||||
import { join } from 'path'
|
import { join } from 'path'
|
||||||
import * as request from 'supertest'
|
import * as request from 'supertest'
|
||||||
|
import { VideoComment, VideoCommentThreadTree } from '../../../shared/models/videos/video-comment.model'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
dateIsValid,
|
addVideoChannel, dateIsValid, doubleFollow, flushAndRunMultipleServers, flushTests, getUserAccessToken, getVideo,
|
||||||
flushAndRunMultipleServers,
|
getVideoChannelsList, getVideosList, killallServers, rateVideo, removeVideo, ServerInfo, setAccessTokensToServers, testVideoImage,
|
||||||
flushTests,
|
updateVideo, uploadVideo, wait, webtorrentAdd
|
||||||
getVideo,
|
|
||||||
getVideosList,
|
|
||||||
killallServers,
|
|
||||||
rateVideo,
|
|
||||||
removeVideo,
|
|
||||||
ServerInfo,
|
|
||||||
setAccessTokensToServers,
|
|
||||||
testVideoImage,
|
|
||||||
updateVideo,
|
|
||||||
uploadVideo,
|
|
||||||
wait,
|
|
||||||
webtorrentAdd,
|
|
||||||
addVideoChannel,
|
|
||||||
getVideoChannelsList,
|
|
||||||
getUserAccessToken,
|
|
||||||
doubleFollow
|
|
||||||
} from '../utils'
|
} from '../utils'
|
||||||
import { createUser } from '../utils/users'
|
import { createUser } from '../utils/users'
|
||||||
|
import { addVideoCommentReply, addVideoCommentThread, getVideoCommentThreads, getVideoThreadComments } from '../utils/video-comments'
|
||||||
import { viewVideo } from '../utils/videos'
|
import { viewVideo } from '../utils/videos'
|
||||||
|
|
||||||
const expect = chai.expect
|
const expect = chai.expect
|
||||||
|
@ -709,6 +695,115 @@ describe('Test multiple servers', function () {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('Should comment these videos', function () {
|
||||||
|
it('Should add comment (threads and replies)', async function () {
|
||||||
|
this.timeout(25000)
|
||||||
|
|
||||||
|
{
|
||||||
|
const text = 'my super first comment'
|
||||||
|
await addVideoCommentThread(servers[ 0 ].url, servers[ 0 ].accessToken, videoUUID, text)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const text = 'my super second comment'
|
||||||
|
await addVideoCommentThread(servers[ 2 ].url, servers[ 2 ].accessToken, videoUUID, text)
|
||||||
|
}
|
||||||
|
|
||||||
|
await wait(5000)
|
||||||
|
|
||||||
|
{
|
||||||
|
const res = await getVideoCommentThreads(servers[1].url, videoUUID, 0, 5)
|
||||||
|
const threadId = res.body.data.find(c => c.text === 'my super first comment').id
|
||||||
|
|
||||||
|
const text = 'my super answer to thread 1'
|
||||||
|
await addVideoCommentReply(servers[ 1 ].url, servers[ 1 ].accessToken, videoUUID, threadId, text)
|
||||||
|
}
|
||||||
|
|
||||||
|
await wait(5000)
|
||||||
|
|
||||||
|
{
|
||||||
|
const res1 = await getVideoCommentThreads(servers[2].url, videoUUID, 0, 5)
|
||||||
|
const threadId = res1.body.data.find(c => c.text === 'my super first comment').id
|
||||||
|
|
||||||
|
const res2 = await getVideoThreadComments(servers[2].url, videoUUID, threadId)
|
||||||
|
const childCommentId = res2.body.children[0].comment.id
|
||||||
|
|
||||||
|
const text3 = 'my second answer to thread 1'
|
||||||
|
await addVideoCommentReply(servers[ 2 ].url, servers[ 2 ].accessToken, videoUUID, threadId, text3)
|
||||||
|
|
||||||
|
const text2 = 'my super answer to answer of thread 1'
|
||||||
|
await addVideoCommentReply(servers[ 2 ].url, servers[ 2 ].accessToken, videoUUID, childCommentId, text2)
|
||||||
|
}
|
||||||
|
|
||||||
|
await wait(5000)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Should have these threads', async function () {
|
||||||
|
for (const server of servers) {
|
||||||
|
const res = await getVideoCommentThreads(server.url, videoUUID, 0, 5)
|
||||||
|
|
||||||
|
expect(res.body.total).to.equal(2)
|
||||||
|
expect(res.body.data).to.be.an('array')
|
||||||
|
expect(res.body.data).to.have.lengthOf(2)
|
||||||
|
|
||||||
|
{
|
||||||
|
const comment: VideoComment = res.body.data.find(c => c.text === 'my super first comment')
|
||||||
|
expect(comment).to.not.be.undefined
|
||||||
|
expect(comment.inReplyToCommentId).to.be.null
|
||||||
|
expect(comment.account.name).to.equal('root')
|
||||||
|
expect(comment.account.host).to.equal('localhost:9001')
|
||||||
|
expect(comment.totalReplies).to.equal(3)
|
||||||
|
expect(dateIsValid(comment.createdAt as string)).to.be.true
|
||||||
|
expect(dateIsValid(comment.updatedAt as string)).to.be.true
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const comment: VideoComment = res.body.data.find(c => c.text === 'my super second comment')
|
||||||
|
expect(comment).to.not.be.undefined
|
||||||
|
expect(comment.inReplyToCommentId).to.be.null
|
||||||
|
expect(comment.account.name).to.equal('root')
|
||||||
|
expect(comment.account.host).to.equal('localhost:9003')
|
||||||
|
expect(comment.totalReplies).to.equal(0)
|
||||||
|
expect(dateIsValid(comment.createdAt as string)).to.be.true
|
||||||
|
expect(dateIsValid(comment.updatedAt as string)).to.be.true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Should have these comments', async function () {
|
||||||
|
for (const server of servers) {
|
||||||
|
const res1 = await getVideoCommentThreads(server.url, videoUUID, 0, 5)
|
||||||
|
const threadId = res1.body.data.find(c => c.text === 'my super first comment').id
|
||||||
|
|
||||||
|
const res2 = await getVideoThreadComments(server.url, videoUUID, threadId)
|
||||||
|
|
||||||
|
const tree: VideoCommentThreadTree = res2.body
|
||||||
|
expect(tree.comment.text).equal('my super first comment')
|
||||||
|
expect(tree.comment.account.name).equal('root')
|
||||||
|
expect(tree.comment.account.host).equal('localhost:9001')
|
||||||
|
expect(tree.children).to.have.lengthOf(2)
|
||||||
|
|
||||||
|
const firstChild = tree.children[0]
|
||||||
|
expect(firstChild.comment.text).to.equal('my super answer to thread 1')
|
||||||
|
expect(firstChild.comment.account.name).equal('root')
|
||||||
|
expect(firstChild.comment.account.host).equal('localhost:9002')
|
||||||
|
expect(firstChild.children).to.have.lengthOf(1)
|
||||||
|
|
||||||
|
const childOfFirstChild = firstChild.children[0]
|
||||||
|
expect(childOfFirstChild.comment.text).to.equal('my super answer to answer of thread 1')
|
||||||
|
expect(childOfFirstChild.comment.account.name).equal('root')
|
||||||
|
expect(childOfFirstChild.comment.account.host).equal('localhost:9003')
|
||||||
|
expect(childOfFirstChild.children).to.have.lengthOf(0)
|
||||||
|
|
||||||
|
const secondChild = tree.children[1]
|
||||||
|
expect(secondChild.comment.text).to.equal('my second answer to thread 1')
|
||||||
|
expect(secondChild.comment.account.name).equal('root')
|
||||||
|
expect(secondChild.comment.account.host).equal('localhost:9003')
|
||||||
|
expect(secondChild.children).to.have.lengthOf(0)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('With minimum parameters', function () {
|
describe('With minimum parameters', function () {
|
||||||
it('Should upload and propagate the video', async function () {
|
it('Should upload and propagate the video', async function () {
|
||||||
this.timeout(50000)
|
this.timeout(50000)
|
||||||
|
|
|
@ -40,7 +40,7 @@ describe('Test video comments', function () {
|
||||||
const text = 'my super first comment'
|
const text = 'my super first comment'
|
||||||
|
|
||||||
const res = await addVideoCommentThread(server.url, server.accessToken, videoUUID, text)
|
const res = await addVideoCommentThread(server.url, server.accessToken, videoUUID, text)
|
||||||
const comment = res.body
|
const comment = res.body.comment
|
||||||
|
|
||||||
expect(comment.inReplyToCommentId).to.be.null
|
expect(comment.inReplyToCommentId).to.be.null
|
||||||
expect(comment.text).equal('my super first comment')
|
expect(comment.text).equal('my super first comment')
|
||||||
|
@ -133,9 +133,9 @@ describe('Test video comments', function () {
|
||||||
expect(res.body.data).to.have.lengthOf(3)
|
expect(res.body.data).to.have.lengthOf(3)
|
||||||
|
|
||||||
expect(res.body.data[0].text).to.equal('my super first comment')
|
expect(res.body.data[0].text).to.equal('my super first comment')
|
||||||
expect(res.body.data[0].totalReplies).to.equal(2)
|
expect(res.body.data[0].totalReplies).to.equal(3)
|
||||||
expect(res.body.data[1].text).to.equal('super thread 2')
|
expect(res.body.data[1].text).to.equal('super thread 2')
|
||||||
expect(res.body.data[1].totalReplies).to.equal(1)
|
expect(res.body.data[1].totalReplies).to.equal(0)
|
||||||
expect(res.body.data[2].text).to.equal('super thread 3')
|
expect(res.body.data[2].text).to.equal('super thread 3')
|
||||||
expect(res.body.data[2].totalReplies).to.equal(0)
|
expect(res.body.data[2].totalReplies).to.equal(0)
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import * as request from 'supertest'
|
import * as request from 'supertest'
|
||||||
|
|
||||||
function getVideoCommentThreads (url: string, videoId: number, start: number, count: number, sort?: string) {
|
function getVideoCommentThreads (url: string, videoId: number | string, start: number, count: number, sort?: string) {
|
||||||
const path = '/api/v1/videos/' + videoId + '/comment-threads'
|
const path = '/api/v1/videos/' + videoId + '/comment-threads'
|
||||||
|
|
||||||
const req = request(url)
|
const req = request(url)
|
||||||
|
@ -15,7 +15,7 @@ function getVideoCommentThreads (url: string, videoId: number, start: number, co
|
||||||
.expect('Content-Type', /json/)
|
.expect('Content-Type', /json/)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getVideoThreadComments (url: string, videoId: number, threadId: number) {
|
function getVideoThreadComments (url: string, videoId: number | string, threadId: number) {
|
||||||
const path = '/api/v1/videos/' + videoId + '/comment-threads/' + threadId
|
const path = '/api/v1/videos/' + videoId + '/comment-threads/' + threadId
|
||||||
|
|
||||||
return request(url)
|
return request(url)
|
||||||
|
@ -39,7 +39,7 @@ function addVideoCommentThread (url: string, token: string, videoId: number | st
|
||||||
function addVideoCommentReply (
|
function addVideoCommentReply (
|
||||||
url: string,
|
url: string,
|
||||||
token: string,
|
token: string,
|
||||||
videoId: number,
|
videoId: number | string,
|
||||||
inReplyToCommentId: number,
|
inReplyToCommentId: number,
|
||||||
text: string,
|
text: string,
|
||||||
expectedStatus = 200
|
expectedStatus = 200
|
||||||
|
|
Loading…
Reference in New Issue