X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftests%2Fapi%2Fusers%2Fusers.ts;h=93e2e489a3d4f06b39e0810f1d8848a282f6590f;hb=b65f5367baf799b425be0bcfb9220922751bb6eb;hp=1419ae820493e479124c09784cf7bf3340eaf9af;hpb=ac27887774e63d99f4e227fbe18846f143cc4b3c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts index 1419ae820..93e2e489a 100644 --- a/server/tests/api/users/users.ts +++ b/server/tests/api/users/users.ts @@ -1,20 +1,9 @@ /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ -import 'mocha' -import * as chai from 'chai' -import { - cleanupTests, - createSingleServer, - killallServers, - makePutBodyRequest, - PeerTubeServer, - setAccessTokensToServers, - testImage, - waitJobs -} from '@shared/extra-utils' -import { AbuseState, HttpStatusCode, OAuth2ErrorCode, UserAdminFlag, UserRole, Video, VideoPlaylistType } from '@shared/models' - -const expect = chai.expect +import { expect } from 'chai' +import { testImage } from '@server/tests/shared' +import { AbuseState, HttpStatusCode, UserAdminFlag, UserRole, VideoPlaylistType } from '@shared/models' +import { cleanupTests, createSingleServer, PeerTubeServer, setAccessTokensToServers } from '@shared/server-commands' describe('Test users', function () { let server: PeerTubeServer @@ -43,227 +32,6 @@ describe('Test users', function () { await server.plugins.install({ npmName: 'peertube-theme-background-red' }) }) - describe('OAuth client', function () { - it('Should create a new client') - - it('Should return the first client') - - it('Should remove the last client') - - it('Should not login with an invalid client id', async function () { - const client = { id: 'client', secret: server.store.client.secret } - const body = await server.login.login({ client, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) - - expect(body.code).to.equal(OAuth2ErrorCode.INVALID_CLIENT) - expect(body.error).to.contain('client is invalid') - expect(body.type.startsWith('https://')).to.be.true - expect(body.type).to.contain(OAuth2ErrorCode.INVALID_CLIENT) - }) - - it('Should not login with an invalid client secret', async function () { - const client = { id: server.store.client.id, secret: 'coucou' } - const body = await server.login.login({ client, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) - - expect(body.code).to.equal(OAuth2ErrorCode.INVALID_CLIENT) - expect(body.error).to.contain('client is invalid') - expect(body.type.startsWith('https://')).to.be.true - expect(body.type).to.contain(OAuth2ErrorCode.INVALID_CLIENT) - }) - }) - - describe('Login', function () { - - it('Should not login with an invalid username', async function () { - const user = { username: 'captain crochet', password: server.store.user.password } - const body = await server.login.login({ user, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) - - expect(body.code).to.equal(OAuth2ErrorCode.INVALID_GRANT) - expect(body.error).to.contain('credentials are invalid') - expect(body.type.startsWith('https://')).to.be.true - expect(body.type).to.contain(OAuth2ErrorCode.INVALID_GRANT) - }) - - it('Should not login with an invalid password', async function () { - const user = { username: server.store.user.username, password: 'mew_three' } - const body = await server.login.login({ user, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) - - expect(body.code).to.equal(OAuth2ErrorCode.INVALID_GRANT) - expect(body.error).to.contain('credentials are invalid') - expect(body.type.startsWith('https://')).to.be.true - expect(body.type).to.contain(OAuth2ErrorCode.INVALID_GRANT) - }) - - it('Should not be able to upload a video', async function () { - token = 'my_super_token' - - await server.videos.upload({ token, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) - }) - - it('Should not be able to follow', async function () { - token = 'my_super_token' - - await server.follows.follow({ - hosts: [ 'http://example.com' ], - token, - expectedStatus: HttpStatusCode.UNAUTHORIZED_401 - }) - }) - - it('Should not be able to unfollow') - - it('Should be able to login', async function () { - const body = await server.login.login({ expectedStatus: HttpStatusCode.OK_200 }) - - token = body.access_token - }) - - it('Should be able to login with an insensitive username', async function () { - const user = { username: 'RoOt', password: server.store.user.password } - await server.login.login({ user, expectedStatus: HttpStatusCode.OK_200 }) - - const user2 = { username: 'rOoT', password: server.store.user.password } - await server.login.login({ user: user2, expectedStatus: HttpStatusCode.OK_200 }) - - const user3 = { username: 'ROOt', password: server.store.user.password } - await server.login.login({ user: user3, expectedStatus: HttpStatusCode.OK_200 }) - }) - }) - - describe('Upload', function () { - - it('Should upload the video with the correct token', async function () { - await server.videos.upload({ token }) - const { data } = await server.videos.list() - const video = data[0] - - expect(video.account.name).to.equal('root') - videoId = video.id - }) - - it('Should upload the video again with the correct token', async function () { - await server.videos.upload({ token }) - }) - }) - - describe('Ratings', function () { - - it('Should retrieve a video rating', async function () { - await server.videos.rate({ id: videoId, rating: 'like' }) - const rating = await server.users.getMyRating({ token, videoId }) - - expect(rating.videoId).to.equal(videoId) - expect(rating.rating).to.equal('like') - }) - - it('Should retrieve ratings list', async function () { - await server.videos.rate({ id: videoId, rating: 'like' }) - - const body = await server.accounts.listRatings({ accountName: server.store.user.username }) - - expect(body.total).to.equal(1) - expect(body.data[0].video.id).to.equal(videoId) - expect(body.data[0].rating).to.equal('like') - }) - - it('Should retrieve ratings list by rating type', async function () { - { - const body = await server.accounts.listRatings({ accountName: server.store.user.username, rating: 'like' }) - expect(body.data.length).to.equal(1) - } - - { - const body = await server.accounts.listRatings({ accountName: server.store.user.username, rating: 'dislike' }) - expect(body.data.length).to.equal(0) - } - }) - }) - - describe('Remove video', function () { - it('Should not be able to remove the video with an incorrect token', async function () { - await server.videos.remove({ token: 'bad_token', id: videoId, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) - }) - - it('Should not be able to remove the video with the token of another account') - - it('Should be able to remove the video with the correct token', async function () { - await server.videos.remove({ token, id: videoId }) - }) - }) - - describe('Logout', function () { - it('Should logout (revoke token)', async function () { - await server.login.logout({ token: server.accessToken }) - }) - - it('Should not be able to get the user information', async function () { - await server.users.getMyInfo({ expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) - }) - - it('Should not be able to upload a video', async function () { - await server.videos.upload({ attributes: { name: 'video' }, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) - }) - - it('Should not be able to rate a video', async function () { - const path = '/api/v1/videos/' - const data = { - rating: 'likes' - } - - const options = { - url: server.url, - path: path + videoId, - token: 'wrong token', - fields: data, - expectedStatus: HttpStatusCode.UNAUTHORIZED_401 - } - await makePutBodyRequest(options) - }) - - it('Should be able to login again', async function () { - const body = await server.login.login() - server.accessToken = body.access_token - server.refreshToken = body.refresh_token - }) - - it('Should be able to get my user information again', async function () { - await server.users.getMyInfo() - }) - - it('Should have an expired access token', async function () { - this.timeout(15000) - - await server.sql.setTokenField(server.accessToken, 'accessTokenExpiresAt', new Date().toISOString()) - await server.sql.setTokenField(server.accessToken, 'refreshTokenExpiresAt', new Date().toISOString()) - - await killallServers([ server ]) - await server.run() - - await server.users.getMyInfo({ expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) - }) - - it('Should not be able to refresh an access token with an expired refresh token', async function () { - await server.login.refreshToken({ refreshToken: server.refreshToken, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) - }) - - it('Should refresh the token', async function () { - this.timeout(15000) - - const futureDate = new Date(new Date().getTime() + 1000 * 60).toISOString() - await server.sql.setTokenField(server.accessToken, 'refreshTokenExpiresAt', futureDate) - - await killallServers([ server ]) - await server.run() - - const res = await server.login.refreshToken({ refreshToken: server.refreshToken }) - server.accessToken = res.body.access_token - server.refreshToken = res.body.refresh_token - }) - - it('Should be able to get my user information again', async function () { - await server.users.getMyInfo() - }) - }) - describe('Creating a user', function () { it('Should be able to create a new user', async function () { @@ -284,13 +52,13 @@ describe('Test users', function () { expect(user.email).to.equal('user_1@example.com') expect(user.nsfwPolicy).to.equal('display') expect(user.videoQuota).to.equal(2 * 1024 * 1024) - expect(user.roleLabel).to.equal('User') + expect(user.role.label).to.equal('User') expect(user.id).to.be.a('number') expect(user.account.displayName).to.equal('user_1') expect(user.account.description).to.be.null } - expect(userMe.adminFlags).to.be.undefined + expect(userMe.adminFlags).to.equal(UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST) expect(userGet.adminFlags).to.equal(UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST) expect(userMe.specialPlaylists).to.have.lengthOf(1) @@ -308,80 +76,6 @@ describe('Test users', function () { }) }) - describe('My videos & quotas', function () { - - it('Should be able to upload a video with this user', async function () { - this.timeout(10000) - - const attributes = { - name: 'super user video', - fixture: 'video_short.webm' - } - await server.videos.upload({ token: userToken, attributes }) - }) - - it('Should have video quota updated', async function () { - const quota = await server.users.getMyQuotaUsed({ token: userToken }) - expect(quota.videoQuotaUsed).to.equal(218910) - - const { data } = await server.users.list() - const tmpUser = data.find(u => u.username === user.username) - expect(tmpUser.videoQuotaUsed).to.equal(218910) - }) - - it('Should be able to list my videos', async function () { - const { total, data } = await server.videos.listMyVideos({ token: userToken }) - expect(total).to.equal(1) - expect(data).to.have.lengthOf(1) - - const video: Video = data[0] - expect(video.name).to.equal('super user video') - expect(video.thumbnailPath).to.not.be.null - expect(video.previewPath).to.not.be.null - }) - - it('Should be able to search in my videos', async function () { - { - const { total, data } = await server.videos.listMyVideos({ token: userToken, sort: '-createdAt', search: 'user video' }) - expect(total).to.equal(1) - expect(data).to.have.lengthOf(1) - } - - { - const { total, data } = await server.videos.listMyVideos({ token: userToken, sort: '-createdAt', search: 'toto' }) - expect(total).to.equal(0) - expect(data).to.have.lengthOf(0) - } - }) - - it('Should disable webtorrent, enable HLS, and update my quota', async function () { - this.timeout(60000) - - { - const config = await server.config.getCustomConfig() - config.transcoding.webtorrent.enabled = false - config.transcoding.hls.enabled = true - config.transcoding.enabled = true - await server.config.updateCustomSubConfig({ newConfig: config }) - } - - { - const attributes = { - name: 'super user video 2', - fixture: 'video_short.webm' - } - await server.videos.upload({ token: userToken, attributes }) - - await waitJobs([ server ]) - } - - { - const data = await server.users.getMyQuotaUsed({ token: userToken }) - expect(data.videoQuotaUsed).to.be.greaterThan(220000) - } - }) - }) - describe('Users listing', function () { it('Should list all the users', async function () { @@ -416,7 +110,7 @@ describe('Test users', function () { const user = data[0] expect(user.username).to.equal('root') expect(user.email).to.equal('admin' + server.internalServerNumber + '@example.com') - expect(user.roleLabel).to.equal('Administrator') + expect(user.role.label).to.equal('Administrator') expect(user.nsfwPolicy).to.equal('display') }) @@ -534,6 +228,28 @@ describe('Test users', function () { expect(user.autoPlayNextVideo).to.be.true }) + it('Should be able to change the p2p attribute', async function () { + { + await server.users.updateMe({ + token: userToken, + webTorrentEnabled: false + }) + + const user = await server.users.getMyInfo({ token: userToken }) + expect(user.p2pEnabled).to.be.false + } + + { + await server.users.updateMe({ + token: userToken, + p2pEnabled: true + }) + + const user = await server.users.getMyInfo({ token: userToken }) + expect(user.p2pEnabled).to.be.true + } + }) + it('Should be able to change the email attribute', async function () { await server.users.updateMe({ token: userToken, @@ -557,7 +273,9 @@ describe('Test users', function () { await server.users.updateMyAvatar({ token: userToken, fixture }) const user = await server.users.getMyInfo({ token: userToken }) - await testImage(server.url, 'avatar-resized', user.account.avatar.path, '.gif') + for (const avatar of user.account.avatars) { + await testImage(server.url, `avatar-resized-${avatar.width}x${avatar.width}`, avatar.path, '.gif') + } }) it('Should be able to update my avatar with a gif, and then a png', async function () { @@ -567,7 +285,9 @@ describe('Test users', function () { await server.users.updateMyAvatar({ token: userToken, fixture }) const user = await server.users.getMyInfo({ token: userToken }) - await testImage(server.url, 'avatar-resized', user.account.avatar.path, extension) + for (const avatar of user.account.avatars) { + await testImage(server.url, `avatar-resized-${avatar.width}x${avatar.width}`, avatar.path, extension) + } } }) @@ -597,6 +317,7 @@ describe('Test users', function () { expect(user.account.description).to.equal('my super description updated') expect(user.noWelcomeModal).to.be.false expect(user.noInstanceConfigWarningModal).to.be.false + expect(user.noAccountSetupWarningModal).to.be.false }) it('Should be able to update my theme', async function () { @@ -612,16 +333,19 @@ describe('Test users', function () { await server.users.updateMe({ token: userToken, noInstanceConfigWarningModal: true, - noWelcomeModal: true + noWelcomeModal: true, + noAccountSetupWarningModal: true }) const user = await server.users.getMyInfo({ token: userToken }) expect(user.noWelcomeModal).to.be.true expect(user.noInstanceConfigWarningModal).to.be.true + expect(user.noAccountSetupWarningModal).to.be.true }) }) describe('Updating another user', function () { + it('Should be able to update another user', async function () { await server.users.update({ userId, @@ -641,7 +365,7 @@ describe('Test users', function () { expect(user.emailVerified).to.be.true expect(user.nsfwPolicy).to.equal('do_not_list') expect(user.videoQuota).to.equal(42) - expect(user.roleLabel).to.equal('Moderator') + expect(user.role.label).to.equal('Moderator') expect(user.id).to.be.a('number') expect(user.adminFlags).to.equal(UserAdminFlag.NONE) expect(user.pluginAuth).to.equal('toto') @@ -672,13 +396,22 @@ describe('Test users', function () { }) }) - describe('Video blacklists', function () { - it('Should be able to list video blacklist by a moderator', async function () { - await server.blacklist.list({ token: userToken }) + describe('Remove a user', function () { + + before(async function () { + await server.users.update({ + userId, + token, + videoQuota: 2 * 1024 * 1024 + }) + + await server.videos.quickUpload({ name: 'user video', token: userToken, fixture: 'video_short.webm' }) + await server.videos.quickUpload({ name: 'root video' }) + + const { total } = await server.videos.list() + expect(total).to.equal(2) }) - }) - describe('Remove a user', function () { it('Should be able to remove this user', async function () { await server.users.remove({ userId, token }) }) @@ -697,7 +430,7 @@ describe('Test users', function () { }) describe('Registering a new user', function () { - let user15AccessToken + let user15AccessToken: string it('Should register a new user', async function () { const user = { displayName: 'super user 15', username: 'user_15', password: 'my super password' } @@ -747,8 +480,9 @@ describe('Test users', function () { }) describe('User blocking', function () { - let user16Id - let user16AccessToken + let user16Id: number + let user16AccessToken: string + const user16 = { username: 'user_16', password: 'my super password' @@ -793,8 +527,8 @@ describe('Test users', function () { }) describe('User stats', function () { - let user17Id - let user17AccessToken + let user17Id: number + let user17AccessToken: string it('Should report correct initial statistics about a user', async function () { const user17 = {