From 444c0a0e017824fb4ce526281a22c4abe0a13c50 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 14 May 2020 16:56:15 +0200 Subject: Add ability to bulk delete comments --- server/tests/api/check-params/bulk.ts | 88 +++++++++++++++ server/tests/api/check-params/index.ts | 1 + server/tests/api/server/bulk.ts | 198 +++++++++++++++++++++++++++++++++ 3 files changed, 287 insertions(+) create mode 100644 server/tests/api/check-params/bulk.ts create mode 100644 server/tests/api/server/bulk.ts (limited to 'server/tests/api') diff --git a/server/tests/api/check-params/bulk.ts b/server/tests/api/check-params/bulk.ts new file mode 100644 index 000000000..432858b33 --- /dev/null +++ b/server/tests/api/check-params/bulk.ts @@ -0,0 +1,88 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import 'mocha' +import { + cleanupTests, + createUser, + flushAndRunServer, + ServerInfo, + setAccessTokensToServers, + userLogin +} from '../../../../shared/extra-utils' +import { makePostBodyRequest } from '../../../../shared/extra-utils/requests/requests' + +describe('Test bulk API validators', function () { + let server: ServerInfo + let userAccessToken: string + + // --------------------------------------------------------------- + + before(async function () { + this.timeout(120000) + + server = await flushAndRunServer(1) + await setAccessTokensToServers([ server ]) + + const user = { username: 'user1', password: 'password' } + await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) + + userAccessToken = await userLogin(server, user) + }) + + describe('When removing comments of', function () { + const path = '/api/v1/bulk/remove-comments-of' + + it('Should fail with an unauthenticated user', async function () { + await makePostBodyRequest({ + url: server.url, + path, + fields: { accountName: 'user1', scope: 'my-videos' }, + statusCodeExpected: 401 + }) + }) + + it('Should fail with an unknown account', async function () { + await makePostBodyRequest({ + url: server.url, + token: server.accessToken, + path, + fields: { accountName: 'user2', scope: 'my-videos' }, + statusCodeExpected: 404 + }) + }) + + it('Should fail with an invalid scope', async function () { + await makePostBodyRequest({ + url: server.url, + token: server.accessToken, + path, + fields: { accountName: 'user1', scope: 'my-videoss' }, + statusCodeExpected: 400 + }) + }) + + it('Should fail to delete comments of the instance without the appropriate rights', async function () { + await makePostBodyRequest({ + url: server.url, + token: userAccessToken, + path, + fields: { accountName: 'user1', scope: 'instance' }, + statusCodeExpected: 403 + }) + }) + + it('Should succeed with the correct params', async function () { + await makePostBodyRequest({ + url: server.url, + token: server.accessToken, + path, + fields: { accountName: 'user1', scope: 'instance' }, + statusCodeExpected: 204 + }) + }) + }) + + after(async function () { + await cleanupTests([ server ]) + }) +}) diff --git a/server/tests/api/check-params/index.ts b/server/tests/api/check-params/index.ts index ef152f55c..93ffd98b1 100644 --- a/server/tests/api/check-params/index.ts +++ b/server/tests/api/check-params/index.ts @@ -1,5 +1,6 @@ import './accounts' import './blocklist' +import './bulk' import './config' import './contact-form' import './debug' diff --git a/server/tests/api/server/bulk.ts b/server/tests/api/server/bulk.ts new file mode 100644 index 000000000..63321d4bb --- /dev/null +++ b/server/tests/api/server/bulk.ts @@ -0,0 +1,198 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import 'mocha' +import * as chai from 'chai' +import { VideoComment } from '@shared/models/videos/video-comment.model' +import { + addVideoCommentThread, + bulkRemoveCommentsOf, + cleanupTests, + createUser, + flushAndRunMultipleServers, + getVideoCommentThreads, + getVideosList, + ServerInfo, + setAccessTokensToServers, + uploadVideo, + userLogin, + waitJobs, + addVideoCommentReply +} from '../../../../shared/extra-utils/index' +import { doubleFollow } from '../../../../shared/extra-utils/server/follows' +import { Video } from '@shared/models' + +const expect = chai.expect + +describe('Test bulk actions', function () { + const commentsUser3: { videoId: number, commentId: number }[] = [] + + let servers: ServerInfo[] = [] + let user1AccessToken: string + let user2AccessToken: string + let user3AccessToken: string + + before(async function () { + this.timeout(30000) + + servers = await flushAndRunMultipleServers(2) + + // Get the access tokens + await setAccessTokensToServers(servers) + + { + const user = { username: 'user1', password: 'password' } + await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) + + user1AccessToken = await userLogin(servers[0], user) + } + + { + const user = { username: 'user2', password: 'password' } + await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) + + user2AccessToken = await userLogin(servers[0], user) + } + + { + const user = { username: 'user3', password: 'password' } + await createUser({ url: servers[1].url, accessToken: servers[1].accessToken, username: user.username, password: user.password }) + + user3AccessToken = await userLogin(servers[1], user) + } + + await doubleFollow(servers[0], servers[1]) + }) + + describe('Bulk remove comments', function () { + async function checkInstanceCommentsRemoved () { + { + const res = await getVideosList(servers[0].url) + const videos = res.body.data as Video[] + + // Server 1 should not have these comments anymore + for (const video of videos) { + const resThreads = await getVideoCommentThreads(servers[0].url, video.id, 0, 10) + const comments = resThreads.body.data as VideoComment[] + const comment = comments.find(c => c.text === 'comment by user 3') + + expect(comment).to.not.exist + } + } + + { + const res = await getVideosList(servers[1].url) + const videos = res.body.data as Video[] + + // Server 1 should not have these comments on videos of server 1 + for (const video of videos) { + const resThreads = await getVideoCommentThreads(servers[1].url, video.id, 0, 10) + const comments = resThreads.body.data as VideoComment[] + const comment = comments.find(c => c.text === 'comment by user 3') + + if (video.account.host === 'localhost:' + servers[0].port) { + expect(comment).to.not.exist + } else { + expect(comment).to.exist + } + } + } + } + + before(async function () { + this.timeout(60000) + + await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video 1 server 1' }) + await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video 2 server 1' }) + await uploadVideo(servers[0].url, user1AccessToken, { name: 'video 3 server 1' }) + + await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video 1 server 2' }) + + await waitJobs(servers) + + { + const res = await getVideosList(servers[0].url) + for (const video of res.body.data) { + await addVideoCommentThread(servers[0].url, servers[0].accessToken, video.id, 'comment by root server 1') + await addVideoCommentThread(servers[0].url, user1AccessToken, video.id, 'comment by user 1') + await addVideoCommentThread(servers[0].url, user2AccessToken, video.id, 'comment by user 2') + } + } + + { + const res = await getVideosList(servers[1].url) + for (const video of res.body.data) { + await addVideoCommentThread(servers[1].url, servers[1].accessToken, video.id, 'comment by root server 2') + + const res = await addVideoCommentThread(servers[1].url, user3AccessToken, video.id, 'comment by user 3') + commentsUser3.push({ videoId: video.id, commentId: res.body.comment.id }) + } + } + + await waitJobs(servers) + }) + + it('Should delete comments of an account on my videos', async function () { + this.timeout(60000) + + await bulkRemoveCommentsOf({ + url: servers[0].url, + token: user1AccessToken, + attributes: { + accountName: 'user2', + scope: 'my-videos' + } + }) + + await waitJobs(servers) + + for (const server of servers) { + const res = await getVideosList(server.url) + + for (const video of res.body.data) { + const resThreads = await getVideoCommentThreads(server.url, video.id, 0, 10) + const comments = resThreads.body.data as VideoComment[] + const comment = comments.find(c => c.text === 'comment by user 2') + + if (video.name === 'video 3 server 1') { + expect(comment).to.not.exist + } else { + expect(comment).to.exist + } + } + } + }) + + it('Should delete comments of an account on the instance', async function () { + this.timeout(60000) + + await bulkRemoveCommentsOf({ + url: servers[0].url, + token: servers[0].accessToken, + attributes: { + accountName: 'user3@localhost:' + servers[1].port, + scope: 'instance' + } + }) + + await waitJobs(servers) + + await checkInstanceCommentsRemoved() + }) + + it('Should not re create the comment on video update', async function () { + this.timeout(60000) + + for (const obj of commentsUser3) { + await addVideoCommentReply(servers[1].url, user3AccessToken, obj.videoId, obj.commentId, 'comment by user 3 bis') + } + + await waitJobs(servers) + + await checkInstanceCommentsRemoved() + }) + }) + + after(async function () { + await cleanupTests(servers) + }) +}) -- cgit v1.2.3