1
0
Fork 0

Add comments federation tests

This commit is contained in:
Chocobozzz 2017-12-27 20:03:37 +01:00
parent ae45f988bb
commit d50acfab69
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
10 changed files with 136 additions and 57 deletions

View File

@ -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']

View File

@ -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) {

View File

@ -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))
}) })
} }
} }

View File

@ -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()

View File

@ -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,

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)
}) })

View File

@ -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