aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--server/controllers/api/users/index.ts4
-rw-r--r--server/tests/api/activitypub/fetch.ts3
-rw-r--r--server/tests/api/activitypub/refresher.ts5
-rw-r--r--server/tests/api/check-params/abuses.ts6
-rw-r--r--server/tests/api/check-params/blocklist.ts3
-rw-r--r--server/tests/api/check-params/bulk.ts3
-rw-r--r--server/tests/api/check-params/config.ts3
-rw-r--r--server/tests/api/check-params/custom-pages.ts3
-rw-r--r--server/tests/api/check-params/debug.ts3
-rw-r--r--server/tests/api/check-params/follows.ts3
-rw-r--r--server/tests/api/check-params/jobs.ts3
-rw-r--r--server/tests/api/check-params/live.ts20
-rw-r--r--server/tests/api/check-params/logs.ts3
-rw-r--r--server/tests/api/check-params/plugins.ts3
-rw-r--r--server/tests/api/check-params/redundancy.ts3
-rw-r--r--server/tests/api/check-params/upload-quota.ts35
-rw-r--r--server/tests/api/check-params/user-subscriptions.ts3
-rw-r--r--server/tests/api/check-params/users.ts243
-rw-r--r--server/tests/api/check-params/video-blacklist.ts5
-rw-r--r--server/tests/api/check-params/video-captions.ts3
-rw-r--r--server/tests/api/check-params/video-channels.ts3
-rw-r--r--server/tests/api/check-params/video-comments.ts5
-rw-r--r--server/tests/api/check-params/video-imports.ts14
-rw-r--r--server/tests/api/check-params/video-playlists.ts3
-rw-r--r--server/tests/api/check-params/videos-filter.ts16
-rw-r--r--server/tests/api/check-params/videos.ts18
-rw-r--r--server/tests/api/live/live-constraints.ts8
-rw-r--r--server/tests/api/moderation/abuses.ts15
-rw-r--r--server/tests/api/moderation/blocklist-notification.ts9
-rw-r--r--server/tests/api/moderation/blocklist.ts7
-rw-r--r--server/tests/api/moderation/video-blacklist.ts17
-rw-r--r--server/tests/api/notifications/comments-notifications.ts14
-rw-r--r--server/tests/api/notifications/moderation-notifications.ts11
-rw-r--r--server/tests/api/notifications/notifications-api.ts25
-rw-r--r--server/tests/api/notifications/user-notifications.ts18
-rw-r--r--server/tests/api/search/search-activitypub-video-channels.ts8
-rw-r--r--server/tests/api/search/search-channels.ts4
-rw-r--r--server/tests/api/server/bulk.ts7
-rw-r--r--server/tests/api/server/config.ts7
-rw-r--r--server/tests/api/server/email.ts73
-rw-r--r--server/tests/api/server/follow-constraints.ts3
-rw-r--r--server/tests/api/server/follows.ts5
-rw-r--r--server/tests/api/server/jobs.ts2
-rw-r--r--server/tests/api/server/plugins.ts18
-rw-r--r--server/tests/api/server/reverse-proxy.ts18
-rw-r--r--server/tests/api/server/stats.ts3
-rw-r--r--server/tests/api/users/user-subscriptions.ts3
-rw-r--r--server/tests/api/users/users-multiple-servers.ts45
-rw-r--r--server/tests/api/users/users-verification.ts48
-rw-r--r--server/tests/api/users/users.ts374
-rw-r--r--server/tests/api/videos/multiple-servers.ts3
-rw-r--r--server/tests/api/videos/resumable-upload.ts17
-rw-r--r--server/tests/api/videos/video-change-ownership.ts89
-rw-r--r--server/tests/api/videos/video-channels.ts22
-rw-r--r--server/tests/api/videos/video-comments.ts16
-rw-r--r--server/tests/api/videos/video-imports.ts9
-rw-r--r--server/tests/api/videos/video-nsfw.ts26
-rw-r--r--server/tests/api/videos/video-playlists.ts34
-rw-r--r--server/tests/api/videos/video-privacy.ts3
-rw-r--r--server/tests/api/videos/videos-filter.ts13
-rw-r--r--server/tests/api/videos/videos-history.ts12
-rw-r--r--server/tests/api/videos/videos-overview.ts12
-rw-r--r--server/tests/cli/peertube.ts8
-rw-r--r--server/tests/cli/prune-storage.ts3
-rw-r--r--server/tests/cli/reset-password.ts4
-rw-r--r--server/tests/cli/update-host.ts3
-rw-r--r--server/tests/client.ts3
-rw-r--r--server/tests/external-plugins/auth-ldap.ts12
-rw-r--r--server/tests/feeds/feeds.ts31
-rw-r--r--server/tests/misc-endpoints.ts5
-rw-r--r--server/tests/plugins/action-hooks.ts41
-rw-r--r--server/tests/plugins/external-auth.ts49
-rw-r--r--server/tests/plugins/filter-hooks.ts9
-rw-r--r--server/tests/plugins/id-and-pass-auth.ts53
-rw-r--r--server/tools/cli.ts10
-rw-r--r--shared/extra-utils/server/servers.ts4
-rw-r--r--shared/extra-utils/users/index.ts1
-rw-r--r--shared/extra-utils/users/login-command.ts12
-rw-r--r--shared/extra-utils/users/notifications.ts18
-rw-r--r--shared/extra-utils/users/users-command.ts414
-rw-r--r--shared/extra-utils/users/users.ts400
-rw-r--r--shared/extra-utils/videos/channels.ts6
-rw-r--r--shared/extra-utils/videos/videos.ts4
-rw-r--r--shared/models/users/index.ts1
-rw-r--r--shared/models/users/user-create-result.model.ts7
85 files changed, 1009 insertions, 1503 deletions
diff --git a/server/controllers/api/users/index.ts b/server/controllers/api/users/index.ts
index d907b49bf..b86fc94ef 100644
--- a/server/controllers/api/users/index.ts
+++ b/server/controllers/api/users/index.ts
@@ -4,7 +4,7 @@ import { tokensRouter } from '@server/controllers/api/users/token'
4import { Hooks } from '@server/lib/plugins/hooks' 4import { Hooks } from '@server/lib/plugins/hooks'
5import { OAuthTokenModel } from '@server/models/oauth/oauth-token' 5import { OAuthTokenModel } from '@server/models/oauth/oauth-token'
6import { MUser, MUserAccountDefault } from '@server/types/models' 6import { MUser, MUserAccountDefault } from '@server/types/models'
7import { UserCreate, UserRight, UserRole, UserUpdate } from '../../../../shared' 7import { UserCreate, UserCreateResult, UserRight, UserRole, UserUpdate } from '../../../../shared'
8import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 8import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
9import { UserAdminFlag } from '../../../../shared/models/users/user-flag.model' 9import { UserAdminFlag } from '../../../../shared/models/users/user-flag.model'
10import { UserRegister } from '../../../../shared/models/users/user-register.model' 10import { UserRegister } from '../../../../shared/models/users/user-register.model'
@@ -220,7 +220,7 @@ async function createUser (req: express.Request, res: express.Response) {
220 account: { 220 account: {
221 id: account.id 221 id: account.id
222 } 222 }
223 } 223 } as UserCreateResult
224 }) 224 })
225} 225}
226 226
diff --git a/server/tests/api/activitypub/fetch.ts b/server/tests/api/activitypub/fetch.ts
index c1af23016..162f3ec83 100644
--- a/server/tests/api/activitypub/fetch.ts
+++ b/server/tests/api/activitypub/fetch.ts
@@ -4,7 +4,6 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 doubleFollow, 7 doubleFollow,
9 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
10 getVideosListSort, 9 getVideosListSort,
@@ -32,7 +31,7 @@ describe('Test ActivityPub fetcher', function () {
32 31
33 const user = { username: 'user1', password: 'password' } 32 const user = { username: 'user1', password: 'password' }
34 for (const server of servers) { 33 for (const server of servers) {
35 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 34 await server.usersCommand.create({ username: user.username, password: user.password })
36 } 35 }
37 36
38 const userAccessToken = await servers[0].loginCommand.getAccessToken(user) 37 const userAccessToken = await servers[0].loginCommand.getAccessToken(user)
diff --git a/server/tests/api/activitypub/refresher.ts b/server/tests/api/activitypub/refresher.ts
index af919f2f3..5a37dbc40 100644
--- a/server/tests/api/activitypub/refresher.ts
+++ b/server/tests/api/activitypub/refresher.ts
@@ -6,7 +6,6 @@ import {
6 cleanupTests, 6 cleanupTests,
7 doubleFollow, 7 doubleFollow,
8 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
9 generateUserAccessToken,
10 getVideo, 9 getVideo,
11 killallServers, 10 killallServers,
12 reRunServer, 11 reRunServer,
@@ -44,10 +43,10 @@ describe('Test AP refresher', function () {
44 } 43 }
45 44
46 { 45 {
47 const a1 = await generateUserAccessToken(servers[1], 'user1') 46 const a1 = await servers[1].usersCommand.generateUserAndToken('user1')
48 await uploadVideo(servers[1].url, a1, { name: 'video4' }) 47 await uploadVideo(servers[1].url, a1, { name: 'video4' })
49 48
50 const a2 = await generateUserAccessToken(servers[1], 'user2') 49 const a2 = await servers[1].usersCommand.generateUserAndToken('user2')
51 await uploadVideo(servers[1].url, a2, { name: 'video5' }) 50 await uploadVideo(servers[1].url, a2, { name: 'video5' })
52 } 51 }
53 52
diff --git a/server/tests/api/check-params/abuses.ts b/server/tests/api/check-params/abuses.ts
index 14949d301..4cd10a6fd 100644
--- a/server/tests/api/check-params/abuses.ts
+++ b/server/tests/api/check-params/abuses.ts
@@ -8,10 +8,8 @@ import {
8 checkBadSortPagination, 8 checkBadSortPagination,
9 checkBadStartPagination, 9 checkBadStartPagination,
10 cleanupTests, 10 cleanupTests,
11 createUser,
12 doubleFollow, 11 doubleFollow,
13 flushAndRunServer, 12 flushAndRunServer,
14 generateUserAccessToken,
15 getVideoIdFromUUID, 13 getVideoIdFromUUID,
16 makeGetRequest, 14 makeGetRequest,
17 makePostBodyRequest, 15 makePostBodyRequest,
@@ -45,10 +43,10 @@ describe('Test abuses API validators', function () {
45 43
46 const username = 'user1' 44 const username = 'user1'
47 const password = 'my super password' 45 const password = 'my super password'
48 await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password }) 46 await server.usersCommand.create({ username: username, password: password })
49 userToken = await server.loginCommand.getAccessToken({ username, password }) 47 userToken = await server.loginCommand.getAccessToken({ username, password })
50 48
51 userToken2 = await generateUserAccessToken(server, 'user_2') 49 userToken2 = await server.usersCommand.generateUserAndToken('user_2')
52 50
53 const res = await uploadVideo(server.url, server.accessToken, {}) 51 const res = await uploadVideo(server.url, server.accessToken, {})
54 server.video = res.body.video 52 server.video = res.body.video
diff --git a/server/tests/api/check-params/blocklist.ts b/server/tests/api/check-params/blocklist.ts
index 11a79387f..18238bb04 100644
--- a/server/tests/api/check-params/blocklist.ts
+++ b/server/tests/api/check-params/blocklist.ts
@@ -4,7 +4,6 @@ import 'mocha'
4 4
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 doubleFollow, 7 doubleFollow,
9 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
10 makeDeleteRequest, 9 makeDeleteRequest,
@@ -34,7 +33,7 @@ describe('Test blocklist API validators', function () {
34 server = servers[0] 33 server = servers[0]
35 34
36 const user = { username: 'user1', password: 'password' } 35 const user = { username: 'user1', password: 'password' }
37 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 36 await server.usersCommand.create({ username: user.username, password: user.password })
38 37
39 userAccessToken = await server.loginCommand.getAccessToken(user) 38 userAccessToken = await server.loginCommand.getAccessToken(user)
40 39
diff --git a/server/tests/api/check-params/bulk.ts b/server/tests/api/check-params/bulk.ts
index 85520b3bd..3f80c79a8 100644
--- a/server/tests/api/check-params/bulk.ts
+++ b/server/tests/api/check-params/bulk.ts
@@ -3,7 +3,6 @@
3import 'mocha' 3import 'mocha'
4import { 4import {
5 cleanupTests, 5 cleanupTests,
6 createUser,
7 flushAndRunServer, 6 flushAndRunServer,
8 ServerInfo, 7 ServerInfo,
9 setAccessTokensToServers 8 setAccessTokensToServers
@@ -24,7 +23,7 @@ describe('Test bulk API validators', function () {
24 await setAccessTokensToServers([ server ]) 23 await setAccessTokensToServers([ server ])
25 24
26 const user = { username: 'user1', password: 'password' } 25 const user = { username: 'user1', password: 'password' }
27 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 26 await server.usersCommand.create({ username: user.username, password: user.password })
28 27
29 userAccessToken = await server.loginCommand.getAccessToken(user) 28 userAccessToken = await server.loginCommand.getAccessToken(user)
30 }) 29 })
diff --git a/server/tests/api/check-params/config.ts b/server/tests/api/check-params/config.ts
index e93523e4b..c204d9415 100644
--- a/server/tests/api/check-params/config.ts
+++ b/server/tests/api/check-params/config.ts
@@ -5,7 +5,6 @@ import { omit } from 'lodash'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 flushAndRunServer, 8 flushAndRunServer,
10 makeDeleteRequest, 9 makeDeleteRequest,
11 makeGetRequest, 10 makeGetRequest,
@@ -206,7 +205,7 @@ describe('Test config API validators', function () {
206 username: 'user1', 205 username: 'user1',
207 password: 'password' 206 password: 'password'
208 } 207 }
209 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 208 await server.usersCommand.create({ username: user.username, password: user.password })
210 userAccessToken = await server.loginCommand.getAccessToken(user) 209 userAccessToken = await server.loginCommand.getAccessToken(user)
211 }) 210 })
212 211
diff --git a/server/tests/api/check-params/custom-pages.ts b/server/tests/api/check-params/custom-pages.ts
index c1dd258aa..58b0b8600 100644
--- a/server/tests/api/check-params/custom-pages.ts
+++ b/server/tests/api/check-params/custom-pages.ts
@@ -4,7 +4,6 @@ import 'mocha'
4import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 4import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 ServerInfo, 8 ServerInfo,
10 setAccessTokensToServers 9 setAccessTokensToServers
@@ -26,7 +25,7 @@ describe('Test custom pages validators', function () {
26 await setAccessTokensToServers([ server ]) 25 await setAccessTokensToServers([ server ])
27 26
28 const user = { username: 'user1', password: 'password' } 27 const user = { username: 'user1', password: 'password' }
29 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 28 await server.usersCommand.create({ username: user.username, password: user.password })
30 29
31 userAccessToken = await server.loginCommand.getAccessToken(user) 30 userAccessToken = await server.loginCommand.getAccessToken(user)
32 }) 31 })
diff --git a/server/tests/api/check-params/debug.ts b/server/tests/api/check-params/debug.ts
index dc033a441..2a7485cf3 100644
--- a/server/tests/api/check-params/debug.ts
+++ b/server/tests/api/check-params/debug.ts
@@ -4,7 +4,6 @@ import 'mocha'
4 4
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 ServerInfo, 8 ServerInfo,
10 setAccessTokensToServers 9 setAccessTokensToServers
@@ -30,7 +29,7 @@ describe('Test debug API validators', function () {
30 username: 'user1', 29 username: 'user1',
31 password: 'my super password' 30 password: 'my super password'
32 } 31 }
33 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 32 await server.usersCommand.create({ username: user.username, password: user.password })
34 userAccessToken = await server.loginCommand.getAccessToken(user) 33 userAccessToken = await server.loginCommand.getAccessToken(user)
35 }) 34 })
36 35
diff --git a/server/tests/api/check-params/follows.ts b/server/tests/api/check-params/follows.ts
index 8cf5b130e..24e483448 100644
--- a/server/tests/api/check-params/follows.ts
+++ b/server/tests/api/check-params/follows.ts
@@ -4,7 +4,6 @@ import 'mocha'
4 4
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 makeDeleteRequest, makeGetRequest, 8 makeDeleteRequest, makeGetRequest,
10 makePostBodyRequest, 9 makePostBodyRequest,
@@ -40,7 +39,7 @@ describe('Test server follows API validators', function () {
40 password: 'password' 39 password: 'password'
41 } 40 }
42 41
43 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 42 await server.usersCommand.create({ username: user.username, password: user.password })
44 userAccessToken = await server.loginCommand.getAccessToken(user) 43 userAccessToken = await server.loginCommand.getAccessToken(user)
45 }) 44 })
46 45
diff --git a/server/tests/api/check-params/jobs.ts b/server/tests/api/check-params/jobs.ts
index cbe6a28b8..29439bebf 100644
--- a/server/tests/api/check-params/jobs.ts
+++ b/server/tests/api/check-params/jobs.ts
@@ -4,7 +4,6 @@ import 'mocha'
4 4
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 ServerInfo, 8 ServerInfo,
10 setAccessTokensToServers 9 setAccessTokensToServers
@@ -35,7 +34,7 @@ describe('Test jobs API validators', function () {
35 username: 'user1', 34 username: 'user1',
36 password: 'my super password' 35 password: 'my super password'
37 } 36 }
38 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 37 await server.usersCommand.create({ username: user.username, password: user.password })
39 userAccessToken = await server.loginCommand.getAccessToken(user) 38 userAccessToken = await server.loginCommand.getAccessToken(user)
40 }) 39 })
41 40
diff --git a/server/tests/api/check-params/live.ts b/server/tests/api/check-params/live.ts
index 045f3a1b1..78863fd50 100644
--- a/server/tests/api/check-params/live.ts
+++ b/server/tests/api/check-params/live.ts
@@ -2,14 +2,11 @@
2 2
3import 'mocha' 3import 'mocha'
4import { omit } from 'lodash' 4import { omit } from 'lodash'
5import { VideoCreateResult, VideoPrivacy } from '@shared/models' 5import { HttpStatusCode } from '@shared/core-utils'
6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
7import { 6import {
8 buildAbsoluteFixturePath, 7 buildAbsoluteFixturePath,
9 cleanupTests, 8 cleanupTests,
10 createUser,
11 flushAndRunServer, 9 flushAndRunServer,
12 getMyUserInformation,
13 LiveCommand, 10 LiveCommand,
14 makePostBodyRequest, 11 makePostBodyRequest,
15 makeUploadRequest, 12 makeUploadRequest,
@@ -18,7 +15,8 @@ import {
18 setAccessTokensToServers, 15 setAccessTokensToServers,
19 stopFfmpeg, 16 stopFfmpeg,
20 uploadVideoAndGetId 17 uploadVideoAndGetId
21} from '../../../../shared/extra-utils' 18} from '@shared/extra-utils'
19import { VideoCreateResult, VideoPrivacy } from '@shared/models'
22 20
23describe('Test video lives API validator', function () { 21describe('Test video lives API validator', function () {
24 const path = '/api/v1/videos/live' 22 const path = '/api/v1/videos/live'
@@ -51,12 +49,12 @@ describe('Test video lives API validator', function () {
51 49
52 const username = 'user1' 50 const username = 'user1'
53 const password = 'my super password' 51 const password = 'my super password'
54 await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password }) 52 await server.usersCommand.create({ username: username, password: password })
55 userAccessToken = await server.loginCommand.getAccessToken({ username, password }) 53 userAccessToken = await server.loginCommand.getAccessToken({ username, password })
56 54
57 { 55 {
58 const res = await getMyUserInformation(server.url, server.accessToken) 56 const { videoChannels } = await server.usersCommand.getMyInfo()
59 channelId = res.body.videoChannels[0].id 57 channelId = videoChannels[0].id
60 } 58 }
61 59
62 { 60 {
@@ -147,11 +145,11 @@ describe('Test video lives API validator', function () {
147 username: 'fake', 145 username: 'fake',
148 password: 'fake_password' 146 password: 'fake_password'
149 } 147 }
150 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 148 await server.usersCommand.create({ username: user.username, password: user.password })
151 149
152 const accessTokenUser = await server.loginCommand.getAccessToken(user) 150 const accessTokenUser = await server.loginCommand.getAccessToken(user)
153 const res = await getMyUserInformation(server.url, accessTokenUser) 151 const { videoChannels } = await server.usersCommand.getMyInfo({ token: accessTokenUser })
154 const customChannelId = res.body.videoChannels[0].id 152 const customChannelId = videoChannels[0].id
155 153
156 const fields = { ...baseCorrectParams, channelId: customChannelId } 154 const fields = { ...baseCorrectParams, channelId: customChannelId }
157 155
diff --git a/server/tests/api/check-params/logs.ts b/server/tests/api/check-params/logs.ts
index 83ecfec93..69eaad69f 100644
--- a/server/tests/api/check-params/logs.ts
+++ b/server/tests/api/check-params/logs.ts
@@ -4,7 +4,6 @@ import 'mocha'
4 4
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 ServerInfo, 8 ServerInfo,
10 setAccessTokensToServers 9 setAccessTokensToServers
@@ -30,7 +29,7 @@ describe('Test logs API validators', function () {
30 username: 'user1', 29 username: 'user1',
31 password: 'my super password' 30 password: 'my super password'
32 } 31 }
33 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 32 await server.usersCommand.create({ username: user.username, password: user.password })
34 userAccessToken = await server.loginCommand.getAccessToken(user) 33 userAccessToken = await server.loginCommand.getAccessToken(user)
35 }) 34 })
36 35
diff --git a/server/tests/api/check-params/plugins.ts b/server/tests/api/check-params/plugins.ts
index 130cf6869..08fb2397f 100644
--- a/server/tests/api/check-params/plugins.ts
+++ b/server/tests/api/check-params/plugins.ts
@@ -7,7 +7,6 @@ import {
7 checkBadSortPagination, 7 checkBadSortPagination,
8 checkBadStartPagination, 8 checkBadStartPagination,
9 cleanupTests, 9 cleanupTests,
10 createUser,
11 flushAndRunServer, 10 flushAndRunServer,
12 makeGetRequest, 11 makeGetRequest,
13 makePostBodyRequest, 12 makePostBodyRequest,
@@ -43,7 +42,7 @@ describe('Test server plugins API validators', function () {
43 password: 'password' 42 password: 'password'
44 } 43 }
45 44
46 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 45 await server.usersCommand.create({ username: user.username, password: user.password })
47 userAccessToken = await server.loginCommand.getAccessToken(user) 46 userAccessToken = await server.loginCommand.getAccessToken(user)
48 47
49 { 48 {
diff --git a/server/tests/api/check-params/redundancy.ts b/server/tests/api/check-params/redundancy.ts
index 2e10e378a..d93022c32 100644
--- a/server/tests/api/check-params/redundancy.ts
+++ b/server/tests/api/check-params/redundancy.ts
@@ -8,7 +8,6 @@ import {
8 checkBadSortPagination, 8 checkBadSortPagination,
9 checkBadStartPagination, 9 checkBadStartPagination,
10 cleanupTests, 10 cleanupTests,
11 createUser,
12 doubleFollow, 11 doubleFollow,
13 flushAndRunMultipleServers, 12 flushAndRunMultipleServers,
14 getVideo, 13 getVideo,
@@ -43,7 +42,7 @@ describe('Test server redundancy API validators', function () {
43 password: 'password' 42 password: 'password'
44 } 43 }
45 44
46 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 45 await servers[0].usersCommand.create({ username: user.username, password: user.password })
47 userAccessToken = await servers[0].loginCommand.getAccessToken(user) 46 userAccessToken = await servers[0].loginCommand.getAccessToken(user)
48 47
49 videoIdLocal = (await uploadVideoAndGetId({ server: servers[0], videoName: 'video' })).id 48 videoIdLocal = (await uploadVideoAndGetId({ server: servers[0], videoName: 'video' })).id
diff --git a/server/tests/api/check-params/upload-quota.ts b/server/tests/api/check-params/upload-quota.ts
index 3dc6cf2b4..d94dec624 100644
--- a/server/tests/api/check-params/upload-quota.ts
+++ b/server/tests/api/check-params/upload-quota.ts
@@ -3,17 +3,14 @@
3import 'mocha' 3import 'mocha'
4import { expect } from 'chai' 4import { expect } from 'chai'
5import { HttpStatusCode, randomInt } from '@shared/core-utils' 5import { HttpStatusCode, randomInt } from '@shared/core-utils'
6import { MyUser, VideoImportState, VideoPrivacy } from '@shared/models' 6import { VideoImportState, VideoPrivacy } from '@shared/models'
7import { 7import {
8 cleanupTests, 8 cleanupTests,
9 flushAndRunServer, 9 flushAndRunServer,
10 getMyUserInformation,
11 ImportsCommand, 10 ImportsCommand,
12 registerUser,
13 ServerInfo, 11 ServerInfo,
14 setAccessTokensToServers, 12 setAccessTokensToServers,
15 setDefaultVideoChannel, 13 setDefaultVideoChannel,
16 updateUser,
17 uploadVideo, 14 uploadVideo,
18 waitJobs 15 waitJobs
19} from '../../../../shared/extra-utils' 16} from '../../../../shared/extra-utils'
@@ -31,15 +28,10 @@ describe('Test upload quota', function () {
31 await setAccessTokensToServers([ server ]) 28 await setAccessTokensToServers([ server ])
32 await setDefaultVideoChannel([ server ]) 29 await setDefaultVideoChannel([ server ])
33 30
34 const res = await getMyUserInformation(server.url, server.accessToken) 31 const user = await server.usersCommand.getMyInfo()
35 rootId = (res.body as MyUser).id 32 rootId = user.id
36 33
37 await updateUser({ 34 await server.usersCommand.update({ userId: rootId, videoQuota: 42 })
38 url: server.url,
39 userId: rootId,
40 accessToken: server.accessToken,
41 videoQuota: 42
42 })
43 }) 35 })
44 36
45 describe('When having a video quota', function () { 37 describe('When having a video quota', function () {
@@ -48,7 +40,7 @@ describe('Test upload quota', function () {
48 this.timeout(30000) 40 this.timeout(30000)
49 41
50 const user = { username: 'registered' + randomInt(1, 1500), password: 'password' } 42 const user = { username: 'registered' + randomInt(1, 1500), password: 'password' }
51 await registerUser(server.url, user.username, user.password) 43 await server.usersCommand.register(user)
52 const userAccessToken = await server.loginCommand.getAccessToken(user) 44 const userAccessToken = await server.loginCommand.getAccessToken(user)
53 45
54 const videoAttributes = { fixture: 'video_short2.webm' } 46 const videoAttributes = { fixture: 'video_short2.webm' }
@@ -63,7 +55,7 @@ describe('Test upload quota', function () {
63 this.timeout(30000) 55 this.timeout(30000)
64 56
65 const user = { username: 'registered' + randomInt(1, 1500), password: 'password' } 57 const user = { username: 'registered' + randomInt(1, 1500), password: 'password' }
66 await registerUser(server.url, user.username, user.password) 58 await server.usersCommand.register(user)
67 const userAccessToken = await server.loginCommand.getAccessToken(user) 59 const userAccessToken = await server.loginCommand.getAccessToken(user)
68 60
69 const videoAttributes = { fixture: 'video_short2.webm' } 61 const videoAttributes = { fixture: 'video_short2.webm' }
@@ -103,12 +95,7 @@ describe('Test upload quota', function () {
103 describe('When having a daily video quota', function () { 95 describe('When having a daily video quota', function () {
104 96
105 it('Should fail with a user having too many videos daily', async function () { 97 it('Should fail with a user having too many videos daily', async function () {
106 await updateUser({ 98 await server.usersCommand.update({ userId: rootId, videoQuotaDaily: 42 })
107 url: server.url,
108 userId: rootId,
109 accessToken: server.accessToken,
110 videoQuotaDaily: 42
111 })
112 99
113 await uploadVideo(server.url, server.accessToken, {}, HttpStatusCode.PAYLOAD_TOO_LARGE_413, 'legacy') 100 await uploadVideo(server.url, server.accessToken, {}, HttpStatusCode.PAYLOAD_TOO_LARGE_413, 'legacy')
114 await uploadVideo(server.url, server.accessToken, {}, HttpStatusCode.PAYLOAD_TOO_LARGE_413, 'resumable') 101 await uploadVideo(server.url, server.accessToken, {}, HttpStatusCode.PAYLOAD_TOO_LARGE_413, 'resumable')
@@ -117,10 +104,8 @@ describe('Test upload quota', function () {
117 104
118 describe('When having an absolute and daily video quota', function () { 105 describe('When having an absolute and daily video quota', function () {
119 it('Should fail if exceeding total quota', async function () { 106 it('Should fail if exceeding total quota', async function () {
120 await updateUser({ 107 await server.usersCommand.update({
121 url: server.url,
122 userId: rootId, 108 userId: rootId,
123 accessToken: server.accessToken,
124 videoQuota: 42, 109 videoQuota: 42,
125 videoQuotaDaily: 1024 * 1024 * 1024 110 videoQuotaDaily: 1024 * 1024 * 1024
126 }) 111 })
@@ -130,10 +115,8 @@ describe('Test upload quota', function () {
130 }) 115 })
131 116
132 it('Should fail if exceeding daily quota', async function () { 117 it('Should fail if exceeding daily quota', async function () {
133 await updateUser({ 118 await server.usersCommand.update({
134 url: server.url,
135 userId: rootId, 119 userId: rootId,
136 accessToken: server.accessToken,
137 videoQuota: 1024 * 1024 * 1024, 120 videoQuota: 1024 * 1024 * 1024,
138 videoQuotaDaily: 42 121 videoQuotaDaily: 42
139 }) 122 })
diff --git a/server/tests/api/check-params/user-subscriptions.ts b/server/tests/api/check-params/user-subscriptions.ts
index 64e2703b9..8ce201d61 100644
--- a/server/tests/api/check-params/user-subscriptions.ts
+++ b/server/tests/api/check-params/user-subscriptions.ts
@@ -4,7 +4,6 @@ import 'mocha'
4 4
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 makeDeleteRequest, 8 makeDeleteRequest,
10 makeGetRequest, 9 makeGetRequest,
@@ -39,7 +38,7 @@ describe('Test user subscriptions API validators', function () {
39 username: 'user1', 38 username: 'user1',
40 password: 'my super password' 39 password: 'my super password'
41 } 40 }
42 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 41 await server.usersCommand.create({ username: user.username, password: user.password })
43 userAccessToken = await server.loginCommand.getAccessToken(user) 42 userAccessToken = await server.loginCommand.getAccessToken(user)
44 }) 43 })
45 44
diff --git a/server/tests/api/check-params/users.ts b/server/tests/api/check-params/users.ts
index 54baeebe1..801131918 100644
--- a/server/tests/api/check-params/users.ts
+++ b/server/tests/api/check-params/users.ts
@@ -2,32 +2,22 @@
2 2
3import 'mocha' 3import 'mocha'
4import { omit } from 'lodash' 4import { omit } from 'lodash'
5import { User, UserRole, VideoCreateResult } from '../../../../shared' 5import { UserRole, VideoCreateResult } from '../../../../shared'
6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 6import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
7import { 7import {
8 blockUser,
9 buildAbsoluteFixturePath, 8 buildAbsoluteFixturePath,
10 cleanupTests, 9 cleanupTests,
11 createUser,
12 deleteMe,
13 flushAndRunServer, 10 flushAndRunServer,
14 getMyUserInformation,
15 getMyUserVideoRating,
16 getUserScopedTokens,
17 getUsersList,
18 killallServers, 11 killallServers,
19 makeGetRequest, 12 makeGetRequest,
20 makePostBodyRequest, 13 makePostBodyRequest,
21 makePutBodyRequest, 14 makePutBodyRequest,
22 makeUploadRequest, 15 makeUploadRequest,
23 registerUser,
24 removeUser,
25 renewUserScopedTokens,
26 reRunServer, 16 reRunServer,
27 ServerInfo, 17 ServerInfo,
28 setAccessTokensToServers, 18 setAccessTokensToServers,
29 unblockUser, 19 uploadVideo,
30 uploadVideo 20 UsersCommand
31} from '../../../../shared/extra-utils' 21} from '../../../../shared/extra-utils'
32import { MockSmtpServer } from '../../../../shared/extra-utils/mock-servers/mock-email' 22import { MockSmtpServer } from '../../../../shared/extra-utils/mock-servers/mock-email'
33import { 23import {
@@ -45,8 +35,8 @@ describe('Test users API validators', function () {
45 let video: VideoCreateResult 35 let video: VideoCreateResult
46 let server: ServerInfo 36 let server: ServerInfo
47 let serverWithRegistrationDisabled: ServerInfo 37 let serverWithRegistrationDisabled: ServerInfo
48 let userAccessToken = '' 38 let userToken = ''
49 let moderatorAccessToken = '' 39 let moderatorToken = ''
50 let emailPort: number 40 let emailPort: number
51 let overrideConfig: Object 41 let overrideConfig: Object
52 42
@@ -73,52 +63,20 @@ describe('Test users API validators', function () {
73 } 63 }
74 64
75 { 65 {
76 const user = { 66 const user = { username: 'user1' }
77 username: 'user1', 67 await server.usersCommand.create({ ...user })
78 password: 'my super password' 68 userToken = await server.loginCommand.getAccessToken(user)
79 }
80
81 const videoQuota = 42000000
82 await createUser({
83 url: server.url,
84 accessToken: server.accessToken,
85 username: user.username,
86 password: user.password,
87 videoQuota: videoQuota
88 })
89 userAccessToken = await server.loginCommand.getAccessToken(user)
90 } 69 }
91 70
92 { 71 {
93 const moderator = { 72 const moderator = { username: 'moderator1' }
94 username: 'moderator1', 73 await server.usersCommand.create({ ...moderator, role: UserRole.MODERATOR })
95 password: 'super password' 74 moderatorToken = await server.loginCommand.getAccessToken(moderator)
96 }
97
98 await createUser({
99 url: server.url,
100 accessToken: server.accessToken,
101 username: moderator.username,
102 password: moderator.password,
103 role: UserRole.MODERATOR
104 })
105
106 moderatorAccessToken = await server.loginCommand.getAccessToken(moderator)
107 } 75 }
108 76
109 { 77 {
110 const moderator = { 78 const moderator = { username: 'moderator2' }
111 username: 'moderator2', 79 await server.usersCommand.create({ ...moderator, role: UserRole.MODERATOR })
112 password: 'super password'
113 }
114
115 await createUser({
116 url: server.url,
117 accessToken: server.accessToken,
118 username: moderator.username,
119 password: moderator.password,
120 role: UserRole.MODERATOR
121 })
122 } 80 }
123 81
124 { 82 {
@@ -127,12 +85,10 @@ describe('Test users API validators', function () {
127 } 85 }
128 86
129 { 87 {
130 const res = await getUsersList(server.url, server.accessToken) 88 const { data } = await server.usersCommand.list()
131 const users: User[] = res.body.data 89 userId = data.find(u => u.username === 'user1').id
132 90 rootId = data.find(u => u.username === 'root').id
133 userId = users.find(u => u.username === 'user1').id 91 moderatorId = data.find(u => u.username === 'moderator2').id
134 rootId = users.find(u => u.username === 'root').id
135 moderatorId = users.find(u => u.username === 'moderator2').id
136 } 92 }
137 }) 93 })
138 94
@@ -161,7 +117,7 @@ describe('Test users API validators', function () {
161 await makeGetRequest({ 117 await makeGetRequest({
162 url: server.url, 118 url: server.url,
163 path, 119 path,
164 token: userAccessToken, 120 token: userToken,
165 statusCodeExpected: HttpStatusCode.FORBIDDEN_403 121 statusCodeExpected: HttpStatusCode.FORBIDDEN_403
166 }) 122 })
167 }) 123 })
@@ -359,7 +315,7 @@ describe('Test users API validators', function () {
359 await makePostBodyRequest({ 315 await makePostBodyRequest({
360 url: server.url, 316 url: server.url,
361 path, 317 path,
362 token: moderatorAccessToken, 318 token: moderatorToken,
363 fields, 319 fields,
364 statusCodeExpected: HttpStatusCode.FORBIDDEN_403 320 statusCodeExpected: HttpStatusCode.FORBIDDEN_403
365 }) 321 })
@@ -372,7 +328,7 @@ describe('Test users API validators', function () {
372 await makePostBodyRequest({ 328 await makePostBodyRequest({
373 url: server.url, 329 url: server.url,
374 path, 330 path,
375 token: moderatorAccessToken, 331 token: moderatorToken,
376 fields, 332 fields,
377 statusCodeExpected: HttpStatusCode.OK_200 333 statusCodeExpected: HttpStatusCode.OK_200
378 }) 334 })
@@ -389,11 +345,8 @@ describe('Test users API validators', function () {
389 }) 345 })
390 346
391 it('Should fail with a non admin user', async function () { 347 it('Should fail with a non admin user', async function () {
392 const user = { 348 const user = { username: 'user1' }
393 username: 'user1', 349 userToken = await server.loginCommand.getAccessToken(user)
394 password: 'my super password'
395 }
396 userAccessToken = await server.loginCommand.getAccessToken(user)
397 350
398 const fields = { 351 const fields = {
399 username: 'user3', 352 username: 'user3',
@@ -401,11 +354,12 @@ describe('Test users API validators', function () {
401 password: 'my super password', 354 password: 'my super password',
402 videoQuota: 42000000 355 videoQuota: 42000000
403 } 356 }
404 await makePostBodyRequest({ url: server.url, path, token: userAccessToken, fields, statusCodeExpected: HttpStatusCode.FORBIDDEN_403 }) 357 await makePostBodyRequest({ url: server.url, path, token: userToken, fields, statusCodeExpected: HttpStatusCode.FORBIDDEN_403 })
405 }) 358 })
406 }) 359 })
407 360
408 describe('When updating my account', function () { 361 describe('When updating my account', function () {
362
409 it('Should fail with an invalid email attribute', async function () { 363 it('Should fail with an invalid email attribute', async function () {
410 const fields = { 364 const fields = {
411 email: 'blabla' 365 email: 'blabla'
@@ -416,29 +370,29 @@ describe('Test users API validators', function () {
416 370
417 it('Should fail with a too small password', async function () { 371 it('Should fail with a too small password', async function () {
418 const fields = { 372 const fields = {
419 currentPassword: 'my super password', 373 currentPassword: 'password',
420 password: 'bla' 374 password: 'bla'
421 } 375 }
422 376
423 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 377 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
424 }) 378 })
425 379
426 it('Should fail with a too long password', async function () { 380 it('Should fail with a too long password', async function () {
427 const fields = { 381 const fields = {
428 currentPassword: 'my super password', 382 currentPassword: 'password',
429 password: 'super'.repeat(61) 383 password: 'super'.repeat(61)
430 } 384 }
431 385
432 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 386 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
433 }) 387 })
434 388
435 it('Should fail without the current password', async function () { 389 it('Should fail without the current password', async function () {
436 const fields = { 390 const fields = {
437 currentPassword: 'my super password', 391 currentPassword: 'password',
438 password: 'super'.repeat(61) 392 password: 'super'.repeat(61)
439 } 393 }
440 394
441 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 395 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
442 }) 396 })
443 397
444 it('Should fail with an invalid current password', async function () { 398 it('Should fail with an invalid current password', async function () {
@@ -450,7 +404,7 @@ describe('Test users API validators', function () {
450 await makePutBodyRequest({ 404 await makePutBodyRequest({
451 url: server.url, 405 url: server.url,
452 path: path + 'me', 406 path: path + 'me',
453 token: userAccessToken, 407 token: userToken,
454 fields, 408 fields,
455 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401 409 statusCodeExpected: HttpStatusCode.UNAUTHORIZED_401
456 }) 410 })
@@ -461,7 +415,7 @@ describe('Test users API validators', function () {
461 nsfwPolicy: 'hello' 415 nsfwPolicy: 'hello'
462 } 416 }
463 417
464 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 418 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
465 }) 419 })
466 420
467 it('Should fail with an invalid autoPlayVideo attribute', async function () { 421 it('Should fail with an invalid autoPlayVideo attribute', async function () {
@@ -469,7 +423,7 @@ describe('Test users API validators', function () {
469 autoPlayVideo: -1 423 autoPlayVideo: -1
470 } 424 }
471 425
472 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 426 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
473 }) 427 })
474 428
475 it('Should fail with an invalid autoPlayNextVideo attribute', async function () { 429 it('Should fail with an invalid autoPlayNextVideo attribute', async function () {
@@ -477,7 +431,7 @@ describe('Test users API validators', function () {
477 autoPlayNextVideo: -1 431 autoPlayNextVideo: -1
478 } 432 }
479 433
480 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 434 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
481 }) 435 })
482 436
483 it('Should fail with an invalid videosHistoryEnabled attribute', async function () { 437 it('Should fail with an invalid videosHistoryEnabled attribute', async function () {
@@ -485,12 +439,12 @@ describe('Test users API validators', function () {
485 videosHistoryEnabled: -1 439 videosHistoryEnabled: -1
486 } 440 }
487 441
488 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 442 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
489 }) 443 })
490 444
491 it('Should fail with an non authenticated user', async function () { 445 it('Should fail with an non authenticated user', async function () {
492 const fields = { 446 const fields = {
493 currentPassword: 'my super password', 447 currentPassword: 'password',
494 password: 'my super password' 448 password: 'my super password'
495 } 449 }
496 450
@@ -508,7 +462,7 @@ describe('Test users API validators', function () {
508 description: 'super'.repeat(201) 462 description: 'super'.repeat(201)
509 } 463 }
510 464
511 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 465 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
512 }) 466 })
513 467
514 it('Should fail with an invalid videoLanguages attribute', async function () { 468 it('Should fail with an invalid videoLanguages attribute', async function () {
@@ -517,7 +471,7 @@ describe('Test users API validators', function () {
517 videoLanguages: 'toto' 471 videoLanguages: 'toto'
518 } 472 }
519 473
520 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 474 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
521 } 475 }
522 476
523 { 477 {
@@ -530,18 +484,18 @@ describe('Test users API validators', function () {
530 videoLanguages: languages 484 videoLanguages: languages
531 } 485 }
532 486
533 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 487 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
534 } 488 }
535 }) 489 })
536 490
537 it('Should fail with an invalid theme', async function () { 491 it('Should fail with an invalid theme', async function () {
538 const fields = { theme: 'invalid' } 492 const fields = { theme: 'invalid' }
539 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 493 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
540 }) 494 })
541 495
542 it('Should fail with an unknown theme', async function () { 496 it('Should fail with an unknown theme', async function () {
543 const fields = { theme: 'peertube-theme-unknown' } 497 const fields = { theme: 'peertube-theme-unknown' }
544 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 498 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
545 }) 499 })
546 500
547 it('Should fail with an invalid noInstanceConfigWarningModal attribute', async function () { 501 it('Should fail with an invalid noInstanceConfigWarningModal attribute', async function () {
@@ -549,7 +503,7 @@ describe('Test users API validators', function () {
549 noInstanceConfigWarningModal: -1 503 noInstanceConfigWarningModal: -1
550 } 504 }
551 505
552 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 506 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
553 }) 507 })
554 508
555 it('Should fail with an invalid noWelcomeModal attribute', async function () { 509 it('Should fail with an invalid noWelcomeModal attribute', async function () {
@@ -557,12 +511,12 @@ describe('Test users API validators', function () {
557 noWelcomeModal: -1 511 noWelcomeModal: -1
558 } 512 }
559 513
560 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 514 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userToken, fields })
561 }) 515 })
562 516
563 it('Should succeed to change password with the correct params', async function () { 517 it('Should succeed to change password with the correct params', async function () {
564 const fields = { 518 const fields = {
565 currentPassword: 'my super password', 519 currentPassword: 'password',
566 password: 'my super password', 520 password: 'my super password',
567 nsfwPolicy: 'blur', 521 nsfwPolicy: 'blur',
568 autoPlayVideo: false, 522 autoPlayVideo: false,
@@ -575,7 +529,7 @@ describe('Test users API validators', function () {
575 await makePutBodyRequest({ 529 await makePutBodyRequest({
576 url: server.url, 530 url: server.url,
577 path: path + 'me', 531 path: path + 'me',
578 token: userAccessToken, 532 token: userToken,
579 fields, 533 fields,
580 statusCodeExpected: HttpStatusCode.NO_CONTENT_204 534 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
581 }) 535 })
@@ -590,7 +544,7 @@ describe('Test users API validators', function () {
590 await makePutBodyRequest({ 544 await makePutBodyRequest({
591 url: server.url, 545 url: server.url,
592 path: path + 'me', 546 path: path + 'me',
593 token: userAccessToken, 547 token: userToken,
594 fields, 548 fields,
595 statusCodeExpected: HttpStatusCode.NO_CONTENT_204 549 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
596 }) 550 })
@@ -647,28 +601,28 @@ describe('Test users API validators', function () {
647 describe('When managing my scoped tokens', function () { 601 describe('When managing my scoped tokens', function () {
648 602
649 it('Should fail to get my scoped tokens with an non authenticated user', async function () { 603 it('Should fail to get my scoped tokens with an non authenticated user', async function () {
650 await getUserScopedTokens(server.url, null, HttpStatusCode.UNAUTHORIZED_401) 604 await server.usersCommand.getMyScopedTokens({ token: null, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
651 }) 605 })
652 606
653 it('Should fail to get my scoped tokens with a bad token', async function () { 607 it('Should fail to get my scoped tokens with a bad token', async function () {
654 await getUserScopedTokens(server.url, 'bad', HttpStatusCode.UNAUTHORIZED_401) 608 await server.usersCommand.getMyScopedTokens({ token: 'bad', expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
655 609
656 }) 610 })
657 611
658 it('Should succeed to get my scoped tokens', async function () { 612 it('Should succeed to get my scoped tokens', async function () {
659 await getUserScopedTokens(server.url, server.accessToken) 613 await server.usersCommand.getMyScopedTokens()
660 }) 614 })
661 615
662 it('Should fail to renew my scoped tokens with an non authenticated user', async function () { 616 it('Should fail to renew my scoped tokens with an non authenticated user', async function () {
663 await renewUserScopedTokens(server.url, null, HttpStatusCode.UNAUTHORIZED_401) 617 await server.usersCommand.renewMyScopedTokens({ token: null, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
664 }) 618 })
665 619
666 it('Should fail to renew my scoped tokens with a bad token', async function () { 620 it('Should fail to renew my scoped tokens with a bad token', async function () {
667 await renewUserScopedTokens(server.url, 'bad', HttpStatusCode.UNAUTHORIZED_401) 621 await server.usersCommand.renewMyScopedTokens({ token: 'bad', expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
668 }) 622 })
669 623
670 it('Should succeed to renew my scoped tokens', async function () { 624 it('Should succeed to renew my scoped tokens', async function () {
671 await renewUserScopedTokens(server.url, server.accessToken) 625 await server.usersCommand.renewMyScopedTokens()
672 }) 626 })
673 }) 627 })
674 628
@@ -684,7 +638,7 @@ describe('Test users API validators', function () {
684 }) 638 })
685 639
686 it('Should fail with a non admin user', async function () { 640 it('Should fail with a non admin user', async function () {
687 await makeGetRequest({ url: server.url, path, token: userAccessToken, statusCodeExpected: HttpStatusCode.FORBIDDEN_403 }) 641 await makeGetRequest({ url: server.url, path, token: userToken, statusCodeExpected: HttpStatusCode.FORBIDDEN_403 })
688 }) 642 })
689 643
690 it('Should succeed with the correct params', async function () { 644 it('Should succeed with the correct params', async function () {
@@ -728,7 +682,7 @@ describe('Test users API validators', function () {
728 682
729 it('Should fail with a too small password', async function () { 683 it('Should fail with a too small password', async function () {
730 const fields = { 684 const fields = {
731 currentPassword: 'my super password', 685 currentPassword: 'password',
732 password: 'bla' 686 password: 'bla'
733 } 687 }
734 688
@@ -737,7 +691,7 @@ describe('Test users API validators', function () {
737 691
738 it('Should fail with a too long password', async function () { 692 it('Should fail with a too long password', async function () {
739 const fields = { 693 const fields = {
740 currentPassword: 'my super password', 694 currentPassword: 'password',
741 password: 'super'.repeat(61) 695 password: 'super'.repeat(61)
742 } 696 }
743 697
@@ -780,7 +734,7 @@ describe('Test users API validators', function () {
780 await makePutBodyRequest({ 734 await makePutBodyRequest({
781 url: server.url, 735 url: server.url,
782 path: path + moderatorId, 736 path: path + moderatorId,
783 token: moderatorAccessToken, 737 token: moderatorToken,
784 fields, 738 fields,
785 statusCodeExpected: HttpStatusCode.FORBIDDEN_403 739 statusCodeExpected: HttpStatusCode.FORBIDDEN_403
786 }) 740 })
@@ -794,7 +748,7 @@ describe('Test users API validators', function () {
794 await makePutBodyRequest({ 748 await makePutBodyRequest({
795 url: server.url, 749 url: server.url,
796 path: path + userId, 750 path: path + userId,
797 token: moderatorAccessToken, 751 token: moderatorToken,
798 fields, 752 fields,
799 statusCodeExpected: HttpStatusCode.NO_CONTENT_204 753 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
800 }) 754 })
@@ -820,31 +774,37 @@ describe('Test users API validators', function () {
820 774
821 describe('When getting my information', function () { 775 describe('When getting my information', function () {
822 it('Should fail with a non authenticated user', async function () { 776 it('Should fail with a non authenticated user', async function () {
823 await getMyUserInformation(server.url, 'fake_token', HttpStatusCode.UNAUTHORIZED_401) 777 await server.usersCommand.getMyInfo({ token: 'fake_token', expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
824 }) 778 })
825 779
826 it('Should success with the correct parameters', async function () { 780 it('Should success with the correct parameters', async function () {
827 await getMyUserInformation(server.url, userAccessToken) 781 await server.usersCommand.getMyInfo({ token: userToken })
828 }) 782 })
829 }) 783 })
830 784
831 describe('When getting my video rating', function () { 785 describe('When getting my video rating', function () {
786 let command: UsersCommand
787
788 before(function () {
789 command = server.usersCommand
790 })
791
832 it('Should fail with a non authenticated user', async function () { 792 it('Should fail with a non authenticated user', async function () {
833 await getMyUserVideoRating(server.url, 'fake_token', video.id, HttpStatusCode.UNAUTHORIZED_401) 793 await command.getMyRating({ token: 'fake_token', videoId: video.id, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
834 }) 794 })
835 795
836 it('Should fail with an incorrect video uuid', async function () { 796 it('Should fail with an incorrect video uuid', async function () {
837 await getMyUserVideoRating(server.url, server.accessToken, 'blabla', HttpStatusCode.BAD_REQUEST_400) 797 await command.getMyRating({ videoId: 'blabla', expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
838 }) 798 })
839 799
840 it('Should fail with an unknown video', async function () { 800 it('Should fail with an unknown video', async function () {
841 await getMyUserVideoRating(server.url, server.accessToken, '4da6fde3-88f7-4d16-b119-108df5630b06', HttpStatusCode.NOT_FOUND_404) 801 await command.getMyRating({ videoId: '4da6fde3-88f7-4d16-b119-108df5630b06', expectedStatus: HttpStatusCode.NOT_FOUND_404 })
842 }) 802 })
843 803
844 it('Should succeed with the correct parameters', async function () { 804 it('Should succeed with the correct parameters', async function () {
845 await getMyUserVideoRating(server.url, server.accessToken, video.id) 805 await command.getMyRating({ videoId: video.id })
846 await getMyUserVideoRating(server.url, server.accessToken, video.uuid) 806 await command.getMyRating({ videoId: video.uuid })
847 await getMyUserVideoRating(server.url, server.accessToken, video.shortUUID) 807 await command.getMyRating({ videoId: video.shortUUID })
848 }) 808 })
849 }) 809 })
850 810
@@ -852,15 +812,15 @@ describe('Test users API validators', function () {
852 const path = '/api/v1/accounts/user1/ratings' 812 const path = '/api/v1/accounts/user1/ratings'
853 813
854 it('Should fail with a bad start pagination', async function () { 814 it('Should fail with a bad start pagination', async function () {
855 await checkBadStartPagination(server.url, path, userAccessToken) 815 await checkBadStartPagination(server.url, path, userToken)
856 }) 816 })
857 817
858 it('Should fail with a bad count pagination', async function () { 818 it('Should fail with a bad count pagination', async function () {
859 await checkBadCountPagination(server.url, path, userAccessToken) 819 await checkBadCountPagination(server.url, path, userToken)
860 }) 820 })
861 821
862 it('Should fail with an incorrect sort', async function () { 822 it('Should fail with an incorrect sort', async function () {
863 await checkBadSortPagination(server.url, path, userAccessToken) 823 await checkBadSortPagination(server.url, path, userToken)
864 }) 824 })
865 825
866 it('Should fail with a unauthenticated user', async function () { 826 it('Should fail with a unauthenticated user', async function () {
@@ -875,57 +835,70 @@ describe('Test users API validators', function () {
875 await makeGetRequest({ 835 await makeGetRequest({
876 url: server.url, 836 url: server.url,
877 path, 837 path,
878 token: userAccessToken, 838 token: userToken,
879 query: { rating: 'toto ' }, 839 query: { rating: 'toto ' },
880 statusCodeExpected: HttpStatusCode.BAD_REQUEST_400 840 statusCodeExpected: HttpStatusCode.BAD_REQUEST_400
881 }) 841 })
882 }) 842 })
883 843
884 it('Should succeed with the correct params', async function () { 844 it('Should succeed with the correct params', async function () {
885 await makeGetRequest({ url: server.url, path, token: userAccessToken, statusCodeExpected: HttpStatusCode.OK_200 }) 845 await makeGetRequest({ url: server.url, path, token: userToken, statusCodeExpected: HttpStatusCode.OK_200 })
886 }) 846 })
887 }) 847 })
888 848
889 describe('When blocking/unblocking/removing user', function () { 849 describe('When blocking/unblocking/removing user', function () {
850
890 it('Should fail with an incorrect id', async function () { 851 it('Should fail with an incorrect id', async function () {
891 await removeUser(server.url, 'blabla', server.accessToken, HttpStatusCode.BAD_REQUEST_400) 852 const options = { userId: 'blabla' as any, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }
892 await blockUser(server.url, 'blabla', server.accessToken, HttpStatusCode.BAD_REQUEST_400) 853
893 await unblockUser(server.url, 'blabla', server.accessToken, HttpStatusCode.BAD_REQUEST_400) 854 await server.usersCommand.remove(options)
855 await server.usersCommand.banUser({ userId: 'blabla' as any, expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
856 await server.usersCommand.unbanUser({ userId: 'blabla' as any, expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
894 }) 857 })
895 858
896 it('Should fail with the root user', async function () { 859 it('Should fail with the root user', async function () {
897 await removeUser(server.url, rootId, server.accessToken, HttpStatusCode.BAD_REQUEST_400) 860 const options = { userId: rootId, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }
898 await blockUser(server.url, rootId, server.accessToken, HttpStatusCode.BAD_REQUEST_400) 861
899 await unblockUser(server.url, rootId, server.accessToken, HttpStatusCode.BAD_REQUEST_400) 862 await server.usersCommand.remove(options)
863 await server.usersCommand.banUser(options)
864 await server.usersCommand.unbanUser(options)
900 }) 865 })
901 866
902 it('Should return 404 with a non existing id', async function () { 867 it('Should return 404 with a non existing id', async function () {
903 await removeUser(server.url, 4545454, server.accessToken, HttpStatusCode.NOT_FOUND_404) 868 const options = { userId: 4545454, expectedStatus: HttpStatusCode.NOT_FOUND_404 }
904 await blockUser(server.url, 4545454, server.accessToken, HttpStatusCode.NOT_FOUND_404) 869
905 await unblockUser(server.url, 4545454, server.accessToken, HttpStatusCode.NOT_FOUND_404) 870 await server.usersCommand.remove(options)
871 await server.usersCommand.banUser(options)
872 await server.usersCommand.unbanUser(options)
906 }) 873 })
907 874
908 it('Should fail with a non admin user', async function () { 875 it('Should fail with a non admin user', async function () {
909 await removeUser(server.url, userId, userAccessToken, HttpStatusCode.FORBIDDEN_403) 876 const options = { userId, token: userToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 }
910 await blockUser(server.url, userId, userAccessToken, HttpStatusCode.FORBIDDEN_403) 877
911 await unblockUser(server.url, userId, userAccessToken, HttpStatusCode.FORBIDDEN_403) 878 await server.usersCommand.remove(options)
879 await server.usersCommand.banUser(options)
880 await server.usersCommand.unbanUser(options)
912 }) 881 })
913 882
914 it('Should fail on a moderator with a moderator', async function () { 883 it('Should fail on a moderator with a moderator', async function () {
915 await removeUser(server.url, moderatorId, moderatorAccessToken, HttpStatusCode.FORBIDDEN_403) 884 const options = { userId: moderatorId, token: moderatorToken, expectedStatus: HttpStatusCode.FORBIDDEN_403 }
916 await blockUser(server.url, moderatorId, moderatorAccessToken, HttpStatusCode.FORBIDDEN_403) 885
917 await unblockUser(server.url, moderatorId, moderatorAccessToken, HttpStatusCode.FORBIDDEN_403) 886 await server.usersCommand.remove(options)
887 await server.usersCommand.banUser(options)
888 await server.usersCommand.unbanUser(options)
918 }) 889 })
919 890
920 it('Should succeed on a user with a moderator', async function () { 891 it('Should succeed on a user with a moderator', async function () {
921 await blockUser(server.url, userId, moderatorAccessToken) 892 const options = { userId, token: moderatorToken }
922 await unblockUser(server.url, userId, moderatorAccessToken) 893
894 await server.usersCommand.banUser(options)
895 await server.usersCommand.unbanUser(options)
923 }) 896 })
924 }) 897 })
925 898
926 describe('When deleting our account', function () { 899 describe('When deleting our account', function () {
927 it('Should fail with with the root account', async function () { 900 it('Should fail with with the root account', async function () {
928 await deleteMe(server.url, server.accessToken, HttpStatusCode.BAD_REQUEST_400) 901 await server.usersCommand.deleteMe({ expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
929 }) 902 })
930 }) 903 })
931 904
@@ -1087,7 +1060,7 @@ describe('Test users API validators', function () {
1087 1060
1088 describe('When registering multiple users on a server with users limit', function () { 1061 describe('When registering multiple users on a server with users limit', function () {
1089 it('Should fail when after 3 registrations', async function () { 1062 it('Should fail when after 3 registrations', async function () {
1090 await registerUser(server.url, 'user42', 'super password', HttpStatusCode.FORBIDDEN_403) 1063 await server.usersCommand.register({ username: 'user42', expectedStatus: HttpStatusCode.FORBIDDEN_403 })
1091 }) 1064 })
1092 }) 1065 })
1093 1066
diff --git a/server/tests/api/check-params/video-blacklist.ts b/server/tests/api/check-params/video-blacklist.ts
index c33bc196d..5097f8069 100644
--- a/server/tests/api/check-params/video-blacklist.ts
+++ b/server/tests/api/check-params/video-blacklist.ts
@@ -9,7 +9,6 @@ import {
9 checkBadSortPagination, 9 checkBadSortPagination,
10 checkBadStartPagination, 10 checkBadStartPagination,
11 cleanupTests, 11 cleanupTests,
12 createUser,
13 doubleFollow, 12 doubleFollow,
14 flushAndRunMultipleServers, 13 flushAndRunMultipleServers,
15 getVideo, 14 getVideo,
@@ -44,14 +43,14 @@ describe('Test video blacklist API validators', function () {
44 { 43 {
45 const username = 'user1' 44 const username = 'user1'
46 const password = 'my super password' 45 const password = 'my super password'
47 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: username, password: password }) 46 await servers[0].usersCommand.create({ username: username, password: password })
48 userAccessToken1 = await servers[0].loginCommand.getAccessToken({ username, password }) 47 userAccessToken1 = await servers[0].loginCommand.getAccessToken({ username, password })
49 } 48 }
50 49
51 { 50 {
52 const username = 'user2' 51 const username = 'user2'
53 const password = 'my super password' 52 const password = 'my super password'
54 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: username, password: password }) 53 await servers[0].usersCommand.create({ username: username, password: password })
55 userAccessToken2 = await servers[0].loginCommand.getAccessToken({ username, password }) 54 userAccessToken2 = await servers[0].loginCommand.getAccessToken({ username, password })
56 } 55 }
57 56
diff --git a/server/tests/api/check-params/video-captions.ts b/server/tests/api/check-params/video-captions.ts
index f2fd61b91..631ef4dac 100644
--- a/server/tests/api/check-params/video-captions.ts
+++ b/server/tests/api/check-params/video-captions.ts
@@ -5,7 +5,6 @@ import { HttpStatusCode } from '@shared/core-utils'
5import { 5import {
6 buildAbsoluteFixturePath, 6 buildAbsoluteFixturePath,
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 flushAndRunServer, 8 flushAndRunServer,
10 makeDeleteRequest, 9 makeDeleteRequest,
11 makeGetRequest, 10 makeGetRequest,
@@ -42,7 +41,7 @@ describe('Test video captions API validator', function () {
42 username: 'user1', 41 username: 'user1',
43 password: 'my super password' 42 password: 'my super password'
44 } 43 }
45 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 44 await server.usersCommand.create({ username: user.username, password: user.password })
46 userAccessToken = await server.loginCommand.getAccessToken(user) 45 userAccessToken = await server.loginCommand.getAccessToken(user)
47 } 46 }
48 }) 47 })
diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts
index 5361f6917..2b4c17ea1 100644
--- a/server/tests/api/check-params/video-channels.ts
+++ b/server/tests/api/check-params/video-channels.ts
@@ -11,7 +11,6 @@ import {
11 checkBadSortPagination, 11 checkBadSortPagination,
12 checkBadStartPagination, 12 checkBadStartPagination,
13 cleanupTests, 13 cleanupTests,
14 createUser,
15 flushAndRunServer, 14 flushAndRunServer,
16 makeGetRequest, 15 makeGetRequest,
17 makePostBodyRequest, 16 makePostBodyRequest,
@@ -45,7 +44,7 @@ describe('Test video channels API validator', function () {
45 } 44 }
46 45
47 { 46 {
48 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 47 await server.usersCommand.create({ username: user.username, password: user.password })
49 accessTokenUser = await server.loginCommand.getAccessToken(user) 48 accessTokenUser = await server.loginCommand.getAccessToken(user)
50 } 49 }
51 50
diff --git a/server/tests/api/check-params/video-comments.ts b/server/tests/api/check-params/video-comments.ts
index c21aebaae..b7656a176 100644
--- a/server/tests/api/check-params/video-comments.ts
+++ b/server/tests/api/check-params/video-comments.ts
@@ -8,7 +8,6 @@ import {
8 checkBadSortPagination, 8 checkBadSortPagination,
9 checkBadStartPagination, 9 checkBadStartPagination,
10 cleanupTests, 10 cleanupTests,
11 createUser,
12 flushAndRunServer, 11 flushAndRunServer,
13 makeDeleteRequest, 12 makeDeleteRequest,
14 makeGetRequest, 13 makeGetRequest,
@@ -53,13 +52,13 @@ describe('Test video comments API validator', function () {
53 52
54 { 53 {
55 const user = { username: 'user1', password: 'my super password' } 54 const user = { username: 'user1', password: 'my super password' }
56 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 55 await server.usersCommand.create({ username: user.username, password: user.password })
57 userAccessToken = await server.loginCommand.getAccessToken(user) 56 userAccessToken = await server.loginCommand.getAccessToken(user)
58 } 57 }
59 58
60 { 59 {
61 const user = { username: 'user2', password: 'my super password' } 60 const user = { username: 'user2', password: 'my super password' }
62 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 61 await server.usersCommand.create({ username: user.username, password: user.password })
63 userAccessToken2 = await server.loginCommand.getAccessToken(user) 62 userAccessToken2 = await server.loginCommand.getAccessToken(user)
64 } 63 }
65 }) 64 })
diff --git a/server/tests/api/check-params/video-imports.ts b/server/tests/api/check-params/video-imports.ts
index 51260affa..d09e473de 100644
--- a/server/tests/api/check-params/video-imports.ts
+++ b/server/tests/api/check-params/video-imports.ts
@@ -9,9 +9,7 @@ import {
9 checkBadSortPagination, 9 checkBadSortPagination,
10 checkBadStartPagination, 10 checkBadStartPagination,
11 cleanupTests, 11 cleanupTests,
12 createUser,
13 flushAndRunServer, 12 flushAndRunServer,
14 getMyUserInformation,
15 ImportsCommand, 13 ImportsCommand,
16 makeGetRequest, 14 makeGetRequest,
17 makePostBodyRequest, 15 makePostBodyRequest,
@@ -38,12 +36,12 @@ describe('Test video imports API validator', function () {
38 36
39 const username = 'user1' 37 const username = 'user1'
40 const password = 'my super password' 38 const password = 'my super password'
41 await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password }) 39 await server.usersCommand.create({ username: username, password: password })
42 userAccessToken = await server.loginCommand.getAccessToken({ username, password }) 40 userAccessToken = await server.loginCommand.getAccessToken({ username, password })
43 41
44 { 42 {
45 const res = await getMyUserInformation(server.url, server.accessToken) 43 const { videoChannels } = await server.usersCommand.getMyInfo()
46 channelId = res.body.videoChannels[0].id 44 channelId = videoChannels[0].id
47 } 45 }
48 }) 46 })
49 47
@@ -164,11 +162,11 @@ describe('Test video imports API validator', function () {
164 username: 'fake', 162 username: 'fake',
165 password: 'fake_password' 163 password: 'fake_password'
166 } 164 }
167 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 165 await server.usersCommand.create({ username: user.username, password: user.password })
168 166
169 const accessTokenUser = await server.loginCommand.getAccessToken(user) 167 const accessTokenUser = await server.loginCommand.getAccessToken(user)
170 const res = await getMyUserInformation(server.url, accessTokenUser) 168 const { videoChannels } = await server.usersCommand.getMyInfo({ token: accessTokenUser })
171 const customChannelId = res.body.videoChannels[0].id 169 const customChannelId = videoChannels[0].id
172 170
173 const fields = { ...baseCorrectParams, channelId: customChannelId } 171 const fields = { ...baseCorrectParams, channelId: customChannelId }
174 172
diff --git a/server/tests/api/check-params/video-playlists.ts b/server/tests/api/check-params/video-playlists.ts
index 3799e73b6..46c09bb11 100644
--- a/server/tests/api/check-params/video-playlists.ts
+++ b/server/tests/api/check-params/video-playlists.ts
@@ -17,7 +17,6 @@ import {
17 checkBadStartPagination, 17 checkBadStartPagination,
18 cleanupTests, 18 cleanupTests,
19 flushAndRunServer, 19 flushAndRunServer,
20 generateUserAccessToken,
21 makeGetRequest, 20 makeGetRequest,
22 PlaylistsCommand, 21 PlaylistsCommand,
23 ServerInfo, 22 ServerInfo,
@@ -49,7 +48,7 @@ describe('Test video playlists API validator', function () {
49 await setAccessTokensToServers([ server ]) 48 await setAccessTokensToServers([ server ])
50 await setDefaultVideoChannel([ server ]) 49 await setDefaultVideoChannel([ server ])
51 50
52 userAccessToken = await generateUserAccessToken(server, 'user1') 51 userAccessToken = await server.usersCommand.generateUserAndToken('user1')
53 videoId = (await uploadVideoAndGetId({ server, videoName: 'video 1' })).id 52 videoId = (await uploadVideoAndGetId({ server, videoName: 'video 1' })).id
54 53
55 command = server.playlistsCommand 54 command = server.playlistsCommand
diff --git a/server/tests/api/check-params/videos-filter.ts b/server/tests/api/check-params/videos-filter.ts
index 095b94656..d7bf081d4 100644
--- a/server/tests/api/check-params/videos-filter.ts
+++ b/server/tests/api/check-params/videos-filter.ts
@@ -3,7 +3,6 @@
3import 'mocha' 3import 'mocha'
4import { 4import {
5 cleanupTests, 5 cleanupTests,
6 createUser,
7 flushAndRunServer, 6 flushAndRunServer,
8 makeGetRequest, 7 makeGetRequest,
9 ServerInfo, 8 ServerInfo,
@@ -50,21 +49,12 @@ describe('Test video filters validators', function () {
50 await setDefaultVideoChannel([ server ]) 49 await setDefaultVideoChannel([ server ])
51 50
52 const user = { username: 'user1', password: 'my super password' } 51 const user = { username: 'user1', password: 'my super password' }
53 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 52 await server.usersCommand.create({ username: user.username, password: user.password })
54 userAccessToken = await server.loginCommand.getAccessToken(user) 53 userAccessToken = await server.loginCommand.getAccessToken(user)
55 54
56 const moderator = { username: 'moderator', password: 'my super password' } 55 const moderator = { username: 'moderator', password: 'my super password' }
57 await createUser( 56 await server.usersCommand.create({ username: moderator.username, password: moderator.password, role: UserRole.MODERATOR })
58 { 57
59 url: server.url,
60 accessToken: server.accessToken,
61 username: moderator.username,
62 password: moderator.password,
63 videoQuota: undefined,
64 videoQuotaDaily: undefined,
65 role: UserRole.MODERATOR
66 }
67 )
68 moderatorAccessToken = await server.loginCommand.getAccessToken(moderator) 58 moderatorAccessToken = await server.loginCommand.getAccessToken(moderator)
69 }) 59 })
70 60
diff --git a/server/tests/api/check-params/videos.ts b/server/tests/api/check-params/videos.ts
index 8e11232bd..855b09f39 100644
--- a/server/tests/api/check-params/videos.ts
+++ b/server/tests/api/check-params/videos.ts
@@ -10,9 +10,7 @@ import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-c
10import { 10import {
11 checkUploadVideoParam, 11 checkUploadVideoParam,
12 cleanupTests, 12 cleanupTests,
13 createUser,
14 flushAndRunServer, 13 flushAndRunServer,
15 getMyUserInformation,
16 getVideo, 14 getVideo,
17 getVideosList, 15 getVideosList,
18 makeDeleteRequest, 16 makeDeleteRequest,
@@ -53,14 +51,14 @@ describe('Test videos API validator', function () {
53 51
54 const username = 'user1' 52 const username = 'user1'
55 const password = 'my super password' 53 const password = 'my super password'
56 await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password }) 54 await server.usersCommand.create({ username: username, password: password })
57 userAccessToken = await server.loginCommand.getAccessToken({ username, password }) 55 userAccessToken = await server.loginCommand.getAccessToken({ username, password })
58 56
59 { 57 {
60 const res = await getMyUserInformation(server.url, server.accessToken) 58 const body = await server.usersCommand.getMyInfo()
61 channelId = res.body.videoChannels[0].id 59 channelId = body.videoChannels[0].id
62 channelName = res.body.videoChannels[0].name 60 channelName = body.videoChannels[0].name
63 accountName = res.body.account.name + '@' + res.body.account.host 61 accountName = body.account.name + '@' + body.account.host
64 } 62 }
65 }) 63 })
66 64
@@ -283,11 +281,11 @@ describe('Test videos API validator', function () {
283 username: 'fake' + randomInt(0, 1500), 281 username: 'fake' + randomInt(0, 1500),
284 password: 'fake_password' 282 password: 'fake_password'
285 } 283 }
286 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 284 await server.usersCommand.create({ username: user.username, password: user.password })
287 285
288 const accessTokenUser = await server.loginCommand.getAccessToken(user) 286 const accessTokenUser = await server.loginCommand.getAccessToken(user)
289 const res = await getMyUserInformation(server.url, accessTokenUser) 287 const { videoChannels } = await server.usersCommand.getMyInfo({ token: accessTokenUser })
290 const customChannelId = res.body.videoChannels[0].id 288 const customChannelId = videoChannels[0].id
291 289
292 const fields = { ...baseCorrectParams, channelId: customChannelId } 290 const fields = { ...baseCorrectParams, channelId: customChannelId }
293 const attaches = baseCorrectAttaches 291 const attaches = baseCorrectAttaches
diff --git a/server/tests/api/live/live-constraints.ts b/server/tests/api/live/live-constraints.ts
index 46153f7b1..290d325d4 100644
--- a/server/tests/api/live/live-constraints.ts
+++ b/server/tests/api/live/live-constraints.ts
@@ -9,12 +9,10 @@ import {
9 ConfigCommand, 9 ConfigCommand,
10 doubleFollow, 10 doubleFollow,
11 flushAndRunMultipleServers, 11 flushAndRunMultipleServers,
12 generateUser,
13 getVideo, 12 getVideo,
14 ServerInfo, 13 ServerInfo,
15 setAccessTokensToServers, 14 setAccessTokensToServers,
16 setDefaultVideoChannel, 15 setDefaultVideoChannel,
17 updateUser,
18 wait, 16 wait,
19 waitJobs 17 waitJobs
20} from '../../../../shared/extra-utils' 18} from '../../../../shared/extra-utils'
@@ -58,9 +56,7 @@ describe('Test live constraints', function () {
58 } 56 }
59 57
60 function updateQuota (options: { total: number, daily: number }) { 58 function updateQuota (options: { total: number, daily: number }) {
61 return updateUser({ 59 return servers[0].usersCommand.update({
62 url: servers[0].url,
63 accessToken: servers[0].accessToken,
64 userId, 60 userId,
65 videoQuota: options.total, 61 videoQuota: options.total,
66 videoQuotaDaily: options.daily 62 videoQuotaDaily: options.daily
@@ -89,7 +85,7 @@ describe('Test live constraints', function () {
89 }) 85 })
90 86
91 { 87 {
92 const res = await generateUser(servers[0], 'user1') 88 const res = await servers[0].usersCommand.generate('user1')
93 userId = res.userId 89 userId = res.userId
94 userChannelId = res.userChannelId 90 userChannelId = res.userChannelId
95 userAccessToken = res.token 91 userAccessToken = res.token
diff --git a/server/tests/api/moderation/abuses.ts b/server/tests/api/moderation/abuses.ts
index d7462f38f..a7119263c 100644
--- a/server/tests/api/moderation/abuses.ts
+++ b/server/tests/api/moderation/abuses.ts
@@ -5,13 +5,10 @@ import * as chai from 'chai'
5import { 5import {
6 AbusesCommand, 6 AbusesCommand,
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 doubleFollow, 8 doubleFollow,
10 flushAndRunMultipleServers, 9 flushAndRunMultipleServers,
11 generateUserAccessToken,
12 getVideoIdFromUUID, 10 getVideoIdFromUUID,
13 getVideosList, 11 getVideosList,
14 removeUser,
15 removeVideo, 12 removeVideo,
16 ServerInfo, 13 ServerInfo,
17 setAccessTokensToServers, 14 setAccessTokensToServers,
@@ -278,7 +275,7 @@ describe('Test abuses', function () {
278 275
279 // register a second user to have two reporters/reportees 276 // register a second user to have two reporters/reportees
280 const user = { username: 'user2', password: 'password' } 277 const user = { username: 'user2', password: 'password' }
281 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, ...user }) 278 await servers[0].usersCommand.create({ ...user })
282 const userAccessToken = await servers[0].loginCommand.getAccessToken(user) 279 const userAccessToken = await servers[0].loginCommand.getAccessToken(user)
283 280
284 // upload a third video via this user 281 // upload a third video via this user
@@ -604,9 +601,9 @@ describe('Test abuses', function () {
604 before(async function () { 601 before(async function () {
605 this.timeout(50000) 602 this.timeout(50000)
606 603
607 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: 'user_1', password: 'donald' }) 604 await servers[0].usersCommand.create({ username: 'user_1', password: 'donald' })
608 605
609 const token = await generateUserAccessToken(servers[1], 'user_2') 606 const token = await servers[1].usersCommand.generateUserAndToken('user_2')
610 await uploadVideo(servers[1].url, token, { name: 'super video' }) 607 await uploadVideo(servers[1].url, token, { name: 'super video' })
611 608
612 await waitJobs(servers) 609 await waitJobs(servers)
@@ -708,7 +705,7 @@ describe('Test abuses', function () {
708 this.timeout(10000) 705 this.timeout(10000)
709 706
710 const account = await getAccountFromServer(servers[1], 'user_2', servers[1]) 707 const account = await getAccountFromServer(servers[1], 'user_2', servers[1])
711 await removeUser(servers[1].url, account.userId, servers[1].accessToken) 708 await servers[1].usersCommand.remove({ userId: account.userId })
712 709
713 await waitJobs(servers) 710 await waitJobs(servers)
714 711
@@ -765,7 +762,7 @@ describe('Test abuses', function () {
765 let userAccessToken: string 762 let userAccessToken: string
766 763
767 before(async function () { 764 before(async function () {
768 userAccessToken = await generateUserAccessToken(servers[0], 'user_42') 765 userAccessToken = await servers[0].usersCommand.generateUserAndToken('user_42')
769 766
770 await commands[0].report({ token: userAccessToken, videoId: servers[0].video.id, reason: 'user reason 1' }) 767 await commands[0].report({ token: userAccessToken, videoId: servers[0].video.id, reason: 'user reason 1' })
771 768
@@ -836,7 +833,7 @@ describe('Test abuses', function () {
836 let abuseMessageModerationId: number 833 let abuseMessageModerationId: number
837 834
838 before(async function () { 835 before(async function () {
839 userToken = await generateUserAccessToken(servers[0], 'user_43') 836 userToken = await servers[0].usersCommand.generateUserAndToken('user_43')
840 837
841 const body = await commands[0].report({ token: userToken, videoId: servers[0].video.id, reason: 'user 43 reason 1' }) 838 const body = await commands[0].report({ token: userToken, videoId: servers[0].video.id, reason: 'user 43 reason 1' })
842 abuseId = body.abuse.id 839 abuseId = body.abuse.id
diff --git a/server/tests/api/moderation/blocklist-notification.ts b/server/tests/api/moderation/blocklist-notification.ts
index 4f2be6198..b44bcb012 100644
--- a/server/tests/api/moderation/blocklist-notification.ts
+++ b/server/tests/api/moderation/blocklist-notification.ts
@@ -4,7 +4,6 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 doubleFollow, 7 doubleFollow,
9 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
10 ServerInfo, 9 ServerInfo,
@@ -76,9 +75,7 @@ describe('Test blocklist', function () {
76 75
77 { 76 {
78 const user = { username: 'user1', password: 'password' } 77 const user = { username: 'user1', password: 'password' }
79 await createUser({ 78 await servers[0].usersCommand.create({
80 url: servers[0].url,
81 accessToken: servers[0].accessToken,
82 username: user.username, 79 username: user.username,
83 password: user.password, 80 password: user.password,
84 videoQuota: -1, 81 videoQuota: -1,
@@ -91,14 +88,14 @@ describe('Test blocklist', function () {
91 88
92 { 89 {
93 const user = { username: 'user2', password: 'password' } 90 const user = { username: 'user2', password: 'password' }
94 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 91 await servers[0].usersCommand.create({ username: user.username, password: user.password })
95 92
96 userToken2 = await servers[0].loginCommand.getAccessToken(user) 93 userToken2 = await servers[0].loginCommand.getAccessToken(user)
97 } 94 }
98 95
99 { 96 {
100 const user = { username: 'user3', password: 'password' } 97 const user = { username: 'user3', password: 'password' }
101 await createUser({ url: servers[1].url, accessToken: servers[1].accessToken, username: user.username, password: user.password }) 98 await servers[1].usersCommand.create({ username: user.username, password: user.password })
102 99
103 remoteUserToken = await servers[1].loginCommand.getAccessToken(user) 100 remoteUserToken = await servers[1].loginCommand.getAccessToken(user)
104 } 101 }
diff --git a/server/tests/api/moderation/blocklist.ts b/server/tests/api/moderation/blocklist.ts
index c38a7dad4..c253b5c11 100644
--- a/server/tests/api/moderation/blocklist.ts
+++ b/server/tests/api/moderation/blocklist.ts
@@ -6,7 +6,6 @@ import {
6 BlocklistCommand, 6 BlocklistCommand,
7 cleanupTests, 7 cleanupTests,
8 CommentsCommand, 8 CommentsCommand,
9 createUser,
10 doubleFollow, 9 doubleFollow,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
12 getVideosList, 11 getVideosList,
@@ -91,7 +90,7 @@ describe('Test blocklist', function () {
91 90
92 { 91 {
93 const user = { username: 'user1', password: 'password' } 92 const user = { username: 'user1', password: 'password' }
94 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 93 await servers[0].usersCommand.create({ username: user.username, password: user.password })
95 94
96 userToken1 = await servers[0].loginCommand.getAccessToken(user) 95 userToken1 = await servers[0].loginCommand.getAccessToken(user)
97 await uploadVideo(servers[0].url, userToken1, { name: 'video user 1' }) 96 await uploadVideo(servers[0].url, userToken1, { name: 'video user 1' })
@@ -99,14 +98,14 @@ describe('Test blocklist', function () {
99 98
100 { 99 {
101 const user = { username: 'moderator', password: 'password' } 100 const user = { username: 'moderator', password: 'password' }
102 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 101 await servers[0].usersCommand.create({ username: user.username, password: user.password })
103 102
104 userModeratorToken = await servers[0].loginCommand.getAccessToken(user) 103 userModeratorToken = await servers[0].loginCommand.getAccessToken(user)
105 } 104 }
106 105
107 { 106 {
108 const user = { username: 'user2', password: 'password' } 107 const user = { username: 'user2', password: 'password' }
109 await createUser({ url: servers[1].url, accessToken: servers[1].accessToken, username: user.username, password: user.password }) 108 await servers[1].usersCommand.create({ username: user.username, password: user.password })
110 109
111 userToken2 = await servers[1].loginCommand.getAccessToken(user) 110 userToken2 = await servers[1].loginCommand.getAccessToken(user)
112 await uploadVideo(servers[1].url, userToken2, { name: 'video user 2' }) 111 await uploadVideo(servers[1].url, userToken2, { name: 'video user 2' })
diff --git a/server/tests/api/moderation/video-blacklist.ts b/server/tests/api/moderation/video-blacklist.ts
index b61effc57..ef25cfb8e 100644
--- a/server/tests/api/moderation/video-blacklist.ts
+++ b/server/tests/api/moderation/video-blacklist.ts
@@ -6,10 +6,8 @@ import { orderBy } from 'lodash'
6import { 6import {
7 BlacklistCommand, 7 BlacklistCommand,
8 cleanupTests, 8 cleanupTests,
9 createUser,
10 doubleFollow, 9 doubleFollow,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
12 getMyUserInformation,
13 getMyVideos, 11 getMyVideos,
14 getVideosList, 12 getVideosList,
15 ImportsCommand, 13 ImportsCommand,
@@ -21,7 +19,7 @@ import {
21 uploadVideo, 19 uploadVideo,
22 waitJobs 20 waitJobs
23} from '@shared/extra-utils' 21} from '@shared/extra-utils'
24import { User, UserAdminFlag, UserRole, VideoBlacklist, VideoBlacklistType } from '@shared/models' 22import { UserAdminFlag, UserRole, VideoBlacklist, VideoBlacklistType } from '@shared/models'
25 23
26const expect = chai.expect 24const expect = chai.expect
27 25
@@ -356,9 +354,7 @@ describe('Test video blacklist', function () {
356 354
357 { 355 {
358 const user = { username: 'user_without_flag', password: 'password' } 356 const user = { username: 'user_without_flag', password: 'password' }
359 await createUser({ 357 await servers[0].usersCommand.create({
360 url: servers[0].url,
361 accessToken: servers[0].accessToken,
362 username: user.username, 358 username: user.username,
363 adminFlags: UserAdminFlag.NONE, 359 adminFlags: UserAdminFlag.NONE,
364 password: user.password, 360 password: user.password,
@@ -367,16 +363,13 @@ describe('Test video blacklist', function () {
367 363
368 userWithoutFlag = await servers[0].loginCommand.getAccessToken(user) 364 userWithoutFlag = await servers[0].loginCommand.getAccessToken(user)
369 365
370 const res = await getMyUserInformation(servers[0].url, userWithoutFlag) 366 const { videoChannels } = await servers[0].usersCommand.getMyInfo({ token: userWithoutFlag })
371 const body: User = res.body 367 channelOfUserWithoutFlag = videoChannels[0].id
372 channelOfUserWithoutFlag = body.videoChannels[0].id
373 } 368 }
374 369
375 { 370 {
376 const user = { username: 'user_with_flag', password: 'password' } 371 const user = { username: 'user_with_flag', password: 'password' }
377 await createUser({ 372 await servers[0].usersCommand.create({
378 url: servers[0].url,
379 accessToken: servers[0].accessToken,
380 username: user.username, 373 username: user.username,
381 adminFlags: UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST, 374 adminFlags: UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST,
382 password: user.password, 375 password: user.password,
diff --git a/server/tests/api/notifications/comments-notifications.ts b/server/tests/api/notifications/comments-notifications.ts
index ea6055386..62569f810 100644
--- a/server/tests/api/notifications/comments-notifications.ts
+++ b/server/tests/api/notifications/comments-notifications.ts
@@ -10,7 +10,6 @@ import {
10 MockSmtpServer, 10 MockSmtpServer,
11 prepareNotificationsTest, 11 prepareNotificationsTest,
12 ServerInfo, 12 ServerInfo,
13 updateMyUser,
14 uploadVideo, 13 uploadVideo,
15 waitJobs 14 waitJobs
16} from '@shared/extra-utils' 15} from '@shared/extra-utils'
@@ -193,17 +192,8 @@ describe('Test comments notifications', function () {
193 token: userToken 192 token: userToken
194 } 193 }
195 194
196 await updateMyUser({ 195 await servers[0].usersCommand.updateMe({ displayName: 'super root name' })
197 url: servers[0].url, 196 await servers[1].usersCommand.updateMe({ displayName: 'super root 2 name' })
198 accessToken: servers[0].accessToken,
199 displayName: 'super root name'
200 })
201
202 await updateMyUser({
203 url: servers[1].url,
204 accessToken: servers[1].accessToken,
205 displayName: 'super root 2 name'
206 })
207 }) 197 })
208 198
209 it('Should not send a new mention comment notification if I mention the video owner', async function () { 199 it('Should not send a new mention comment notification if I mention the video owner', async function () {
diff --git a/server/tests/api/notifications/moderation-notifications.ts b/server/tests/api/notifications/moderation-notifications.ts
index 99b434606..0269124c5 100644
--- a/server/tests/api/notifications/moderation-notifications.ts
+++ b/server/tests/api/notifications/moderation-notifications.ts
@@ -17,13 +17,10 @@ import {
17 checkVideoAutoBlacklistForModerators, 17 checkVideoAutoBlacklistForModerators,
18 checkVideoIsPublished, 18 checkVideoIsPublished,
19 cleanupTests, 19 cleanupTests,
20 createUser,
21 generateUserAccessToken,
22 getVideoIdFromUUID, 20 getVideoIdFromUUID,
23 MockInstancesIndex, 21 MockInstancesIndex,
24 MockSmtpServer, 22 MockSmtpServer,
25 prepareNotificationsTest, 23 prepareNotificationsTest,
26 registerUser,
27 ServerInfo, 24 ServerInfo,
28 uploadVideo, 25 uploadVideo,
29 wait, 26 wait,
@@ -139,8 +136,8 @@ describe('Test moderation notifications', function () {
139 this.timeout(20000) 136 this.timeout(20000)
140 137
141 const username = 'user' + new Date().getTime() 138 const username = 'user' + new Date().getTime()
142 const resUser = await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username, password: 'donald' }) 139 const { account } = await servers[0].usersCommand.create({ username, password: 'donald' })
143 const accountId = resUser.body.user.account.id 140 const accountId = account.id
144 141
145 await servers[0].abusesCommand.report({ accountId, reason: 'super reason' }) 142 await servers[0].abusesCommand.report({ accountId, reason: 'super reason' })
146 143
@@ -152,7 +149,7 @@ describe('Test moderation notifications', function () {
152 this.timeout(20000) 149 this.timeout(20000)
153 150
154 const username = 'user' + new Date().getTime() 151 const username = 'user' + new Date().getTime()
155 const tmpToken = await generateUserAccessToken(servers[0], username) 152 const tmpToken = await servers[0].usersCommand.generateUserAndToken(username)
156 await uploadVideo(servers[0].url, tmpToken, { name: 'super video' }) 153 await uploadVideo(servers[0].url, tmpToken, { name: 'super video' })
157 154
158 await waitJobs(servers) 155 await waitJobs(servers)
@@ -339,7 +336,7 @@ describe('Test moderation notifications', function () {
339 it('Should send a notification only to moderators when a user registers on the instance', async function () { 336 it('Should send a notification only to moderators when a user registers on the instance', async function () {
340 this.timeout(10000) 337 this.timeout(10000)
341 338
342 await registerUser(servers[0].url, 'user_45', 'password') 339 await servers[0].usersCommand.register({ username: 'user_45' })
343 340
344 await waitJobs(servers) 341 await waitJobs(servers)
345 342
diff --git a/server/tests/api/notifications/notifications-api.ts b/server/tests/api/notifications/notifications-api.ts
index e5864f1c2..f33d8e64d 100644
--- a/server/tests/api/notifications/notifications-api.ts
+++ b/server/tests/api/notifications/notifications-api.ts
@@ -7,14 +7,13 @@ import {
7 checkNewVideoFromSubscription, 7 checkNewVideoFromSubscription,
8 cleanupTests, 8 cleanupTests,
9 getAllNotificationsSettings, 9 getAllNotificationsSettings,
10 getMyUserInformation,
11 MockSmtpServer, 10 MockSmtpServer,
12 prepareNotificationsTest, 11 prepareNotificationsTest,
13 ServerInfo, 12 ServerInfo,
14 uploadRandomVideo, 13 uploadRandomVideo,
15 waitJobs 14 waitJobs
16} from '@shared/extra-utils' 15} from '@shared/extra-utils'
17import { User, UserNotification, UserNotificationSettingValue } from '@shared/models' 16import { UserNotification, UserNotificationSettingValue } from '@shared/models'
18 17
19const expect = chai.expect 18const expect = chai.expect
20 19
@@ -109,15 +108,14 @@ describe('Test notifications API', function () {
109 }) 108 })
110 109
111 { 110 {
112 const res = await getMyUserInformation(server.url, userToken) 111 const info = await server.usersCommand.getMyInfo({ token: userToken })
113 const info = res.body as User
114 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.NONE) 112 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.NONE)
115 } 113 }
116 114
117 const { name, uuid } = await uploadRandomVideo(server) 115 const { name, uuid } = await uploadRandomVideo(server)
118 116
119 const check = { web: true, mail: true } 117 const check = { web: true, mail: true }
120 await checkNewVideoFromSubscription({ ...baseParams, ...check }, name, uuid, 'absence') 118 await checkNewVideoFromSubscription({ ...baseParams, check }, name, uuid, 'absence')
121 }) 119 })
122 120
123 it('Should only have web notifications', async function () { 121 it('Should only have web notifications', async function () {
@@ -129,8 +127,7 @@ describe('Test notifications API', function () {
129 }) 127 })
130 128
131 { 129 {
132 const res = await getMyUserInformation(server.url, userToken) 130 const info = await server.usersCommand.getMyInfo({ token: userToken })
133 const info = res.body as User
134 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.WEB) 131 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.WEB)
135 } 132 }
136 133
@@ -138,12 +135,12 @@ describe('Test notifications API', function () {
138 135
139 { 136 {
140 const check = { mail: true, web: false } 137 const check = { mail: true, web: false }
141 await checkNewVideoFromSubscription({ ...baseParams, ...check }, name, uuid, 'absence') 138 await checkNewVideoFromSubscription({ ...baseParams, check }, name, uuid, 'absence')
142 } 139 }
143 140
144 { 141 {
145 const check = { mail: false, web: true } 142 const check = { mail: false, web: true }
146 await checkNewVideoFromSubscription({ ...baseParams, ...check }, name, uuid, 'presence') 143 await checkNewVideoFromSubscription({ ...baseParams, check }, name, uuid, 'presence')
147 } 144 }
148 }) 145 })
149 146
@@ -156,8 +153,7 @@ describe('Test notifications API', function () {
156 }) 153 })
157 154
158 { 155 {
159 const res = await getMyUserInformation(server.url, userToken) 156 const info = await server.usersCommand.getMyInfo({ token: userToken })
160 const info = res.body as User
161 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.EMAIL) 157 expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.EMAIL)
162 } 158 }
163 159
@@ -165,12 +161,12 @@ describe('Test notifications API', function () {
165 161
166 { 162 {
167 const check = { mail: false, web: true } 163 const check = { mail: false, web: true }
168 await checkNewVideoFromSubscription({ ...baseParams, ...check }, name, uuid, 'absence') 164 await checkNewVideoFromSubscription({ ...baseParams, check }, name, uuid, 'absence')
169 } 165 }
170 166
171 { 167 {
172 const check = { mail: true, web: false } 168 const check = { mail: true, web: false }
173 await checkNewVideoFromSubscription({ ...baseParams, ...check }, name, uuid, 'presence') 169 await checkNewVideoFromSubscription({ ...baseParams, check }, name, uuid, 'presence')
174 } 170 }
175 }) 171 })
176 172
@@ -186,8 +182,7 @@ describe('Test notifications API', function () {
186 }) 182 })
187 183
188 { 184 {
189 const res = await getMyUserInformation(server.url, userToken) 185 const info = await server.usersCommand.getMyInfo({ token: userToken })
190 const info = res.body as User
191 expect(info.notificationSettings.newVideoFromSubscription).to.equal( 186 expect(info.notificationSettings.newVideoFromSubscription).to.equal(
192 UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL 187 UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
193 ) 188 )
diff --git a/server/tests/api/notifications/user-notifications.ts b/server/tests/api/notifications/user-notifications.ts
index 4b31edf25..465349fb9 100644
--- a/server/tests/api/notifications/user-notifications.ts
+++ b/server/tests/api/notifications/user-notifications.ts
@@ -14,7 +14,6 @@ import {
14 MockSmtpServer, 14 MockSmtpServer,
15 prepareNotificationsTest, 15 prepareNotificationsTest,
16 ServerInfo, 16 ServerInfo,
17 updateMyUser,
18 updateVideo, 17 updateVideo,
19 uploadRandomVideoOnServers, 18 uploadRandomVideoOnServers,
20 wait, 19 wait,
@@ -384,23 +383,14 @@ describe('Test user notifications', function () {
384 token: userAccessToken 383 token: userAccessToken
385 } 384 }
386 385
387 await updateMyUser({ 386 await servers[0].usersCommand.updateMe({ displayName: 'super root name' })
388 url: servers[0].url,
389 accessToken: servers[0].accessToken,
390 displayName: 'super root name'
391 })
392 387
393 await updateMyUser({ 388 await servers[0].usersCommand.updateMe({
394 url: servers[0].url, 389 token: userAccessToken,
395 accessToken: userAccessToken,
396 displayName: myUserName 390 displayName: myUserName
397 }) 391 })
398 392
399 await updateMyUser({ 393 await servers[1].usersCommand.updateMe({ displayName: 'super root 2 name' })
400 url: servers[1].url,
401 accessToken: servers[1].accessToken,
402 displayName: 'super root 2 name'
403 })
404 394
405 await servers[0].channelsCommand.update({ 395 await servers[0].channelsCommand.update({
406 token: userAccessToken, 396 token: userAccessToken,
diff --git a/server/tests/api/search/search-activitypub-video-channels.ts b/server/tests/api/search/search-activitypub-video-channels.ts
index 3cba2b019..bcc21381c 100644
--- a/server/tests/api/search/search-activitypub-video-channels.ts
+++ b/server/tests/api/search/search-activitypub-video-channels.ts
@@ -4,13 +4,11 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunMultipleServers, 7 flushAndRunMultipleServers,
9 getVideoChannelVideos, 8 getVideoChannelVideos,
10 SearchCommand, 9 SearchCommand,
11 ServerInfo, 10 ServerInfo,
12 setAccessTokensToServers, 11 setAccessTokensToServers,
13 updateMyUser,
14 updateVideo, 12 updateVideo,
15 uploadVideo, 13 uploadVideo,
16 wait, 14 wait,
@@ -35,7 +33,7 @@ describe('Test ActivityPub video channels search', function () {
35 await setAccessTokensToServers(servers) 33 await setAccessTokensToServers(servers)
36 34
37 { 35 {
38 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: 'user1_server1', password: 'password' }) 36 await servers[0].usersCommand.create({ username: 'user1_server1', password: 'password' })
39 const channel = { 37 const channel = {
40 name: 'channel1_server1', 38 name: 'channel1_server1',
41 displayName: 'Channel 1 server 1' 39 displayName: 'Channel 1 server 1'
@@ -45,7 +43,7 @@ describe('Test ActivityPub video channels search', function () {
45 43
46 { 44 {
47 const user = { username: 'user1_server2', password: 'password' } 45 const user = { username: 'user1_server2', password: 'password' }
48 await createUser({ url: servers[1].url, accessToken: servers[1].accessToken, username: user.username, password: user.password }) 46 await servers[1].usersCommand.create({ username: user.username, password: user.password })
49 userServer2Token = await servers[1].loginCommand.getAccessToken(user) 47 userServer2Token = await servers[1].loginCommand.getAccessToken(user)
50 48
51 const channel = { 49 const channel = {
@@ -171,7 +169,7 @@ describe('Test ActivityPub video channels search', function () {
171 channelName: 'channel1_server2', 169 channelName: 'channel1_server2',
172 attributes: { displayName: 'channel updated' } 170 attributes: { displayName: 'channel updated' }
173 }) 171 })
174 await updateMyUser({ url: servers[1].url, accessToken: userServer2Token, displayName: 'user updated' }) 172 await servers[1].usersCommand.updateMe({ token: userServer2Token, displayName: 'user updated' })
175 173
176 await waitJobs(servers) 174 await waitJobs(servers)
177 // Expire video channel 175 // Expire video channel
diff --git a/server/tests/api/search/search-channels.ts b/server/tests/api/search/search-channels.ts
index 6c9ee73ce..4d2104708 100644
--- a/server/tests/api/search/search-channels.ts
+++ b/server/tests/api/search/search-channels.ts
@@ -2,7 +2,7 @@
2 2
3import 'mocha' 3import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { cleanupTests, createUser, flushAndRunServer, SearchCommand, ServerInfo, setAccessTokensToServers } from '@shared/extra-utils' 5import { cleanupTests, flushAndRunServer, SearchCommand, ServerInfo, setAccessTokensToServers } from '@shared/extra-utils'
6import { VideoChannel } from '@shared/models' 6import { VideoChannel } from '@shared/models'
7 7
8const expect = chai.expect 8const expect = chai.expect
@@ -19,7 +19,7 @@ describe('Test channels search', function () {
19 await setAccessTokensToServers([ server ]) 19 await setAccessTokensToServers([ server ])
20 20
21 { 21 {
22 await createUser({ url: server.url, accessToken: server.accessToken, username: 'user1', password: 'password' }) 22 await server.usersCommand.create({ username: 'user1', password: 'password' })
23 const channel = { 23 const channel = {
24 name: 'squall_channel', 24 name: 'squall_channel',
25 displayName: 'Squall channel' 25 displayName: 'Squall channel'
diff --git a/server/tests/api/server/bulk.ts b/server/tests/api/server/bulk.ts
index a09c21228..20a9a3dc7 100644
--- a/server/tests/api/server/bulk.ts
+++ b/server/tests/api/server/bulk.ts
@@ -5,7 +5,6 @@ import * as chai from 'chai'
5import { 5import {
6 BulkCommand, 6 BulkCommand,
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 doubleFollow, 8 doubleFollow,
10 flushAndRunMultipleServers, 9 flushAndRunMultipleServers,
11 getVideosList, 10 getVideosList,
@@ -38,21 +37,21 @@ describe('Test bulk actions', function () {
38 37
39 { 38 {
40 const user = { username: 'user1', password: 'password' } 39 const user = { username: 'user1', password: 'password' }
41 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 40 await servers[0].usersCommand.create({ username: user.username, password: user.password })
42 41
43 user1Token = await servers[0].loginCommand.getAccessToken(user) 42 user1Token = await servers[0].loginCommand.getAccessToken(user)
44 } 43 }
45 44
46 { 45 {
47 const user = { username: 'user2', password: 'password' } 46 const user = { username: 'user2', password: 'password' }
48 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 47 await servers[0].usersCommand.create({ username: user.username, password: user.password })
49 48
50 user2Token = await servers[0].loginCommand.getAccessToken(user) 49 user2Token = await servers[0].loginCommand.getAccessToken(user)
51 } 50 }
52 51
53 { 52 {
54 const user = { username: 'user3', password: 'password' } 53 const user = { username: 'user3', password: 'password' }
55 await createUser({ url: servers[1].url, accessToken: servers[1].accessToken, username: user.username, password: user.password }) 54 await servers[1].usersCommand.create({ username: user.username, password: user.password })
56 55
57 user3Token = await servers[1].loginCommand.getAccessToken(user) 56 user3Token = await servers[1].loginCommand.getAccessToken(user)
58 } 57 }
diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts
index 55cf2a1b8..95dafd378 100644
--- a/server/tests/api/server/config.ts
+++ b/server/tests/api/server/config.ts
@@ -9,7 +9,6 @@ import {
9 killallServers, 9 killallServers,
10 makeGetRequest, 10 makeGetRequest,
11 parallelTests, 11 parallelTests,
12 registerUser,
13 reRunServer, 12 reRunServer,
14 ServerInfo, 13 ServerInfo,
15 setAccessTokensToServers, 14 setAccessTokensToServers,
@@ -225,9 +224,9 @@ describe('Test config', function () {
225 this.timeout(5000) 224 this.timeout(5000)
226 225
227 await Promise.all([ 226 await Promise.all([
228 registerUser(server.url, 'user1', 'super password'), 227 server.usersCommand.register({ username: 'user1' }),
229 registerUser(server.url, 'user2', 'super password'), 228 server.usersCommand.register({ username: 'user2' }),
230 registerUser(server.url, 'user3', 'super password') 229 server.usersCommand.register({ username: 'user3' })
231 ]) 230 ])
232 231
233 const data = await server.configCommand.getConfig() 232 const data = await server.configCommand.getConfig()
diff --git a/server/tests/api/server/email.ts b/server/tests/api/server/email.ts
index c64c120e3..422db6ceb 100644
--- a/server/tests/api/server/email.ts
+++ b/server/tests/api/server/email.ts
@@ -2,23 +2,16 @@
2 2
3import 'mocha' 3import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 askResetPassword,
8 askSendVerifyEmail,
9 blockUser,
10 cleanupTests, 7 cleanupTests,
11 createUser,
12 flushAndRunServer, 8 flushAndRunServer,
13 resetPassword, 9 MockSmtpServer,
14 ServerInfo, 10 ServerInfo,
15 setAccessTokensToServers, 11 setAccessTokensToServers,
16 unblockUser,
17 uploadVideo, 12 uploadVideo,
18 verifyEmail 13 waitJobs
19} from '../../../../shared/extra-utils' 14} from '@shared/extra-utils'
20import { MockSmtpServer } from '../../../../shared/extra-utils/mock-servers/mock-email'
21import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
22 15
23const expect = chai.expect 16const expect = chai.expect
24 17
@@ -58,8 +51,8 @@ describe('Test emails', function () {
58 await setAccessTokensToServers([ server ]) 51 await setAccessTokensToServers([ server ])
59 52
60 { 53 {
61 const res = await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 54 const created = await server.usersCommand.create({ username: user.username, password: user.password })
62 userId = res.body.user.id 55 userId = created.id
63 56
64 userAccessToken = await server.loginCommand.getAccessToken(user) 57 userAccessToken = await server.loginCommand.getAccessToken(user)
65 } 58 }
@@ -87,7 +80,7 @@ describe('Test emails', function () {
87 it('Should ask to reset the password', async function () { 80 it('Should ask to reset the password', async function () {
88 this.timeout(10000) 81 this.timeout(10000)
89 82
90 await askResetPassword(server.url, 'user_1@example.com') 83 await server.usersCommand.askResetPassword({ email: 'user_1@example.com' })
91 84
92 await waitJobs(server) 85 await waitJobs(server)
93 expect(emails).to.have.lengthOf(1) 86 expect(emails).to.have.lengthOf(1)
@@ -113,15 +106,25 @@ describe('Test emails', function () {
113 }) 106 })
114 107
115 it('Should not reset the password with an invalid verification string', async function () { 108 it('Should not reset the password with an invalid verification string', async function () {
116 await resetPassword(server.url, userId, verificationString + 'b', 'super_password2', HttpStatusCode.FORBIDDEN_403) 109 await server.usersCommand.resetPassword({
110 userId,
111 verificationString: verificationString + 'b',
112 password: 'super_password2',
113 expectedStatus: HttpStatusCode.FORBIDDEN_403
114 })
117 }) 115 })
118 116
119 it('Should reset the password', async function () { 117 it('Should reset the password', async function () {
120 await resetPassword(server.url, userId, verificationString, 'super_password2') 118 await server.usersCommand.resetPassword({ userId, verificationString, password: 'super_password2' })
121 }) 119 })
122 120
123 it('Should not reset the password with the same verification string', async function () { 121 it('Should not reset the password with the same verification string', async function () {
124 await resetPassword(server.url, userId, verificationString, 'super_password3', HttpStatusCode.FORBIDDEN_403) 122 await server.usersCommand.resetPassword({
123 userId,
124 verificationString,
125 password: 'super_password3',
126 expectedStatus: HttpStatusCode.FORBIDDEN_403
127 })
125 }) 128 })
126 129
127 it('Should login with this new password', async function () { 130 it('Should login with this new password', async function () {
@@ -132,15 +135,11 @@ describe('Test emails', function () {
132 }) 135 })
133 136
134 describe('When creating a user without password', function () { 137 describe('When creating a user without password', function () {
138
135 it('Should send a create password email', async function () { 139 it('Should send a create password email', async function () {
136 this.timeout(10000) 140 this.timeout(10000)
137 141
138 await createUser({ 142 await server.usersCommand.create({ username: 'create_password', password: '' })
139 url: server.url,
140 accessToken: server.accessToken,
141 username: 'create_password',
142 password: ''
143 })
144 143
145 await waitJobs(server) 144 await waitJobs(server)
146 expect(emails).to.have.lengthOf(2) 145 expect(emails).to.have.lengthOf(2)
@@ -166,11 +165,20 @@ describe('Test emails', function () {
166 }) 165 })
167 166
168 it('Should not reset the password with an invalid verification string', async function () { 167 it('Should not reset the password with an invalid verification string', async function () {
169 await resetPassword(server.url, userId2, verificationString2 + 'c', 'newly_created_password', HttpStatusCode.FORBIDDEN_403) 168 await server.usersCommand.resetPassword({
169 userId: userId2,
170 verificationString: verificationString2 + 'c',
171 password: 'newly_created_password',
172 expectedStatus: HttpStatusCode.FORBIDDEN_403
173 })
170 }) 174 })
171 175
172 it('Should reset the password', async function () { 176 it('Should reset the password', async function () {
173 await resetPassword(server.url, userId2, verificationString2, 'newly_created_password') 177 await server.usersCommand.resetPassword({
178 userId: userId2,
179 verificationString: verificationString2,
180 password: 'newly_created_password'
181 })
174 }) 182 })
175 183
176 it('Should login with this new password', async function () { 184 it('Should login with this new password', async function () {
@@ -207,7 +215,7 @@ describe('Test emails', function () {
207 this.timeout(10000) 215 this.timeout(10000)
208 216
209 const reason = 'my super bad reason' 217 const reason = 'my super bad reason'
210 await blockUser(server.url, userId, server.accessToken, HttpStatusCode.NO_CONTENT_204, reason) 218 await server.usersCommand.banUser({ userId, reason })
211 219
212 await waitJobs(server) 220 await waitJobs(server)
213 expect(emails).to.have.lengthOf(4) 221 expect(emails).to.have.lengthOf(4)
@@ -225,7 +233,7 @@ describe('Test emails', function () {
225 it('Should send the notification email when unblocking a user', async function () { 233 it('Should send the notification email when unblocking a user', async function () {
226 this.timeout(10000) 234 this.timeout(10000)
227 235
228 await unblockUser(server.url, userId, server.accessToken, HttpStatusCode.NO_CONTENT_204) 236 await server.usersCommand.unbanUser({ userId })
229 237
230 await waitJobs(server) 238 await waitJobs(server)
231 expect(emails).to.have.lengthOf(5) 239 expect(emails).to.have.lengthOf(5)
@@ -288,7 +296,7 @@ describe('Test emails', function () {
288 it('Should ask to send the verification email', async function () { 296 it('Should ask to send the verification email', async function () {
289 this.timeout(10000) 297 this.timeout(10000)
290 298
291 await askSendVerifyEmail(server.url, 'user_1@example.com') 299 await server.usersCommand.askSendVerifyEmail({ email: 'user_1@example.com' })
292 300
293 await waitJobs(server) 301 await waitJobs(server)
294 expect(emails).to.have.lengthOf(8) 302 expect(emails).to.have.lengthOf(8)
@@ -314,11 +322,16 @@ describe('Test emails', function () {
314 }) 322 })
315 323
316 it('Should not verify the email with an invalid verification string', async function () { 324 it('Should not verify the email with an invalid verification string', async function () {
317 await verifyEmail(server.url, userId, verificationString + 'b', false, HttpStatusCode.FORBIDDEN_403) 325 await server.usersCommand.verifyEmail({
326 userId,
327 verificationString: verificationString + 'b',
328 isPendingEmail: false,
329 expectedStatus: HttpStatusCode.FORBIDDEN_403
330 })
318 }) 331 })
319 332
320 it('Should verify the email', async function () { 333 it('Should verify the email', async function () {
321 await verifyEmail(server.url, userId, verificationString) 334 await server.usersCommand.verifyEmail({ userId, verificationString })
322 }) 335 })
323 }) 336 })
324 337
diff --git a/server/tests/api/server/follow-constraints.ts b/server/tests/api/server/follow-constraints.ts
index 74cdf353b..29ccb264d 100644
--- a/server/tests/api/server/follow-constraints.ts
+++ b/server/tests/api/server/follow-constraints.ts
@@ -6,7 +6,6 @@ import { HttpStatusCode } from '@shared/core-utils'
6import { PeerTubeProblemDocument, ServerErrorCode } from '@shared/models' 6import { PeerTubeProblemDocument, ServerErrorCode } from '@shared/models'
7import { 7import {
8 cleanupTests, 8 cleanupTests,
9 createUser,
10 doubleFollow, 9 doubleFollow,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
12 getAccountVideos, 11 getAccountVideos,
@@ -47,7 +46,7 @@ describe('Test follow constraints', function () {
47 username: 'user1', 46 username: 'user1',
48 password: 'super_password' 47 password: 'super_password'
49 } 48 }
50 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 49 await servers[0].usersCommand.create({ username: user.username, password: user.password })
51 userAccessToken = await servers[0].loginCommand.getAccessToken(user) 50 userAccessToken = await servers[0].loginCommand.getAccessToken(user)
52 51
53 await doubleFollow(servers[0], servers[1]) 52 await doubleFollow(servers[0], servers[1])
diff --git a/server/tests/api/server/follows.ts b/server/tests/api/server/follows.ts
index c2a0620a5..02d25e67f 100644
--- a/server/tests/api/server/follows.ts
+++ b/server/tests/api/server/follows.ts
@@ -5,7 +5,6 @@ import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 completeVideoCheck, 7 completeVideoCheck,
8 createUser,
9 dateIsValid, 8 dateIsValid,
10 expectAccountFollows, 9 expectAccountFollows,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
@@ -327,9 +326,7 @@ describe('Test follows', function () {
327 await uploadVideo(servers[2].url, servers[2].accessToken, { name: 'server3-6' }) 326 await uploadVideo(servers[2].url, servers[2].accessToken, { name: 'server3-6' })
328 327
329 { 328 {
330 const user = { username: 'captain', password: 'password' } 329 const userAccessToken = await servers[2].usersCommand.generateUserAndToken('captain')
331 await createUser({ url: servers[2].url, accessToken: servers[2].accessToken, username: user.username, password: user.password })
332 const userAccessToken = await servers[2].loginCommand.getAccessToken(user)
333 330
334 const resVideos = await getVideosList(servers[2].url) 331 const resVideos = await getVideosList(servers[2].url)
335 video4 = resVideos.body.data.find(v => v.name === 'server3-4') 332 video4 = resVideos.body.data.find(v => v.name === 'server3-4')
diff --git a/server/tests/api/server/jobs.ts b/server/tests/api/server/jobs.ts
index c0b9facff..6854568d3 100644
--- a/server/tests/api/server/jobs.ts
+++ b/server/tests/api/server/jobs.ts
@@ -30,7 +30,7 @@ describe('Test jobs', function () {
30 }) 30 })
31 31
32 it('Should create some jobs', async function () { 32 it('Should create some jobs', async function () {
33 this.timeout(60000) 33 this.timeout(120000)
34 34
35 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video1' }) 35 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video1' })
36 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video2' }) 36 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'video2' })
diff --git a/server/tests/api/server/plugins.ts b/server/tests/api/server/plugins.ts
index a81ac961a..1fd5e613b 100644
--- a/server/tests/api/server/plugins.ts
+++ b/server/tests/api/server/plugins.ts
@@ -6,17 +6,15 @@ import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 cleanupTests, 7 cleanupTests,
8 flushAndRunServer, 8 flushAndRunServer,
9 getMyUserInformation,
10 killallServers, 9 killallServers,
11 PluginsCommand, 10 PluginsCommand,
12 reRunServer, 11 reRunServer,
13 ServerInfo, 12 ServerInfo,
14 setAccessTokensToServers, 13 setAccessTokensToServers,
15 testHelloWorldRegisteredSettings, 14 testHelloWorldRegisteredSettings,
16 updateMyUser,
17 wait 15 wait
18} from '@shared/extra-utils' 16} from '@shared/extra-utils'
19import { PluginType, User } from '@shared/models' 17import { PluginType } from '@shared/models'
20 18
21const expect = chai.expect 19const expect = chai.expect
22 20
@@ -120,14 +118,10 @@ describe('Test plugins', function () {
120 }) 118 })
121 119
122 it('Should update my default theme', async function () { 120 it('Should update my default theme', async function () {
123 await updateMyUser({ 121 await server.usersCommand.updateMe({ theme: 'background-red' })
124 url: server.url,
125 accessToken: server.accessToken,
126 theme: 'background-red'
127 })
128 122
129 const res = await getMyUserInformation(server.url, server.accessToken) 123 const user = await server.usersCommand.getMyInfo()
130 expect((res.body as User).theme).to.equal('background-red') 124 expect(user.theme).to.equal('background-red')
131 }) 125 })
132 126
133 it('Should list plugins and themes', async function () { 127 it('Should list plugins and themes', async function () {
@@ -311,8 +305,8 @@ describe('Test plugins', function () {
311 }) 305 })
312 306
313 it('Should have updated the user theme', async function () { 307 it('Should have updated the user theme', async function () {
314 const res = await getMyUserInformation(server.url, server.accessToken) 308 const user = await server.usersCommand.getMyInfo()
315 expect((res.body as User).theme).to.equal('instance-default') 309 expect(user.theme).to.equal('instance-default')
316 }) 310 })
317 311
318 it('Should not install a broken plugin', async function () { 312 it('Should not install a broken plugin', async function () {
diff --git a/server/tests/api/server/reverse-proxy.ts b/server/tests/api/server/reverse-proxy.ts
index d9c669571..b8bae161a 100644
--- a/server/tests/api/server/reverse-proxy.ts
+++ b/server/tests/api/server/reverse-proxy.ts
@@ -6,7 +6,7 @@ import {
6 cleanupTests, 6 cleanupTests,
7 flushAndRunServer, 7 flushAndRunServer,
8 getVideo, 8 getVideo,
9 registerUser, 9 ServerInfo,
10 setAccessTokensToServers, 10 setAccessTokensToServers,
11 uploadVideo, 11 uploadVideo,
12 viewVideo, 12 viewVideo,
@@ -14,8 +14,8 @@ import {
14} from '@shared/extra-utils' 14} from '@shared/extra-utils'
15 15
16describe('Test application behind a reverse proxy', function () { 16describe('Test application behind a reverse proxy', function () {
17 let server = null 17 let server: ServerInfo
18 let videoId 18 let videoId: number
19 19
20 before(async function () { 20 before(async function () {
21 this.timeout(30000) 21 this.timeout(30000)
@@ -102,22 +102,22 @@ describe('Test application behind a reverse proxy', function () {
102 const user = { username: 'root', password: 'fail' } 102 const user = { username: 'root', password: 'fail' }
103 103
104 for (let i = 0; i < 19; i++) { 104 for (let i = 0; i < 19; i++) {
105 await server.loginCommand.getAccessToken(user, HttpStatusCode.BAD_REQUEST_400) 105 await server.loginCommand.login({ user, expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
106 } 106 }
107 107
108 await server.loginCommand.getAccessToken(user, HttpStatusCode.TOO_MANY_REQUESTS_429) 108 await server.loginCommand.login({ user, expectedStatus: HttpStatusCode.TOO_MANY_REQUESTS_429 })
109 }) 109 })
110 110
111 it('Should rate limit signup', async function () { 111 it('Should rate limit signup', async function () {
112 for (let i = 0; i < 10; i++) { 112 for (let i = 0; i < 10; i++) {
113 try { 113 try {
114 await registerUser(server.url, 'test' + i, 'password') 114 await server.usersCommand.register({ username: 'test' + i })
115 } catch { 115 } catch {
116 // empty 116 // empty
117 } 117 }
118 } 118 }
119 119
120 await registerUser(server.url, 'test42', 'password', HttpStatusCode.TOO_MANY_REQUESTS_429) 120 await server.usersCommand.register({ username: 'test42', expectedStatus: HttpStatusCode.TOO_MANY_REQUESTS_429 })
121 }) 121 })
122 122
123 it('Should not rate limit failed signup', async function () { 123 it('Should not rate limit failed signup', async function () {
@@ -126,10 +126,10 @@ describe('Test application behind a reverse proxy', function () {
126 await wait(7000) 126 await wait(7000)
127 127
128 for (let i = 0; i < 3; i++) { 128 for (let i = 0; i < 3; i++) {
129 await registerUser(server.url, 'test' + i, 'password', HttpStatusCode.CONFLICT_409) 129 await server.usersCommand.register({ username: 'test' + i, expectedStatus: HttpStatusCode.CONFLICT_409 })
130 } 130 }
131 131
132 await registerUser(server.url, 'test43', 'password', HttpStatusCode.NO_CONTENT_204) 132 await server.usersCommand.register({ username: 'test43', expectedStatus: HttpStatusCode.NO_CONTENT_204 })
133 133
134 }) 134 })
135 135
diff --git a/server/tests/api/server/stats.ts b/server/tests/api/server/stats.ts
index aa26f978d..a35709c26 100644
--- a/server/tests/api/server/stats.ts
+++ b/server/tests/api/server/stats.ts
@@ -4,7 +4,6 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 doubleFollow, 7 doubleFollow,
9 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
10 ServerInfo, 9 ServerInfo,
@@ -35,7 +34,7 @@ describe('Test stats (excluding redundancy)', function () {
35 34
36 await doubleFollow(servers[0], servers[1]) 35 await doubleFollow(servers[0], servers[1])
37 36
38 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 37 await servers[0].usersCommand.create({ username: user.username, password: user.password })
39 38
40 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { fixture: 'video_short.webm' }) 39 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { fixture: 'video_short.webm' })
41 const videoUUID = resVideo.body.video.uuid 40 const videoUUID = resVideo.body.video.uuid
diff --git a/server/tests/api/users/user-subscriptions.ts b/server/tests/api/users/user-subscriptions.ts
index 1d0fc35f1..c09a85a32 100644
--- a/server/tests/api/users/user-subscriptions.ts
+++ b/server/tests/api/users/user-subscriptions.ts
@@ -4,7 +4,6 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 doubleFollow, 7 doubleFollow,
9 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
10 getVideosList, 9 getVideosList,
@@ -39,7 +38,7 @@ describe('Test users subscriptions', function () {
39 { 38 {
40 for (const server of servers) { 39 for (const server of servers) {
41 const user = { username: 'user' + server.serverNumber, password: 'password' } 40 const user = { username: 'user' + server.serverNumber, password: 'password' }
42 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 41 await server.usersCommand.create({ username: user.username, password: user.password })
43 42
44 const accessToken = await server.loginCommand.getAccessToken(user) 43 const accessToken = await server.loginCommand.getAccessToken(user)
45 users.push({ accessToken }) 44 users.push({ accessToken })
diff --git a/server/tests/api/users/users-multiple-servers.ts b/server/tests/api/users/users-multiple-servers.ts
index 99fa08fe2..43e67ee60 100644
--- a/server/tests/api/users/users-multiple-servers.ts
+++ b/server/tests/api/users/users-multiple-servers.ts
@@ -7,17 +7,12 @@ import {
7 checkTmpIsEmpty, 7 checkTmpIsEmpty,
8 checkVideoFilesWereRemoved, 8 checkVideoFilesWereRemoved,
9 cleanupTests, 9 cleanupTests,
10 createUser,
11 doubleFollow, 10 doubleFollow,
12 flushAndRunMultipleServers, 11 flushAndRunMultipleServers,
13 getAccountVideos, 12 getAccountVideos,
14 getMyUserInformation,
15 removeUser,
16 ServerInfo, 13 ServerInfo,
17 setAccessTokensToServers, 14 setAccessTokensToServers,
18 testImage, 15 testImage,
19 updateMyAvatar,
20 updateMyUser,
21 uploadVideo, 16 uploadVideo,
22 waitJobs 17 waitJobs
23} from '@shared/extra-utils' 18} from '@shared/extra-utils'
@@ -56,13 +51,8 @@ describe('Test users with multiple servers', function () {
56 username: 'user1', 51 username: 'user1',
57 password: 'password' 52 password: 'password'
58 } 53 }
59 const res = await createUser({ 54 const created = await servers[0].usersCommand.create(user)
60 url: servers[0].url, 55 userId = created.id
61 accessToken: servers[0].accessToken,
62 username: user.username,
63 password: user.password
64 })
65 userId = res.body.user.id
66 userAccessToken = await servers[0].loginCommand.getAccessToken(user) 56 userAccessToken = await servers[0].loginCommand.getAccessToken(user)
67 } 57 }
68 58
@@ -77,15 +67,9 @@ describe('Test users with multiple servers', function () {
77 it('Should be able to update my display name', async function () { 67 it('Should be able to update my display name', async function () {
78 this.timeout(10000) 68 this.timeout(10000)
79 69
80 await updateMyUser({ 70 await servers[0].usersCommand.updateMe({ displayName: 'my super display name' })
81 url: servers[0].url,
82 accessToken: servers[0].accessToken,
83 displayName: 'my super display name'
84 })
85
86 const res = await getMyUserInformation(servers[0].url, servers[0].accessToken)
87 user = res.body
88 71
72 user = await servers[0].usersCommand.getMyInfo()
89 expect(user.account.displayName).to.equal('my super display name') 73 expect(user.account.displayName).to.equal('my super display name')
90 74
91 await waitJobs(servers) 75 await waitJobs(servers)
@@ -94,14 +78,9 @@ describe('Test users with multiple servers', function () {
94 it('Should be able to update my description', async function () { 78 it('Should be able to update my description', async function () {
95 this.timeout(10_000) 79 this.timeout(10_000)
96 80
97 await updateMyUser({ 81 await servers[0].usersCommand.updateMe({ description: 'my super description updated' })
98 url: servers[0].url,
99 accessToken: servers[0].accessToken,
100 description: 'my super description updated'
101 })
102 82
103 const res = await getMyUserInformation(servers[0].url, servers[0].accessToken) 83 user = await servers[0].usersCommand.getMyInfo()
104 user = res.body
105 expect(user.account.displayName).to.equal('my super display name') 84 expect(user.account.displayName).to.equal('my super display name')
106 expect(user.account.description).to.equal('my super description updated') 85 expect(user.account.description).to.equal('my super description updated')
107 86
@@ -113,15 +92,9 @@ describe('Test users with multiple servers', function () {
113 92
114 const fixture = 'avatar2.png' 93 const fixture = 'avatar2.png'
115 94
116 await updateMyAvatar({ 95 await servers[0].usersCommand.updateMyAvatar({ fixture })
117 url: servers[0].url,
118 accessToken: servers[0].accessToken,
119 fixture
120 })
121
122 const res = await getMyUserInformation(servers[0].url, servers[0].accessToken)
123 user = res.body
124 96
97 user = await servers[0].usersCommand.getMyInfo()
125 userAvatarFilename = user.account.avatar.path 98 userAvatarFilename = user.account.avatar.path
126 99
127 await testImage(servers[0].url, 'avatar2-resized', userAvatarFilename, '.png') 100 await testImage(servers[0].url, 'avatar2-resized', userAvatarFilename, '.png')
@@ -202,7 +175,7 @@ describe('Test users with multiple servers', function () {
202 expect(videoChannelDeleted).not.to.be.undefined 175 expect(videoChannelDeleted).not.to.be.undefined
203 } 176 }
204 177
205 await removeUser(servers[0].url, userId, servers[0].accessToken) 178 await servers[0].usersCommand.remove({ userId })
206 179
207 await waitJobs(servers) 180 await waitJobs(servers)
208 181
diff --git a/server/tests/api/users/users-verification.ts b/server/tests/api/users/users-verification.ts
index ade730323..271aa3c7a 100644
--- a/server/tests/api/users/users-verification.ts
+++ b/server/tests/api/users/users-verification.ts
@@ -3,20 +3,7 @@
3import 'mocha' 3import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import { cleanupTests, flushAndRunServer, MockSmtpServer, ServerInfo, setAccessTokensToServers, waitJobs } from '@shared/extra-utils'
7 cleanupTests,
8 flushAndRunServer,
9 getMyUserInformation,
10 getUserInformation,
11 MockSmtpServer,
12 registerUser,
13 ServerInfo,
14 setAccessTokensToServers,
15 updateMyUser,
16 verifyEmail,
17 waitJobs
18} from '@shared/extra-utils'
19import { User } from '@shared/models'
20 7
21const expect = chai.expect 8const expect = chai.expect
22 9
@@ -65,7 +52,7 @@ describe('Test users account verification', function () {
65 } 52 }
66 }) 53 })
67 54
68 await registerUser(server.url, user1.username, user1.password) 55 await server.usersCommand.register(user1)
69 56
70 await waitJobs(server) 57 await waitJobs(server)
71 expectedEmailsLength++ 58 expectedEmailsLength++
@@ -84,8 +71,8 @@ describe('Test users account verification', function () {
84 71
85 userId = parseInt(userIdMatches[1], 10) 72 userId = parseInt(userIdMatches[1], 10)
86 73
87 const resUserInfo = await getUserInformation(server.url, server.accessToken, userId) 74 const body = await server.usersCommand.get({ userId })
88 expect(resUserInfo.body.emailVerified).to.be.false 75 expect(body.emailVerified).to.be.false
89 }) 76 })
90 77
91 it('Should not allow login for user with unverified email', async function () { 78 it('Should not allow login for user with unverified email', async function () {
@@ -94,13 +81,13 @@ describe('Test users account verification', function () {
94 }) 81 })
95 82
96 it('Should verify the user via email and allow login', async function () { 83 it('Should verify the user via email and allow login', async function () {
97 await verifyEmail(server.url, userId, verificationString) 84 await server.usersCommand.verifyEmail({ userId, verificationString })
98 85
99 const body = await server.loginCommand.login({ user: user1 }) 86 const body = await server.loginCommand.login({ user: user1 })
100 userAccessToken = body.access_token 87 userAccessToken = body.access_token
101 88
102 const resUserVerified = await getUserInformation(server.url, server.accessToken, userId) 89 const user = await server.usersCommand.get({ userId })
103 expect(resUserVerified.body.emailVerified).to.be.true 90 expect(user.emailVerified).to.be.true
104 }) 91 })
105 92
106 it('Should be able to change the user email', async function () { 93 it('Should be able to change the user email', async function () {
@@ -109,9 +96,8 @@ describe('Test users account verification', function () {
109 let updateVerificationString: string 96 let updateVerificationString: string
110 97
111 { 98 {
112 await updateMyUser({ 99 await server.usersCommand.updateMe({
113 url: server.url, 100 token: userAccessToken,
114 accessToken: userAccessToken,
115 email: 'updated@example.com', 101 email: 'updated@example.com',
116 currentPassword: user1.password 102 currentPassword: user1.password
117 }) 103 })
@@ -127,19 +113,15 @@ describe('Test users account verification', function () {
127 } 113 }
128 114
129 { 115 {
130 const res = await getMyUserInformation(server.url, userAccessToken) 116 const me = await server.usersCommand.getMyInfo({ token: userAccessToken })
131 const me: User = res.body
132
133 expect(me.email).to.equal('user_1@example.com') 117 expect(me.email).to.equal('user_1@example.com')
134 expect(me.pendingEmail).to.equal('updated@example.com') 118 expect(me.pendingEmail).to.equal('updated@example.com')
135 } 119 }
136 120
137 { 121 {
138 await verifyEmail(server.url, userId, updateVerificationString, true) 122 await server.usersCommand.verifyEmail({ userId, verificationString: updateVerificationString, isPendingEmail: true })
139
140 const res = await getMyUserInformation(server.url, userAccessToken)
141 const me: User = res.body
142 123
124 const me = await server.usersCommand.getMyInfo({ token: userAccessToken })
143 expect(me.email).to.equal('updated@example.com') 125 expect(me.email).to.equal('updated@example.com')
144 expect(me.pendingEmail).to.be.null 126 expect(me.pendingEmail).to.be.null
145 } 127 }
@@ -157,15 +139,15 @@ describe('Test users account verification', function () {
157 } 139 }
158 }) 140 })
159 141
160 await registerUser(server.url, user2.username, user2.password) 142 await server.usersCommand.register(user2)
161 143
162 await waitJobs(server) 144 await waitJobs(server)
163 expect(emails).to.have.lengthOf(expectedEmailsLength) 145 expect(emails).to.have.lengthOf(expectedEmailsLength)
164 146
165 const accessToken = await server.loginCommand.getAccessToken(user2) 147 const accessToken = await server.loginCommand.getAccessToken(user2)
166 148
167 const resMyUserInfo = await getMyUserInformation(server.url, accessToken) 149 const user = await server.usersCommand.getMyInfo({ token: accessToken })
168 expect(resMyUserInfo.body.emailVerified).to.be.null 150 expect(user.emailVerified).to.be.null
169 }) 151 })
170 152
171 it('Should allow login for user with unverified email when setting later enabled', async function () { 153 it('Should allow login for user with unverified email when setting later enabled', async function () {
diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts
index 608bedb8b..30d7e850d 100644
--- a/server/tests/api/users/users.ts
+++ b/server/tests/api/users/users.ts
@@ -4,37 +4,22 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 blockUser,
8 cleanupTests, 7 cleanupTests,
9 createUser,
10 deleteMe,
11 flushAndRunServer, 8 flushAndRunServer,
12 getMyUserInformation,
13 getMyUserVideoQuotaUsed,
14 getMyUserVideoRating,
15 getMyVideos, 9 getMyVideos,
16 getUserInformation,
17 getUsersList,
18 getUsersListPaginationAndSort,
19 getVideosList, 10 getVideosList,
20 killallServers, 11 killallServers,
21 makePutBodyRequest, 12 makePutBodyRequest,
22 rateVideo, 13 rateVideo,
23 registerUserWithChannel,
24 removeUser,
25 removeVideo, 14 removeVideo,
26 reRunServer, 15 reRunServer,
27 ServerInfo, 16 ServerInfo,
28 setAccessTokensToServers, 17 setAccessTokensToServers,
29 testImage, 18 testImage,
30 unblockUser,
31 updateMyAvatar,
32 updateMyUser,
33 updateUser,
34 uploadVideo, 19 uploadVideo,
35 waitJobs 20 waitJobs
36} from '@shared/extra-utils' 21} from '@shared/extra-utils'
37import { AbuseState, MyUser, OAuth2ErrorCode, User, UserAdminFlag, UserRole, Video, VideoPlaylistType } from '@shared/models' 22import { AbuseState, OAuth2ErrorCode, UserAdminFlag, UserRole, Video, VideoPlaylistType } from '@shared/models'
38 23
39const expect = chai.expect 24const expect = chai.expect
40 25
@@ -174,8 +159,7 @@ describe('Test users', function () {
174 159
175 it('Should retrieve a video rating', async function () { 160 it('Should retrieve a video rating', async function () {
176 await rateVideo(server.url, accessToken, videoId, 'like') 161 await rateVideo(server.url, accessToken, videoId, 'like')
177 const res = await getMyUserVideoRating(server.url, accessToken, videoId) 162 const rating = await server.usersCommand.getMyRating({ token: accessToken, videoId })
178 const rating = res.body
179 163
180 expect(rating.videoId).to.equal(videoId) 164 expect(rating.videoId).to.equal(videoId)
181 expect(rating.rating).to.equal('like') 165 expect(rating.rating).to.equal('like')
@@ -222,7 +206,7 @@ describe('Test users', function () {
222 }) 206 })
223 207
224 it('Should not be able to get the user information', async function () { 208 it('Should not be able to get the user information', async function () {
225 await getMyUserInformation(server.url, server.accessToken, HttpStatusCode.UNAUTHORIZED_401) 209 await server.usersCommand.getMyInfo({ expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
226 }) 210 })
227 211
228 it('Should not be able to upload a video', async function () { 212 it('Should not be able to upload a video', async function () {
@@ -252,7 +236,7 @@ describe('Test users', function () {
252 }) 236 })
253 237
254 it('Should be able to get my user information again', async function () { 238 it('Should be able to get my user information again', async function () {
255 await getMyUserInformation(server.url, server.accessToken) 239 await server.usersCommand.getMyInfo()
256 }) 240 })
257 241
258 it('Should have an expired access token', async function () { 242 it('Should have an expired access token', async function () {
@@ -264,7 +248,7 @@ describe('Test users', function () {
264 await killallServers([ server ]) 248 await killallServers([ server ])
265 await reRunServer(server) 249 await reRunServer(server)
266 250
267 await getMyUserInformation(server.url, server.accessToken, HttpStatusCode.UNAUTHORIZED_401) 251 await server.usersCommand.getMyInfo({ expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
268 }) 252 })
269 253
270 it('Should not be able to refresh an access token with an expired refresh token', async function () { 254 it('Should not be able to refresh an access token with an expired refresh token', async function () {
@@ -286,21 +270,14 @@ describe('Test users', function () {
286 }) 270 })
287 271
288 it('Should be able to get my user information again', async function () { 272 it('Should be able to get my user information again', async function () {
289 await getMyUserInformation(server.url, server.accessToken) 273 await server.usersCommand.getMyInfo()
290 }) 274 })
291 }) 275 })
292 276
293 describe('Creating a user', function () { 277 describe('Creating a user', function () {
294 278
295 it('Should be able to create a new user', async function () { 279 it('Should be able to create a new user', async function () {
296 await createUser({ 280 await server.usersCommand.create({ ...user, videoQuota: 2 * 1024 * 1024, adminFlags: UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST })
297 url: server.url,
298 accessToken: accessToken,
299 username: user.username,
300 password: user.password,
301 videoQuota: 2 * 1024 * 1024,
302 adminFlags: UserAdminFlag.BYPASS_VIDEO_AUTO_BLACKLIST
303 })
304 }) 281 })
305 282
306 it('Should be able to login with this user', async function () { 283 it('Should be able to login with this user', async function () {
@@ -308,11 +285,9 @@ describe('Test users', function () {
308 }) 285 })
309 286
310 it('Should be able to get user information', async function () { 287 it('Should be able to get user information', async function () {
311 const res1 = await getMyUserInformation(server.url, accessTokenUser) 288 const userMe = await server.usersCommand.getMyInfo({ token: accessTokenUser })
312 const userMe: MyUser = res1.body
313 289
314 const res2 = await getUserInformation(server.url, server.accessToken, userMe.id, true) 290 const userGet = await server.usersCommand.get({ userId: userMe.id, withStats: true })
315 const userGet: User = res2.body
316 291
317 for (const user of [ userMe, userGet ]) { 292 for (const user of [ userMe, userGet ]) {
318 expect(user.username).to.equal('user_1') 293 expect(user.username).to.equal('user_1')
@@ -356,15 +331,11 @@ describe('Test users', function () {
356 }) 331 })
357 332
358 it('Should have video quota updated', async function () { 333 it('Should have video quota updated', async function () {
359 const res = await getMyUserVideoQuotaUsed(server.url, accessTokenUser) 334 const quota = await server.usersCommand.getMyQuotaUsed({ token: accessTokenUser })
360 const data = res.body 335 expect(quota.videoQuotaUsed).to.equal(218910)
361
362 expect(data.videoQuotaUsed).to.equal(218910)
363
364 const resUsers = await getUsersList(server.url, server.accessToken)
365 336
366 const users: User[] = resUsers.body.data 337 const { data } = await server.usersCommand.list()
367 const tmpUser = users.find(u => u.username === user.username) 338 const tmpUser = data.find(u => u.username === user.username)
368 expect(tmpUser.videoQuotaUsed).to.equal(218910) 339 expect(tmpUser.videoQuotaUsed).to.equal(218910)
369 }) 340 })
370 341
@@ -421,9 +392,7 @@ describe('Test users', function () {
421 } 392 }
422 393
423 { 394 {
424 const res = await getMyUserVideoQuotaUsed(server.url, accessTokenUser) 395 const data = await server.usersCommand.getMyQuotaUsed({ token: accessTokenUser })
425 const data = res.body
426
427 expect(data.videoQuotaUsed).to.be.greaterThan(220000) 396 expect(data.videoQuotaUsed).to.be.greaterThan(220000)
428 } 397 }
429 }) 398 })
@@ -432,21 +401,18 @@ describe('Test users', function () {
432 describe('Users listing', function () { 401 describe('Users listing', function () {
433 402
434 it('Should list all the users', async function () { 403 it('Should list all the users', async function () {
435 const res = await getUsersList(server.url, server.accessToken) 404 const { data, total } = await server.usersCommand.list()
436 const result = res.body
437 const total = result.total
438 const users = result.data
439 405
440 expect(total).to.equal(2) 406 expect(total).to.equal(2)
441 expect(users).to.be.an('array') 407 expect(data).to.be.an('array')
442 expect(users.length).to.equal(2) 408 expect(data.length).to.equal(2)
443 409
444 const user = users[0] 410 const user = data[0]
445 expect(user.username).to.equal('user_1') 411 expect(user.username).to.equal('user_1')
446 expect(user.email).to.equal('user_1@example.com') 412 expect(user.email).to.equal('user_1@example.com')
447 expect(user.nsfwPolicy).to.equal('display') 413 expect(user.nsfwPolicy).to.equal('display')
448 414
449 const rootUser = users[1] 415 const rootUser = data[1]
450 expect(rootUser.username).to.equal('root') 416 expect(rootUser.username).to.equal('root')
451 expect(rootUser.email).to.equal('admin' + server.internalServerNumber + '@example.com') 417 expect(rootUser.email).to.equal('admin' + server.internalServerNumber + '@example.com')
452 expect(user.nsfwPolicy).to.equal('display') 418 expect(user.nsfwPolicy).to.equal('display')
@@ -458,16 +424,12 @@ describe('Test users', function () {
458 }) 424 })
459 425
460 it('Should list only the first user by username asc', async function () { 426 it('Should list only the first user by username asc', async function () {
461 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 1, 'username') 427 const { total, data } = await server.usersCommand.list({ start: 0, count: 1, sort: 'username' })
462
463 const result = res.body
464 const total = result.total
465 const users = result.data
466 428
467 expect(total).to.equal(2) 429 expect(total).to.equal(2)
468 expect(users.length).to.equal(1) 430 expect(data.length).to.equal(1)
469 431
470 const user = users[0] 432 const user = data[0]
471 expect(user.username).to.equal('root') 433 expect(user.username).to.equal('root')
472 expect(user.email).to.equal('admin' + server.internalServerNumber + '@example.com') 434 expect(user.email).to.equal('admin' + server.internalServerNumber + '@example.com')
473 expect(user.roleLabel).to.equal('Administrator') 435 expect(user.roleLabel).to.equal('Administrator')
@@ -475,84 +437,66 @@ describe('Test users', function () {
475 }) 437 })
476 438
477 it('Should list only the first user by username desc', async function () { 439 it('Should list only the first user by username desc', async function () {
478 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 1, '-username') 440 const { total, data } = await server.usersCommand.list({ start: 0, count: 1, sort: '-username' })
479 const result = res.body
480 const total = result.total
481 const users = result.data
482 441
483 expect(total).to.equal(2) 442 expect(total).to.equal(2)
484 expect(users.length).to.equal(1) 443 expect(data.length).to.equal(1)
485 444
486 const user = users[0] 445 const user = data[0]
487 expect(user.username).to.equal('user_1') 446 expect(user.username).to.equal('user_1')
488 expect(user.email).to.equal('user_1@example.com') 447 expect(user.email).to.equal('user_1@example.com')
489 expect(user.nsfwPolicy).to.equal('display') 448 expect(user.nsfwPolicy).to.equal('display')
490 }) 449 })
491 450
492 it('Should list only the second user by createdAt desc', async function () { 451 it('Should list only the second user by createdAt desc', async function () {
493 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 1, '-createdAt') 452 const { data, total } = await server.usersCommand.list({ start: 0, count: 1, sort: '-createdAt' })
494 const result = res.body
495 const total = result.total
496 const users = result.data
497
498 expect(total).to.equal(2) 453 expect(total).to.equal(2)
499 expect(users.length).to.equal(1)
500 454
501 const user = users[0] 455 expect(data.length).to.equal(1)
456
457 const user = data[0]
502 expect(user.username).to.equal('user_1') 458 expect(user.username).to.equal('user_1')
503 expect(user.email).to.equal('user_1@example.com') 459 expect(user.email).to.equal('user_1@example.com')
504 expect(user.nsfwPolicy).to.equal('display') 460 expect(user.nsfwPolicy).to.equal('display')
505 }) 461 })
506 462
507 it('Should list all the users by createdAt asc', async function () { 463 it('Should list all the users by createdAt asc', async function () {
508 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt') 464 const { data, total } = await server.usersCommand.list({ start: 0, count: 2, sort: 'createdAt' })
509 const result = res.body
510 const total = result.total
511 const users = result.data
512 465
513 expect(total).to.equal(2) 466 expect(total).to.equal(2)
514 expect(users.length).to.equal(2) 467 expect(data.length).to.equal(2)
515 468
516 expect(users[0].username).to.equal('root') 469 expect(data[0].username).to.equal('root')
517 expect(users[0].email).to.equal('admin' + server.internalServerNumber + '@example.com') 470 expect(data[0].email).to.equal('admin' + server.internalServerNumber + '@example.com')
518 expect(users[0].nsfwPolicy).to.equal('display') 471 expect(data[0].nsfwPolicy).to.equal('display')
519 472
520 expect(users[1].username).to.equal('user_1') 473 expect(data[1].username).to.equal('user_1')
521 expect(users[1].email).to.equal('user_1@example.com') 474 expect(data[1].email).to.equal('user_1@example.com')
522 expect(users[1].nsfwPolicy).to.equal('display') 475 expect(data[1].nsfwPolicy).to.equal('display')
523 }) 476 })
524 477
525 it('Should search user by username', async function () { 478 it('Should search user by username', async function () {
526 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'oot') 479 const { data, total } = await server.usersCommand.list({ start: 0, count: 2, sort: 'createdAt', search: 'oot' })
527 const users = res.body.data as User[] 480 expect(total).to.equal(1)
528 481 expect(data.length).to.equal(1)
529 expect(res.body.total).to.equal(1) 482 expect(data[0].username).to.equal('root')
530 expect(users.length).to.equal(1)
531
532 expect(users[0].username).to.equal('root')
533 }) 483 })
534 484
535 it('Should search user by email', async function () { 485 it('Should search user by email', async function () {
536 { 486 {
537 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'r_1@exam') 487 const { total, data } = await server.usersCommand.list({ start: 0, count: 2, sort: 'createdAt', search: 'r_1@exam' })
538 const users = res.body.data as User[] 488 expect(total).to.equal(1)
539 489 expect(data.length).to.equal(1)
540 expect(res.body.total).to.equal(1) 490 expect(data[0].username).to.equal('user_1')
541 expect(users.length).to.equal(1) 491 expect(data[0].email).to.equal('user_1@example.com')
542
543 expect(users[0].username).to.equal('user_1')
544 expect(users[0].email).to.equal('user_1@example.com')
545 } 492 }
546 493
547 { 494 {
548 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', 'example') 495 const { total, data } = await server.usersCommand.list({ start: 0, count: 2, sort: 'createdAt', search: 'example' })
549 const users = res.body.data as User[] 496 expect(total).to.equal(2)
550 497 expect(data.length).to.equal(2)
551 expect(res.body.total).to.equal(2) 498 expect(data[0].username).to.equal('root')
552 expect(users.length).to.equal(2) 499 expect(data[1].username).to.equal('user_1')
553
554 expect(users[0].username).to.equal('root')
555 expect(users[1].username).to.equal('user_1')
556 } 500 }
557 }) 501 })
558 }) 502 })
@@ -560,9 +504,8 @@ describe('Test users', function () {
560 describe('Update my account', function () { 504 describe('Update my account', function () {
561 505
562 it('Should update my password', async function () { 506 it('Should update my password', async function () {
563 await updateMyUser({ 507 await server.usersCommand.updateMe({
564 url: server.url, 508 token: accessTokenUser,
565 accessToken: accessTokenUser,
566 currentPassword: 'super password', 509 currentPassword: 'super password',
567 password: 'new password' 510 password: 'new password'
568 }) 511 })
@@ -572,15 +515,12 @@ describe('Test users', function () {
572 }) 515 })
573 516
574 it('Should be able to change the NSFW display attribute', async function () { 517 it('Should be able to change the NSFW display attribute', async function () {
575 await updateMyUser({ 518 await server.usersCommand.updateMe({
576 url: server.url, 519 token: accessTokenUser,
577 accessToken: accessTokenUser,
578 nsfwPolicy: 'do_not_list' 520 nsfwPolicy: 'do_not_list'
579 }) 521 })
580 522
581 const res = await getMyUserInformation(server.url, accessTokenUser) 523 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
582 const user = res.body
583
584 expect(user.username).to.equal('user_1') 524 expect(user.username).to.equal('user_1')
585 expect(user.email).to.equal('user_1@example.com') 525 expect(user.email).to.equal('user_1@example.com')
586 expect(user.nsfwPolicy).to.equal('do_not_list') 526 expect(user.nsfwPolicy).to.equal('do_not_list')
@@ -591,42 +531,33 @@ describe('Test users', function () {
591 }) 531 })
592 532
593 it('Should be able to change the autoPlayVideo attribute', async function () { 533 it('Should be able to change the autoPlayVideo attribute', async function () {
594 await updateMyUser({ 534 await server.usersCommand.updateMe({
595 url: server.url, 535 token: accessTokenUser,
596 accessToken: accessTokenUser,
597 autoPlayVideo: false 536 autoPlayVideo: false
598 }) 537 })
599 538
600 const res = await getMyUserInformation(server.url, accessTokenUser) 539 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
601 const user = res.body
602
603 expect(user.autoPlayVideo).to.be.false 540 expect(user.autoPlayVideo).to.be.false
604 }) 541 })
605 542
606 it('Should be able to change the autoPlayNextVideo attribute', async function () { 543 it('Should be able to change the autoPlayNextVideo attribute', async function () {
607 await updateMyUser({ 544 await server.usersCommand.updateMe({
608 url: server.url, 545 token: accessTokenUser,
609 accessToken: accessTokenUser,
610 autoPlayNextVideo: true 546 autoPlayNextVideo: true
611 }) 547 })
612 548
613 const res = await getMyUserInformation(server.url, accessTokenUser) 549 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
614 const user = res.body
615
616 expect(user.autoPlayNextVideo).to.be.true 550 expect(user.autoPlayNextVideo).to.be.true
617 }) 551 })
618 552
619 it('Should be able to change the email attribute', async function () { 553 it('Should be able to change the email attribute', async function () {
620 await updateMyUser({ 554 await server.usersCommand.updateMe({
621 url: server.url, 555 token: accessTokenUser,
622 accessToken: accessTokenUser,
623 currentPassword: 'new password', 556 currentPassword: 'new password',
624 email: 'updated@example.com' 557 email: 'updated@example.com'
625 }) 558 })
626 559
627 const res = await getMyUserInformation(server.url, accessTokenUser) 560 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
628 const user = res.body
629
630 expect(user.username).to.equal('user_1') 561 expect(user.username).to.equal('user_1')
631 expect(user.email).to.equal('updated@example.com') 562 expect(user.email).to.equal('updated@example.com')
632 expect(user.nsfwPolicy).to.equal('do_not_list') 563 expect(user.nsfwPolicy).to.equal('do_not_list')
@@ -639,15 +570,9 @@ describe('Test users', function () {
639 it('Should be able to update my avatar with a gif', async function () { 570 it('Should be able to update my avatar with a gif', async function () {
640 const fixture = 'avatar.gif' 571 const fixture = 'avatar.gif'
641 572
642 await updateMyAvatar({ 573 await server.usersCommand.updateMyAvatar({ token: accessTokenUser, fixture })
643 url: server.url,
644 accessToken: accessTokenUser,
645 fixture
646 })
647
648 const res = await getMyUserInformation(server.url, accessTokenUser)
649 const user = res.body
650 574
575 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
651 await testImage(server.url, 'avatar-resized', user.account.avatar.path, '.gif') 576 await testImage(server.url, 'avatar-resized', user.account.avatar.path, '.gif')
652 }) 577 })
653 578
@@ -655,29 +580,17 @@ describe('Test users', function () {
655 for (const extension of [ '.png', '.gif' ]) { 580 for (const extension of [ '.png', '.gif' ]) {
656 const fixture = 'avatar' + extension 581 const fixture = 'avatar' + extension
657 582
658 await updateMyAvatar({ 583 await server.usersCommand.updateMyAvatar({ token: accessTokenUser, fixture })
659 url: server.url,
660 accessToken: accessTokenUser,
661 fixture
662 })
663
664 const res = await getMyUserInformation(server.url, accessTokenUser)
665 const user = res.body
666 584
585 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
667 await testImage(server.url, 'avatar-resized', user.account.avatar.path, extension) 586 await testImage(server.url, 'avatar-resized', user.account.avatar.path, extension)
668 } 587 }
669 }) 588 })
670 589
671 it('Should be able to update my display name', async function () { 590 it('Should be able to update my display name', async function () {
672 await updateMyUser({ 591 await server.usersCommand.updateMe({ token: accessTokenUser, displayName: 'new display name' })
673 url: server.url,
674 accessToken: accessTokenUser,
675 displayName: 'new display name'
676 })
677
678 const res = await getMyUserInformation(server.url, accessTokenUser)
679 const user = res.body
680 592
593 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
681 expect(user.username).to.equal('user_1') 594 expect(user.username).to.equal('user_1')
682 expect(user.email).to.equal('updated@example.com') 595 expect(user.email).to.equal('updated@example.com')
683 expect(user.nsfwPolicy).to.equal('do_not_list') 596 expect(user.nsfwPolicy).to.equal('do_not_list')
@@ -688,15 +601,9 @@ describe('Test users', function () {
688 }) 601 })
689 602
690 it('Should be able to update my description', async function () { 603 it('Should be able to update my description', async function () {
691 await updateMyUser({ 604 await server.usersCommand.updateMe({ token: accessTokenUser, description: 'my super description updated' })
692 url: server.url,
693 accessToken: accessTokenUser,
694 description: 'my super description updated'
695 })
696
697 const res = await getMyUserInformation(server.url, accessTokenUser)
698 const user: User = res.body
699 605
606 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
700 expect(user.username).to.equal('user_1') 607 expect(user.username).to.equal('user_1')
701 expect(user.email).to.equal('updated@example.com') 608 expect(user.email).to.equal('updated@example.com')
702 expect(user.nsfwPolicy).to.equal('do_not_list') 609 expect(user.nsfwPolicy).to.equal('do_not_list')
@@ -710,30 +617,21 @@ describe('Test users', function () {
710 617
711 it('Should be able to update my theme', async function () { 618 it('Should be able to update my theme', async function () {
712 for (const theme of [ 'background-red', 'default', 'instance-default' ]) { 619 for (const theme of [ 'background-red', 'default', 'instance-default' ]) {
713 await updateMyUser({ 620 await server.usersCommand.updateMe({ token: accessTokenUser, theme })
714 url: server.url,
715 accessToken: accessTokenUser,
716 theme
717 })
718 621
719 const res = await getMyUserInformation(server.url, accessTokenUser) 622 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
720 const body: User = res.body 623 expect(user.theme).to.equal(theme)
721
722 expect(body.theme).to.equal(theme)
723 } 624 }
724 }) 625 })
725 626
726 it('Should be able to update my modal preferences', async function () { 627 it('Should be able to update my modal preferences', async function () {
727 await updateMyUser({ 628 await server.usersCommand.updateMe({
728 url: server.url, 629 token: accessTokenUser,
729 accessToken: accessTokenUser,
730 noInstanceConfigWarningModal: true, 630 noInstanceConfigWarningModal: true,
731 noWelcomeModal: true 631 noWelcomeModal: true
732 }) 632 })
733 633
734 const res = await getMyUserInformation(server.url, accessTokenUser) 634 const user = await server.usersCommand.getMyInfo({ token: accessTokenUser })
735 const user: User = res.body
736
737 expect(user.noWelcomeModal).to.be.true 635 expect(user.noWelcomeModal).to.be.true
738 expect(user.noInstanceConfigWarningModal).to.be.true 636 expect(user.noInstanceConfigWarningModal).to.be.true
739 }) 637 })
@@ -741,10 +639,9 @@ describe('Test users', function () {
741 639
742 describe('Updating another user', function () { 640 describe('Updating another user', function () {
743 it('Should be able to update another user', async function () { 641 it('Should be able to update another user', async function () {
744 await updateUser({ 642 await server.usersCommand.update({
745 url: server.url,
746 userId, 643 userId,
747 accessToken, 644 token: accessToken,
748 email: 'updated2@example.com', 645 email: 'updated2@example.com',
749 emailVerified: true, 646 emailVerified: true,
750 videoQuota: 42, 647 videoQuota: 42,
@@ -753,8 +650,7 @@ describe('Test users', function () {
753 pluginAuth: 'toto' 650 pluginAuth: 'toto'
754 }) 651 })
755 652
756 const res = await getUserInformation(server.url, accessToken, userId) 653 const user = await server.usersCommand.get({ token: accessToken, userId })
757 const user = res.body as User
758 654
759 expect(user.username).to.equal('user_1') 655 expect(user.username).to.equal('user_1')
760 expect(user.email).to.equal('updated2@example.com') 656 expect(user.email).to.equal('updated2@example.com')
@@ -768,28 +664,22 @@ describe('Test users', function () {
768 }) 664 })
769 665
770 it('Should reset the auth plugin', async function () { 666 it('Should reset the auth plugin', async function () {
771 await updateUser({ url: server.url, userId, accessToken, pluginAuth: null }) 667 await server.usersCommand.update({ userId, token: accessToken, pluginAuth: null })
772 668
773 const res = await getUserInformation(server.url, accessToken, userId) 669 const user = await server.usersCommand.get({ token: accessToken, userId })
774 const user = res.body as User
775 expect(user.pluginAuth).to.be.null 670 expect(user.pluginAuth).to.be.null
776 }) 671 })
777 672
778 it('Should have removed the user token', async function () { 673 it('Should have removed the user token', async function () {
779 await getMyUserVideoQuotaUsed(server.url, accessTokenUser, HttpStatusCode.UNAUTHORIZED_401) 674 await server.usersCommand.getMyQuotaUsed({ token: accessTokenUser, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
780 675
781 accessTokenUser = await server.loginCommand.getAccessToken(user) 676 accessTokenUser = await server.loginCommand.getAccessToken(user)
782 }) 677 })
783 678
784 it('Should be able to update another user password', async function () { 679 it('Should be able to update another user password', async function () {
785 await updateUser({ 680 await server.usersCommand.update({ userId, token: accessToken, password: 'password updated' })
786 url: server.url,
787 userId,
788 accessToken,
789 password: 'password updated'
790 })
791 681
792 await getMyUserVideoQuotaUsed(server.url, accessTokenUser, HttpStatusCode.UNAUTHORIZED_401) 682 await server.usersCommand.getMyQuotaUsed({ token: accessTokenUser, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
793 683
794 await server.loginCommand.login({ user, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) 684 await server.loginCommand.login({ user, expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
795 685
@@ -806,7 +696,7 @@ describe('Test users', function () {
806 696
807 describe('Remove a user', function () { 697 describe('Remove a user', function () {
808 it('Should be able to remove this user', async function () { 698 it('Should be able to remove this user', async function () {
809 await removeUser(server.url, userId, accessToken) 699 await server.usersCommand.remove({ userId, token: accessToken })
810 }) 700 })
811 701
812 it('Should not be able to login with this user', async function () { 702 it('Should not be able to login with this user', async function () {
@@ -830,7 +720,7 @@ describe('Test users', function () {
830 const user = { displayName: 'super user 15', username: 'user_15', password: 'my super password' } 720 const user = { displayName: 'super user 15', username: 'user_15', password: 'my super password' }
831 const channel = { name: 'my_user_15_channel', displayName: 'my channel rocks' } 721 const channel = { name: 'my_user_15_channel', displayName: 'my channel rocks' }
832 722
833 await registerUserWithChannel({ url: server.url, user, channel }) 723 await server.usersCommand.register({ ...user, channel })
834 }) 724 })
835 725
836 it('Should be able to login with this registered user', async function () { 726 it('Should be able to login with this registered user', async function () {
@@ -843,16 +733,12 @@ describe('Test users', function () {
843 }) 733 })
844 734
845 it('Should have the correct display name', async function () { 735 it('Should have the correct display name', async function () {
846 const res = await getMyUserInformation(server.url, user15AccessToken) 736 const user = await server.usersCommand.getMyInfo({ token: user15AccessToken })
847 const user: User = res.body
848
849 expect(user.account.displayName).to.equal('super user 15') 737 expect(user.account.displayName).to.equal('super user 15')
850 }) 738 })
851 739
852 it('Should have the correct video quota', async function () { 740 it('Should have the correct video quota', async function () {
853 const res = await getMyUserInformation(server.url, user15AccessToken) 741 const user = await server.usersCommand.getMyInfo({ token: user15AccessToken })
854 const user = res.body
855
856 expect(user.videoQuota).to.equal(5 * 1024 * 1024) 742 expect(user.videoQuota).to.equal(5 * 1024 * 1024)
857 }) 743 })
858 744
@@ -864,15 +750,15 @@ describe('Test users', function () {
864 750
865 it('Should remove me', async function () { 751 it('Should remove me', async function () {
866 { 752 {
867 const res = await getUsersList(server.url, server.accessToken) 753 const { data } = await server.usersCommand.list()
868 expect(res.body.data.find(u => u.username === 'user_15')).to.not.be.undefined 754 expect(data.find(u => u.username === 'user_15')).to.not.be.undefined
869 } 755 }
870 756
871 await deleteMe(server.url, user15AccessToken) 757 await server.usersCommand.deleteMe({ token: user15AccessToken })
872 758
873 { 759 {
874 const res = await getUsersList(server.url, server.accessToken) 760 const { data } = await server.usersCommand.list()
875 expect(res.body.data.find(u => u.username === 'user_15')).to.be.undefined 761 expect(data.find(u => u.username === 'user_15')).to.be.undefined
876 } 762 }
877 }) 763 })
878 }) 764 })
@@ -886,49 +772,40 @@ describe('Test users', function () {
886 } 772 }
887 773
888 it('Should block a user', async function () { 774 it('Should block a user', async function () {
889 const resUser = await createUser({ 775 const user = await server.usersCommand.create({ ...user16 })
890 url: server.url, 776 user16Id = user.id
891 accessToken: server.accessToken,
892 username: user16.username,
893 password: user16.password
894 })
895 user16Id = resUser.body.user.id
896 777
897 user16AccessToken = await server.loginCommand.getAccessToken(user16) 778 user16AccessToken = await server.loginCommand.getAccessToken(user16)
898 779
899 await getMyUserInformation(server.url, user16AccessToken, HttpStatusCode.OK_200) 780 await server.usersCommand.getMyInfo({ token: user16AccessToken, expectedStatus: HttpStatusCode.OK_200 })
900 await blockUser(server.url, user16Id, server.accessToken) 781 await server.usersCommand.banUser({ userId: user16Id })
901 782
902 await getMyUserInformation(server.url, user16AccessToken, HttpStatusCode.UNAUTHORIZED_401) 783 await server.usersCommand.getMyInfo({ token: user16AccessToken, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
903 await server.loginCommand.login({ user: user16, expectedStatus: HttpStatusCode.BAD_REQUEST_400 }) 784 await server.loginCommand.login({ user: user16, expectedStatus: HttpStatusCode.BAD_REQUEST_400 })
904 }) 785 })
905 786
906 it('Should search user by banned status', async function () { 787 it('Should search user by banned status', async function () {
907 { 788 {
908 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', undefined, true) 789 const { data, total } = await server.usersCommand.list({ start: 0, count: 2, sort: 'createdAt', blocked: true })
909 const users = res.body.data as User[] 790 expect(total).to.equal(1)
791 expect(data.length).to.equal(1)
910 792
911 expect(res.body.total).to.equal(1) 793 expect(data[0].username).to.equal(user16.username)
912 expect(users.length).to.equal(1)
913
914 expect(users[0].username).to.equal(user16.username)
915 } 794 }
916 795
917 { 796 {
918 const res = await getUsersListPaginationAndSort(server.url, server.accessToken, 0, 2, 'createdAt', undefined, false) 797 const { data, total } = await server.usersCommand.list({ start: 0, count: 2, sort: 'createdAt', blocked: false })
919 const users = res.body.data as User[] 798 expect(total).to.equal(1)
920 799 expect(data.length).to.equal(1)
921 expect(res.body.total).to.equal(1)
922 expect(users.length).to.equal(1)
923 800
924 expect(users[0].username).to.not.equal(user16.username) 801 expect(data[0].username).to.not.equal(user16.username)
925 } 802 }
926 }) 803 })
927 804
928 it('Should unblock a user', async function () { 805 it('Should unblock a user', async function () {
929 await unblockUser(server.url, user16Id, server.accessToken) 806 await server.usersCommand.unbanUser({ userId: user16Id })
930 user16AccessToken = await server.loginCommand.getAccessToken(user16) 807 user16AccessToken = await server.loginCommand.getAccessToken(user16)
931 await getMyUserInformation(server.url, user16AccessToken, HttpStatusCode.OK_200) 808 await server.usersCommand.getMyInfo({ token: user16AccessToken, expectedStatus: HttpStatusCode.OK_200 })
932 }) 809 })
933 }) 810 })
934 811
@@ -941,19 +818,12 @@ describe('Test users', function () {
941 username: 'user_17', 818 username: 'user_17',
942 password: 'my super password' 819 password: 'my super password'
943 } 820 }
944 const resUser = await createUser({ 821 const created = await server.usersCommand.create({ ...user17 })
945 url: server.url,
946 accessToken: server.accessToken,
947 username: user17.username,
948 password: user17.password
949 })
950 822
951 user17Id = resUser.body.user.id 823 user17Id = created.id
952 user17AccessToken = await server.loginCommand.getAccessToken(user17) 824 user17AccessToken = await server.loginCommand.getAccessToken(user17)
953 825
954 const res = await getUserInformation(server.url, server.accessToken, user17Id, true) 826 const user = await server.usersCommand.get({ userId: user17Id, withStats: true })
955 const user: User = res.body
956
957 expect(user.videosCount).to.equal(0) 827 expect(user.videosCount).to.equal(0)
958 expect(user.videoCommentsCount).to.equal(0) 828 expect(user.videoCommentsCount).to.equal(0)
959 expect(user.abusesCount).to.equal(0) 829 expect(user.abusesCount).to.equal(0)
@@ -969,9 +839,7 @@ describe('Test users', function () {
969 const res1 = await getVideosList(server.url) 839 const res1 = await getVideosList(server.url)
970 videoId = res1.body.data.find(video => video.name === videoAttributes.name).id 840 videoId = res1.body.data.find(video => video.name === videoAttributes.name).id
971 841
972 const res2 = await getUserInformation(server.url, server.accessToken, user17Id, true) 842 const user = await server.usersCommand.get({ userId: user17Id, withStats: true })
973 const user: User = res2.body
974
975 expect(user.videosCount).to.equal(1) 843 expect(user.videosCount).to.equal(1)
976 }) 844 })
977 845
@@ -979,9 +847,7 @@ describe('Test users', function () {
979 const text = 'super comment' 847 const text = 'super comment'
980 await server.commentsCommand.createThread({ token: user17AccessToken, videoId, text }) 848 await server.commentsCommand.createThread({ token: user17AccessToken, videoId, text })
981 849
982 const res = await getUserInformation(server.url, server.accessToken, user17Id, true) 850 const user = await server.usersCommand.get({ userId: user17Id, withStats: true })
983 const user: User = res.body
984
985 expect(user.videoCommentsCount).to.equal(1) 851 expect(user.videoCommentsCount).to.equal(1)
986 }) 852 })
987 853
@@ -992,17 +858,13 @@ describe('Test users', function () {
992 const body1 = await server.abusesCommand.getAdminList() 858 const body1 = await server.abusesCommand.getAdminList()
993 const abuseId = body1.data[0].id 859 const abuseId = body1.data[0].id
994 860
995 const res2 = await getUserInformation(server.url, server.accessToken, user17Id, true) 861 const user2 = await server.usersCommand.get({ userId: user17Id, withStats: true })
996 const user2: User = res2.body
997
998 expect(user2.abusesCount).to.equal(1) // number of incriminations 862 expect(user2.abusesCount).to.equal(1) // number of incriminations
999 expect(user2.abusesCreatedCount).to.equal(1) // number of reports created 863 expect(user2.abusesCreatedCount).to.equal(1) // number of reports created
1000 864
1001 await server.abusesCommand.update({ abuseId, body: { state: AbuseState.ACCEPTED } }) 865 await server.abusesCommand.update({ abuseId, body: { state: AbuseState.ACCEPTED } })
1002 866
1003 const res3 = await getUserInformation(server.url, server.accessToken, user17Id, true) 867 const user3 = await server.usersCommand.get({ userId: user17Id, withStats: true })
1004 const user3: User = res3.body
1005
1006 expect(user3.abusesAcceptedCount).to.equal(1) // number of reports created accepted 868 expect(user3.abusesAcceptedCount).to.equal(1) // number of reports created accepted
1007 }) 869 })
1008 }) 870 })
diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts
index 740314bfd..169bb2e23 100644
--- a/server/tests/api/videos/multiple-servers.ts
+++ b/server/tests/api/videos/multiple-servers.ts
@@ -10,7 +10,6 @@ import {
10 checkVideoFilesWereRemoved, 10 checkVideoFilesWereRemoved,
11 cleanupTests, 11 cleanupTests,
12 completeVideoCheck, 12 completeVideoCheck,
13 createUser,
14 dateIsValid, 13 dateIsValid,
15 doubleFollow, 14 doubleFollow,
16 flushAndRunMultipleServers, 15 flushAndRunMultipleServers,
@@ -153,7 +152,7 @@ describe('Test multiple servers', function () {
153 username: 'user1', 152 username: 'user1',
154 password: 'super_password' 153 password: 'super_password'
155 } 154 }
156 await createUser({ url: servers[1].url, accessToken: servers[1].accessToken, username: user.username, password: user.password }) 155 await servers[1].usersCommand.create({ username: user.username, password: user.password })
157 const userAccessToken = await servers[1].loginCommand.getAccessToken(user) 156 const userAccessToken = await servers[1].loginCommand.getAccessToken(user)
158 157
159 const videoAttributes = { 158 const videoAttributes = {
diff --git a/server/tests/api/videos/resumable-upload.ts b/server/tests/api/videos/resumable-upload.ts
index 5845efc86..642c115d0 100644
--- a/server/tests/api/videos/resumable-upload.ts
+++ b/server/tests/api/videos/resumable-upload.ts
@@ -9,15 +9,13 @@ import {
9 buildAbsoluteFixturePath, 9 buildAbsoluteFixturePath,
10 cleanupTests, 10 cleanupTests,
11 flushAndRunServer, 11 flushAndRunServer,
12 getMyUserInformation,
13 prepareResumableUpload, 12 prepareResumableUpload,
14 sendResumableChunks, 13 sendResumableChunks,
15 ServerInfo, 14 ServerInfo,
16 setAccessTokensToServers, 15 setAccessTokensToServers,
17 setDefaultVideoChannel, 16 setDefaultVideoChannel
18 updateUser
19} from '@shared/extra-utils' 17} from '@shared/extra-utils'
20import { MyUser, VideoPrivacy } from '@shared/models' 18import { VideoPrivacy } from '@shared/models'
21 19
22const expect = chai.expect 20const expect = chai.expect
23 21
@@ -109,15 +107,10 @@ describe('Test resumable upload', function () {
109 await setAccessTokensToServers([ server ]) 107 await setAccessTokensToServers([ server ])
110 await setDefaultVideoChannel([ server ]) 108 await setDefaultVideoChannel([ server ])
111 109
112 const res = await getMyUserInformation(server.url, server.accessToken) 110 const body = await server.usersCommand.getMyInfo()
113 rootId = (res.body as MyUser).id 111 rootId = body.id
114 112
115 await updateUser({ 113 await server.usersCommand.update({ userId: rootId, videoQuota: 10_000_000 })
116 url: server.url,
117 userId: rootId,
118 accessToken: server.accessToken,
119 videoQuota: 10_000_000
120 })
121 }) 114 })
122 115
123 describe('Directory cleaning', function () { 116 describe('Directory cleaning', function () {
diff --git a/server/tests/api/videos/video-change-ownership.ts b/server/tests/api/videos/video-change-ownership.ts
index 17c738e6f..b0bbd5a0d 100644
--- a/server/tests/api/videos/video-change-ownership.ts
+++ b/server/tests/api/videos/video-change-ownership.ts
@@ -6,11 +6,9 @@ import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-c
6import { 6import {
7 ChangeOwnershipCommand, 7 ChangeOwnershipCommand,
8 cleanupTests, 8 cleanupTests,
9 createUser,
10 doubleFollow, 9 doubleFollow,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
12 flushAndRunServer, 11 flushAndRunServer,
13 getMyUserInformation,
14 getVideo, 12 getVideo,
15 getVideosList, 13 getVideosList,
16 ServerInfo, 14 ServerInfo,
@@ -19,21 +17,15 @@ import {
19 uploadVideo 17 uploadVideo
20} from '../../../../shared/extra-utils' 18} from '../../../../shared/extra-utils'
21import { waitJobs } from '../../../../shared/extra-utils/server/jobs' 19import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
22import { User } from '../../../../shared/models/users'
23import { VideoDetails, VideoPrivacy } from '../../../../shared/models/videos' 20import { VideoDetails, VideoPrivacy } from '../../../../shared/models/videos'
24 21
25const expect = chai.expect 22const expect = chai.expect
26 23
27describe('Test video change ownership - nominal', function () { 24describe('Test video change ownership - nominal', function () {
28 let servers: ServerInfo[] = [] 25 let servers: ServerInfo[] = []
29 const firstUser = { 26
30 username: 'first', 27 const firstUser = 'first'
31 password: 'My great password' 28 const secondUser = 'second'
32 }
33 const secondUser = {
34 username: 'second',
35 password: 'My other password'
36 }
37 29
38 let firstUserToken = '' 30 let firstUserToken = ''
39 let firstUserChannelId: number 31 let firstUserChannelId: number
@@ -65,35 +57,17 @@ describe('Test video change ownership - nominal', function () {
65 } 57 }
66 }) 58 })
67 59
68 const videoQuota = 42000000 60 firstUserToken = await servers[0].usersCommand.generateUserAndToken(firstUser)
69 await createUser({ 61 secondUserToken = await servers[0].usersCommand.generateUserAndToken(secondUser)
70 url: servers[0].url,
71 accessToken: servers[0].accessToken,
72 username: firstUser.username,
73 password: firstUser.password,
74 videoQuota: videoQuota
75 })
76 await createUser({
77 url: servers[0].url,
78 accessToken: servers[0].accessToken,
79 username: secondUser.username,
80 password: secondUser.password,
81 videoQuota: videoQuota
82 })
83
84 firstUserToken = await servers[0].loginCommand.getAccessToken(firstUser)
85 secondUserToken = await servers[0].loginCommand.getAccessToken(secondUser)
86 62
87 { 63 {
88 const res = await getMyUserInformation(servers[0].url, firstUserToken) 64 const { videoChannels } = await servers[0].usersCommand.getMyInfo({ token: firstUserToken })
89 const firstUserInformation: User = res.body 65 firstUserChannelId = videoChannels[0].id
90 firstUserChannelId = firstUserInformation.videoChannels[0].id
91 } 66 }
92 67
93 { 68 {
94 const res = await getMyUserInformation(servers[0].url, secondUserToken) 69 const { videoChannels } = await servers[0].usersCommand.getMyInfo({ token: secondUserToken })
95 const secondUserInformation: User = res.body 70 secondUserChannelId = videoChannels[0].id
96 secondUserChannelId = secondUserInformation.videoChannels[0].id
97 } 71 }
98 72
99 { 73 {
@@ -140,7 +114,7 @@ describe('Test video change ownership - nominal', function () {
140 it('Should send a request to change ownership of a video', async function () { 114 it('Should send a request to change ownership of a video', async function () {
141 this.timeout(15000) 115 this.timeout(15000)
142 116
143 await command.create({ token: firstUserToken, videoId: servers[0].video.id, username: secondUser.username }) 117 await command.create({ token: firstUserToken, videoId: servers[0].video.id, username: secondUser })
144 }) 118 })
145 119
146 it('Should only return a request to change ownership for the second user', async function () { 120 it('Should only return a request to change ownership for the second user', async function () {
@@ -166,7 +140,7 @@ describe('Test video change ownership - nominal', function () {
166 it('Should accept the same change ownership request without crashing', async function () { 140 it('Should accept the same change ownership request without crashing', async function () {
167 this.timeout(10000) 141 this.timeout(10000)
168 142
169 await command.create({ token: firstUserToken, videoId: servers[0].video.id, username: secondUser.username }) 143 await command.create({ token: firstUserToken, videoId: servers[0].video.id, username: secondUser })
170 }) 144 })
171 145
172 it('Should not create multiple change ownership requests while one is waiting', async function () { 146 it('Should not create multiple change ownership requests while one is waiting', async function () {
@@ -194,7 +168,7 @@ describe('Test video change ownership - nominal', function () {
194 it('Should send a new request to change ownership of a video', async function () { 168 it('Should send a new request to change ownership of a video', async function () {
195 this.timeout(15000) 169 this.timeout(15000)
196 170
197 await command.create({ token: firstUserToken, videoId: servers[0].video.id, username: secondUser.username }) 171 await command.create({ token: firstUserToken, videoId: servers[0].video.id, username: secondUser })
198 }) 172 })
199 173
200 it('Should return two requests to change ownership for the second user', async function () { 174 it('Should return two requests to change ownership for the second user', async function () {
@@ -251,7 +225,7 @@ describe('Test video change ownership - nominal', function () {
251 it('Should send a request to change ownership of a live', async function () { 225 it('Should send a request to change ownership of a live', async function () {
252 this.timeout(15000) 226 this.timeout(15000)
253 227
254 await command.create({ token: firstUserToken, videoId: liveId, username: secondUser.username }) 228 await command.create({ token: firstUserToken, videoId: liveId, username: secondUser })
255 229
256 const body = await command.list({ token: secondUserToken }) 230 const body = await command.list({ token: secondUserToken })
257 231
@@ -286,14 +260,9 @@ describe('Test video change ownership - nominal', function () {
286 260
287describe('Test video change ownership - quota too small', function () { 261describe('Test video change ownership - quota too small', function () {
288 let server: ServerInfo 262 let server: ServerInfo
289 const firstUser = { 263 const firstUser = 'first'
290 username: 'first', 264 const secondUser = 'second'
291 password: 'My great password' 265
292 }
293 const secondUser = {
294 username: 'second',
295 password: 'My other password'
296 }
297 let firstUserToken = '' 266 let firstUserToken = ''
298 let secondUserToken = '' 267 let secondUserToken = ''
299 let lastRequestId: number 268 let lastRequestId: number
@@ -305,24 +274,9 @@ describe('Test video change ownership - quota too small', function () {
305 server = await flushAndRunServer(1) 274 server = await flushAndRunServer(1)
306 await setAccessTokensToServers([ server ]) 275 await setAccessTokensToServers([ server ])
307 276
308 const videoQuota = 42000000 277 await server.usersCommand.create({ username: secondUser, videoQuota: 10 })
309 const limitedVideoQuota = 10
310 await createUser({
311 url: server.url,
312 accessToken: server.accessToken,
313 username: firstUser.username,
314 password: firstUser.password,
315 videoQuota: videoQuota
316 })
317 await createUser({
318 url: server.url,
319 accessToken: server.accessToken,
320 username: secondUser.username,
321 password: secondUser.password,
322 videoQuota: limitedVideoQuota
323 })
324 278
325 firstUserToken = await server.loginCommand.getAccessToken(firstUser) 279 firstUserToken = await server.usersCommand.generateUserAndToken(firstUser)
326 secondUserToken = await server.loginCommand.getAccessToken(secondUser) 280 secondUserToken = await server.loginCommand.getAccessToken(secondUser)
327 281
328 // Upload some videos on the server 282 // Upload some videos on the server
@@ -345,7 +299,7 @@ describe('Test video change ownership - quota too small', function () {
345 it('Should send a request to change ownership of a video', async function () { 299 it('Should send a request to change ownership of a video', async function () {
346 this.timeout(15000) 300 this.timeout(15000)
347 301
348 await server.changeOwnershipCommand.create({ token: firstUserToken, videoId: server.video.id, username: secondUser.username }) 302 await server.changeOwnershipCommand.create({ token: firstUserToken, videoId: server.video.id, username: secondUser })
349 }) 303 })
350 304
351 it('Should only return a request to change ownership for the second user', async function () { 305 it('Should only return a request to change ownership for the second user', async function () {
@@ -371,9 +325,8 @@ describe('Test video change ownership - quota too small', function () {
371 it('Should not be possible to accept the change of ownership from second user because of exceeded quota', async function () { 325 it('Should not be possible to accept the change of ownership from second user because of exceeded quota', async function () {
372 this.timeout(10000) 326 this.timeout(10000)
373 327
374 const secondUserInformationResponse = await getMyUserInformation(server.url, secondUserToken) 328 const { videoChannels } = await server.usersCommand.getMyInfo({ token: secondUserToken })
375 const secondUserInformation: User = secondUserInformationResponse.body 329 const channelId = videoChannels[0].id
376 const channelId = secondUserInformation.videoChannels[0].id
377 330
378 await server.changeOwnershipCommand.accept({ 331 await server.changeOwnershipCommand.accept({
379 token: secondUserToken, 332 token: secondUserToken,
diff --git a/server/tests/api/videos/video-channels.ts b/server/tests/api/videos/video-channels.ts
index 83645640c..2e57cbbff 100644
--- a/server/tests/api/videos/video-channels.ts
+++ b/server/tests/api/videos/video-channels.ts
@@ -6,21 +6,22 @@ import { basename } from 'path'
6import { ACTOR_IMAGES_SIZE } from '@server/initializers/constants' 6import { ACTOR_IMAGES_SIZE } from '@server/initializers/constants'
7import { 7import {
8 cleanupTests, 8 cleanupTests,
9 createUser,
10 doubleFollow, 9 doubleFollow,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
12 getVideo, 11 getVideo,
13 getVideoChannelVideos, 12 getVideoChannelVideos,
13 ServerInfo,
14 setAccessTokensToServers,
14 setDefaultVideoChannel, 15 setDefaultVideoChannel,
15 testFileExistsOrNot, 16 testFileExistsOrNot,
16 testImage, 17 testImage,
17 updateVideo, 18 updateVideo,
18 uploadVideo, 19 uploadVideo,
19 wait 20 viewVideo,
20} from '../../../../shared/extra-utils' 21 wait,
21import { getMyUserInformation, ServerInfo, setAccessTokensToServers, viewVideo } from '../../../../shared/extra-utils/index' 22 waitJobs
22import { waitJobs } from '../../../../shared/extra-utils/server/jobs' 23} from '@shared/extra-utils'
23import { User, Video, VideoChannel, VideoDetails } from '../../../../shared/index' 24import { User, Video, VideoChannel, VideoDetails } from '@shared/models'
24 25
25const expect = chai.expect 26const expect = chai.expect
26 27
@@ -85,8 +86,7 @@ describe('Test video channels', function () {
85 }) 86 })
86 87
87 it('Should have two video channels when getting my information', async () => { 88 it('Should have two video channels when getting my information', async () => {
88 const res = await getMyUserInformation(servers[0].url, servers[0].accessToken) 89 userInfo = await servers[0].usersCommand.getMyInfo()
89 userInfo = res.body
90 90
91 expect(userInfo.videoChannels).to.be.an('array') 91 expect(userInfo.videoChannels).to.be.an('array')
92 expect(userInfo.videoChannels).to.have.lengthOf(2) 92 expect(userInfo.videoChannels).to.have.lengthOf(2)
@@ -389,11 +389,11 @@ describe('Test video channels', function () {
389 } 389 }
390 390
391 { 391 {
392 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: 'toto', password: 'password' }) 392 await servers[0].usersCommand.create({ username: 'toto', password: 'password' })
393 const accessToken = await servers[0].loginCommand.getAccessToken({ username: 'toto', password: 'password' }) 393 const accessToken = await servers[0].loginCommand.getAccessToken({ username: 'toto', password: 'password' })
394 394
395 const res = await getMyUserInformation(servers[0].url, accessToken) 395 const { videoChannels } = await servers[0].usersCommand.getMyInfo({ token: accessToken })
396 const videoChannel = res.body.videoChannels[0] 396 const videoChannel = videoChannels[0]
397 expect(videoChannel.name).to.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/) 397 expect(videoChannel.name).to.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/)
398 } 398 }
399 }) 399 })
diff --git a/server/tests/api/videos/video-comments.ts b/server/tests/api/videos/video-comments.ts
index f9bd23646..266824d58 100644
--- a/server/tests/api/videos/video-comments.ts
+++ b/server/tests/api/videos/video-comments.ts
@@ -5,13 +5,11 @@ import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 CommentsCommand, 7 CommentsCommand,
8 createUser,
9 dateIsValid, 8 dateIsValid,
10 flushAndRunServer, 9 flushAndRunServer,
11 ServerInfo, 10 ServerInfo,
12 setAccessTokensToServers, 11 setAccessTokensToServers,
13 testImage, 12 testImage,
14 updateMyAvatar,
15 uploadVideo 13 uploadVideo
16} from '@shared/extra-utils' 14} from '@shared/extra-utils'
17 15
@@ -39,19 +37,9 @@ describe('Test video comments', function () {
39 videoUUID = res.body.video.uuid 37 videoUUID = res.body.video.uuid
40 videoId = res.body.video.id 38 videoId = res.body.video.id
41 39
42 await updateMyAvatar({ 40 await server.usersCommand.updateMyAvatar({ fixture: 'avatar.png' })
43 url: server.url,
44 accessToken: server.accessToken,
45 fixture: 'avatar.png'
46 })
47 41
48 await createUser({ 42 userAccessTokenServer1 = await server.usersCommand.generateUserAndToken('user1')
49 url: server.url,
50 accessToken: server.accessToken,
51 username: 'user1',
52 password: 'password'
53 })
54 userAccessTokenServer1 = await server.loginCommand.getAccessToken('user1', 'password')
55 43
56 command = server.commentsCommand 44 command = server.commentsCommand
57 }) 45 })
diff --git a/server/tests/api/videos/video-imports.ts b/server/tests/api/videos/video-imports.ts
index f6ae8cab1..052c052b4 100644
--- a/server/tests/api/videos/video-imports.ts
+++ b/server/tests/api/videos/video-imports.ts
@@ -7,7 +7,6 @@ import {
7 cleanupTests, 7 cleanupTests,
8 doubleFollow, 8 doubleFollow,
9 flushAndRunMultipleServers, 9 flushAndRunMultipleServers,
10 getMyUserInformation,
11 getMyVideos, 10 getMyVideos,
12 getVideo, 11 getVideo,
13 getVideosList, 12 getVideosList,
@@ -97,13 +96,13 @@ describe('Test video imports', function () {
97 await setAccessTokensToServers(servers) 96 await setAccessTokensToServers(servers)
98 97
99 { 98 {
100 const res = await getMyUserInformation(servers[0].url, servers[0].accessToken) 99 const { videoChannels } = await servers[0].usersCommand.getMyInfo()
101 channelIdServer1 = res.body.videoChannels[0].id 100 channelIdServer1 = videoChannels[0].id
102 } 101 }
103 102
104 { 103 {
105 const res = await getMyUserInformation(servers[1].url, servers[1].accessToken) 104 const { videoChannels } = await servers[1].usersCommand.getMyInfo()
106 channelIdServer2 = res.body.videoChannels[0].id 105 channelIdServer2 = videoChannels[0].id
107 } 106 }
108 107
109 await doubleFollow(servers[0], servers[1]) 108 await doubleFollow(servers[0], servers[1])
diff --git a/server/tests/api/videos/video-nsfw.ts b/server/tests/api/videos/video-nsfw.ts
index a30b11ace..9dc26fca6 100644
--- a/server/tests/api/videos/video-nsfw.ts
+++ b/server/tests/api/videos/video-nsfw.ts
@@ -4,20 +4,17 @@ import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 getAccountVideos, 8 getAccountVideos,
10 getMyUserInformation,
11 getMyVideos, 9 getMyVideos,
12 getVideoChannelVideos, 10 getVideoChannelVideos,
13 getVideosList, 11 getVideosList,
14 getVideosListWithToken, 12 getVideosListWithToken,
15 ServerInfo, 13 ServerInfo,
16 setAccessTokensToServers, 14 setAccessTokensToServers,
17 updateMyUser,
18 uploadVideo 15 uploadVideo
19} from '@shared/extra-utils' 16} from '@shared/extra-utils'
20import { BooleanBothQuery, CustomConfig, ResultList, User, Video, VideosOverview } from '@shared/models' 17import { BooleanBothQuery, CustomConfig, ResultList, Video, VideosOverview } from '@shared/models'
21 18
22const expect = chai.expect 19const expect = chai.expect
23 20
@@ -32,8 +29,7 @@ describe('Test video NSFW policy', function () {
32 let customConfig: CustomConfig 29 let customConfig: CustomConfig
33 30
34 async function getVideosFunctions (token?: string, query: { nsfw?: BooleanBothQuery } = {}) { 31 async function getVideosFunctions (token?: string, query: { nsfw?: BooleanBothQuery } = {}) {
35 const res = await getMyUserInformation(server.url, server.accessToken) 32 const user = await server.usersCommand.getMyInfo()
36 const user: User = res.body
37 const videoChannelName = user.videoChannels[0].name 33 const videoChannelName = user.videoChannels[0].name
38 const accountName = user.account.name + '@' + user.account.host 34 const accountName = user.account.name + '@' + user.account.host
39 const hasQuery = Object.keys(query).length !== 0 35 const hasQuery = Object.keys(query).length !== 0
@@ -148,13 +144,11 @@ describe('Test video NSFW policy', function () {
148 it('Should create a user having the default nsfw policy', async function () { 144 it('Should create a user having the default nsfw policy', async function () {
149 const username = 'user1' 145 const username = 'user1'
150 const password = 'my super password' 146 const password = 'my super password'
151 await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password }) 147 await server.usersCommand.create({ username: username, password: password })
152 148
153 userAccessToken = await server.loginCommand.getAccessToken({ username, password }) 149 userAccessToken = await server.loginCommand.getAccessToken({ username, password })
154 150
155 const res = await getMyUserInformation(server.url, userAccessToken) 151 const user = await server.usersCommand.getMyInfo({ token: userAccessToken })
156 const user = res.body
157
158 expect(user.nsfwPolicy).to.equal('blur') 152 expect(user.nsfwPolicy).to.equal('blur')
159 }) 153 })
160 154
@@ -173,11 +167,7 @@ describe('Test video NSFW policy', function () {
173 }) 167 })
174 168
175 it('Should display NSFW videos with display user NSFW policy', async function () { 169 it('Should display NSFW videos with display user NSFW policy', async function () {
176 await updateMyUser({ 170 await server.usersCommand.updateMe({ nsfwPolicy: 'display' })
177 url: server.url,
178 accessToken: server.accessToken,
179 nsfwPolicy: 'display'
180 })
181 171
182 for (const body of await getVideosFunctions(server.accessToken)) { 172 for (const body of await getVideosFunctions(server.accessToken)) {
183 expect(body.total).to.equal(2) 173 expect(body.total).to.equal(2)
@@ -190,11 +180,7 @@ describe('Test video NSFW policy', function () {
190 }) 180 })
191 181
192 it('Should not display NSFW videos with do_not_list user NSFW policy', async function () { 182 it('Should not display NSFW videos with do_not_list user NSFW policy', async function () {
193 await updateMyUser({ 183 await server.usersCommand.updateMe({ nsfwPolicy: 'do_not_list' })
194 url: server.url,
195 accessToken: server.accessToken,
196 nsfwPolicy: 'do_not_list'
197 })
198 184
199 for (const body of await getVideosFunctions(server.accessToken)) { 185 for (const body of await getVideosFunctions(server.accessToken)) {
200 expect(body.total).to.equal(1) 186 expect(body.total).to.equal(1)
diff --git a/server/tests/api/videos/video-playlists.ts b/server/tests/api/videos/video-playlists.ts
index 38133e2ce..e57d86c14 100644
--- a/server/tests/api/videos/video-playlists.ts
+++ b/server/tests/api/videos/video-playlists.ts
@@ -6,13 +6,9 @@ import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 checkPlaylistFilesWereRemoved, 7 checkPlaylistFilesWereRemoved,
8 cleanupTests, 8 cleanupTests,
9 createUser,
10 doubleFollow, 9 doubleFollow,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
12 generateUserAccessToken,
13 getMyUserInformation,
14 PlaylistsCommand, 11 PlaylistsCommand,
15 removeUser,
16 ServerInfo, 12 ServerInfo,
17 setAccessTokensToServers, 13 setAccessTokensToServers,
18 setDefaultVideoChannel, 14 setDefaultVideoChannel,
@@ -24,7 +20,6 @@ import {
24 waitJobs 20 waitJobs
25} from '@shared/extra-utils' 21} from '@shared/extra-utils'
26import { 22import {
27 User,
28 VideoPlaylist, 23 VideoPlaylist,
29 VideoPlaylistCreateResult, 24 VideoPlaylistCreateResult,
30 VideoPlaylistElementType, 25 VideoPlaylistElementType,
@@ -113,15 +108,7 @@ describe('Test video playlists', function () {
113 108
114 nsfwVideoServer1 = (await uploadVideoAndGetId({ server: servers[0], videoName: 'NSFW video', nsfw: true })).id 109 nsfwVideoServer1 = (await uploadVideoAndGetId({ server: servers[0], videoName: 'NSFW video', nsfw: true })).id
115 110
116 { 111 userTokenServer1 = await servers[0].usersCommand.generateUserAndToken('user1')
117 await createUser({
118 url: servers[0].url,
119 accessToken: servers[0].accessToken,
120 username: 'user1',
121 password: 'password'
122 })
123 userTokenServer1 = await servers[0].loginCommand.getAccessToken('user1', 'password')
124 }
125 112
126 await waitJobs(servers) 113 await waitJobs(servers)
127 }) 114 })
@@ -165,7 +152,7 @@ describe('Test video playlists', function () {
165 }) 152 })
166 153
167 it('Should get private playlist for a classic user', async function () { 154 it('Should get private playlist for a classic user', async function () {
168 const token = await generateUserAccessToken(servers[0], 'toto') 155 const token = await servers[0].usersCommand.generateUserAndToken('toto')
169 156
170 const body = await commands[0].listByAccount({ token, handle: 'toto' }) 157 const body = await commands[0].listByAccount({ token, handle: 'toto' })
171 158
@@ -1118,19 +1105,10 @@ describe('Test video playlists', function () {
1118 it('Should delete an account and delete its playlists', async function () { 1105 it('Should delete an account and delete its playlists', async function () {
1119 this.timeout(30000) 1106 this.timeout(30000)
1120 1107
1121 const user = { username: 'user_1', password: 'password' } 1108 const { userId, token } = await servers[0].usersCommand.generate('user_1')
1122 const res = await createUser({
1123 url: servers[0].url,
1124 accessToken: servers[0].accessToken,
1125 username: user.username,
1126 password: user.password
1127 })
1128
1129 const userId = res.body.user.id
1130 const userAccessToken = await servers[0].loginCommand.getAccessToken(user)
1131 1109
1132 const resChannel = await getMyUserInformation(servers[0].url, userAccessToken) 1110 const { videoChannels } = await servers[0].usersCommand.getMyInfo({ token })
1133 const userChannel = (resChannel.body as User).videoChannels[0] 1111 const userChannel = videoChannels[0]
1134 1112
1135 await commands[0].create({ 1113 await commands[0].create({
1136 attributes: { 1114 attributes: {
@@ -1152,7 +1130,7 @@ describe('Test video playlists', function () {
1152 } 1130 }
1153 } 1131 }
1154 1132
1155 await removeUser(servers[0].url, userId, servers[0].accessToken) 1133 await servers[0].usersCommand.remove({ userId })
1156 await waitJobs(servers) 1134 await waitJobs(servers)
1157 1135
1158 { 1136 {
diff --git a/server/tests/api/videos/video-privacy.ts b/server/tests/api/videos/video-privacy.ts
index f831dd8a9..4e349e350 100644
--- a/server/tests/api/videos/video-privacy.ts
+++ b/server/tests/api/videos/video-privacy.ts
@@ -5,7 +5,6 @@ import * as chai from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 doubleFollow, 8 doubleFollow,
10 flushAndRunServer, 9 flushAndRunServer,
11 getMyVideos, 10 getMyVideos,
@@ -125,7 +124,7 @@ describe('Test video privacy', function () {
125 username: 'hello', 124 username: 'hello',
126 password: 'super password' 125 password: 'super password'
127 } 126 }
128 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) 127 await servers[0].usersCommand.create({ username: user.username, password: user.password })
129 128
130 anotherUserToken = await servers[0].loginCommand.getAccessToken(user) 129 anotherUserToken = await servers[0].loginCommand.getAccessToken(user)
131 await getVideoWithToken(servers[0].url, anotherUserToken, privateVideoUUID, HttpStatusCode.FORBIDDEN_403) 130 await getVideoWithToken(servers[0].url, anotherUserToken, privateVideoUUID, HttpStatusCode.FORBIDDEN_403)
diff --git a/server/tests/api/videos/videos-filter.ts b/server/tests/api/videos/videos-filter.ts
index 519dad646..4aa00cfc4 100644
--- a/server/tests/api/videos/videos-filter.ts
+++ b/server/tests/api/videos/videos-filter.ts
@@ -5,7 +5,6 @@ import * as chai from 'chai'
5import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' 5import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
6import { 6import {
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 doubleFollow, 8 doubleFollow,
10 flushAndRunMultipleServers, 9 flushAndRunMultipleServers,
11 makeGetRequest, 10 makeGetRequest,
@@ -60,17 +59,7 @@ describe('Test videos filter', function () {
60 59
61 for (const server of servers) { 60 for (const server of servers) {
62 const moderator = { username: 'moderator', password: 'my super password' } 61 const moderator = { username: 'moderator', password: 'my super password' }
63 await createUser( 62 await server.usersCommand.create({ username: moderator.username, password: moderator.password, role: UserRole.MODERATOR })
64 {
65 url: server.url,
66 accessToken: server.accessToken,
67 username: moderator.username,
68 password: moderator.password,
69 videoQuota: undefined,
70 videoQuotaDaily: undefined,
71 role: UserRole.MODERATOR
72 }
73 )
74 server['moderatorAccessToken'] = await server.loginCommand.getAccessToken(moderator) 63 server['moderatorAccessToken'] = await server.loginCommand.getAccessToken(moderator)
75 64
76 await uploadVideo(server.url, server.accessToken, { name: 'public ' + server.serverNumber }) 65 await uploadVideo(server.url, server.accessToken, { name: 'public ' + server.serverNumber })
diff --git a/server/tests/api/videos/videos-history.ts b/server/tests/api/videos/videos-history.ts
index 256271bd0..aa0623f7d 100644
--- a/server/tests/api/videos/videos-history.ts
+++ b/server/tests/api/videos/videos-history.ts
@@ -5,7 +5,6 @@ import * as chai from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 flushAndRunServer, 8 flushAndRunServer,
10 getVideosListWithToken, 9 getVideosListWithToken,
11 getVideoWithToken, 10 getVideoWithToken,
@@ -14,7 +13,6 @@ import {
14 reRunServer, 13 reRunServer,
15 ServerInfo, 14 ServerInfo,
16 setAccessTokensToServers, 15 setAccessTokensToServers,
17 updateMyUser,
18 uploadVideo, 16 uploadVideo,
19 wait 17 wait
20} from '@shared/extra-utils' 18} from '@shared/extra-utils'
@@ -59,7 +57,7 @@ describe('Test videos history', function () {
59 username: 'user_1', 57 username: 'user_1',
60 password: 'super password' 58 password: 'super password'
61 } 59 }
62 await createUser({ url: server.url, accessToken: server.accessToken, username: user.username, password: user.password }) 60 await server.usersCommand.create({ username: user.username, password: user.password })
63 userAccessToken = await server.loginCommand.getAccessToken(user) 61 userAccessToken = await server.loginCommand.getAccessToken(user)
64 }) 62 })
65 63
@@ -174,9 +172,7 @@ describe('Test videos history', function () {
174 }) 172 })
175 173
176 it('Should disable videos history', async function () { 174 it('Should disable videos history', async function () {
177 await updateMyUser({ 175 await server.usersCommand.updateMe({
178 url: server.url,
179 accessToken: server.accessToken,
180 videosHistoryEnabled: false 176 videosHistoryEnabled: false
181 }) 177 })
182 178
@@ -184,9 +180,7 @@ describe('Test videos history', function () {
184 }) 180 })
185 181
186 it('Should re-enable videos history', async function () { 182 it('Should re-enable videos history', async function () {
187 await updateMyUser({ 183 await server.usersCommand.updateMe({
188 url: server.url,
189 accessToken: server.accessToken,
190 videosHistoryEnabled: true 184 videosHistoryEnabled: true
191 }) 185 })
192 186
diff --git a/server/tests/api/videos/videos-overview.ts b/server/tests/api/videos/videos-overview.ts
index ccbc6f4a4..a2da2eaef 100644
--- a/server/tests/api/videos/videos-overview.ts
+++ b/server/tests/api/videos/videos-overview.ts
@@ -2,15 +2,7 @@
2 2
3import 'mocha' 3import 'mocha'
4import * as chai from 'chai' 4import * as chai from 'chai'
5import { 5import { cleanupTests, flushAndRunServer, ServerInfo, setAccessTokensToServers, uploadVideo, wait } from '@shared/extra-utils'
6 cleanupTests,
7 flushAndRunServer,
8 generateUserAccessToken,
9 ServerInfo,
10 setAccessTokensToServers,
11 uploadVideo,
12 wait
13} from '@shared/extra-utils'
14import { VideosOverview } from '@shared/models' 6import { VideosOverview } from '@shared/models'
15 7
16const expect = chai.expect 8const expect = chai.expect
@@ -112,7 +104,7 @@ describe('Test a videos overview', function () {
112 }) 104 })
113 105
114 it('Should hide muted accounts', async function () { 106 it('Should hide muted accounts', async function () {
115 const token = await generateUserAccessToken(server, 'choco') 107 const token = await server.usersCommand.generateUserAndToken('choco')
116 108
117 await server.blocklistCommand.addToMyBlocklist({ token, account: 'root@' + server.host }) 109 await server.blocklistCommand.addToMyBlocklist({ token, account: 'root@' + server.host })
118 110
diff --git a/server/tests/cli/peertube.ts b/server/tests/cli/peertube.ts
index e055b4684..a0c149ac0 100644
--- a/server/tests/cli/peertube.ts
+++ b/server/tests/cli/peertube.ts
@@ -8,11 +8,9 @@ import {
8 buildAbsoluteFixturePath, 8 buildAbsoluteFixturePath,
9 cleanupTests, 9 cleanupTests,
10 CLICommand, 10 CLICommand,
11 createUser,
12 doubleFollow, 11 doubleFollow,
13 flushAndRunServer, 12 flushAndRunServer,
14 getLocalIdByUUID, 13 getLocalIdByUUID,
15 getMyUserInformation,
16 getVideo, 14 getVideo,
17 getVideosList, 15 getVideosList,
18 ImportsCommand, 16 ImportsCommand,
@@ -38,7 +36,7 @@ describe('Test CLI wrapper', function () {
38 server = await flushAndRunServer(1) 36 server = await flushAndRunServer(1)
39 await setAccessTokensToServers([ server ]) 37 await setAccessTokensToServers([ server ])
40 38
41 await createUser({ url: server.url, accessToken: server.accessToken, username: 'user_1', password: 'super_password' }) 39 await server.usersCommand.create({ username: 'user_1', password: 'super_password' })
42 40
43 userAccessToken = await server.loginCommand.getAccessToken({ username: 'user_1', password: 'super_password' }) 41 userAccessToken = await server.loginCommand.getAccessToken({ username: 'user_1', password: 'super_password' })
44 42
@@ -56,8 +54,8 @@ describe('Test CLI wrapper', function () {
56 const stdout = await cliCommand.execWithEnv(`${cmd} token --url ${server.url} --username user_1 --password super_password`) 54 const stdout = await cliCommand.execWithEnv(`${cmd} token --url ${server.url} --username user_1 --password super_password`)
57 const token = stdout.trim() 55 const token = stdout.trim()
58 56
59 const res = await getMyUserInformation(server.url, token) 57 const body = await server.usersCommand.getMyInfo({ token })
60 expect(res.body.username).to.equal('user_1') 58 expect(body.username).to.equal('user_1')
61 }) 59 })
62 60
63 it('Should display no selected instance', async function () { 61 it('Should display no selected instance', async function () {
diff --git a/server/tests/cli/prune-storage.ts b/server/tests/cli/prune-storage.ts
index 68a59a41d..b45049964 100644
--- a/server/tests/cli/prune-storage.ts
+++ b/server/tests/cli/prune-storage.ts
@@ -16,7 +16,6 @@ import {
16 ServerInfo, 16 ServerInfo,
17 setAccessTokensToServers, 17 setAccessTokensToServers,
18 setDefaultVideoChannel, 18 setDefaultVideoChannel,
19 updateMyAvatar,
20 uploadVideo, 19 uploadVideo,
21 wait, 20 wait,
22 waitJobs 21 waitJobs
@@ -73,7 +72,7 @@ describe('Test prune storage scripts', function () {
73 await uploadVideo(server.url, server.accessToken, { name: 'video 1' }) 72 await uploadVideo(server.url, server.accessToken, { name: 'video 1' })
74 await uploadVideo(server.url, server.accessToken, { name: 'video 2' }) 73 await uploadVideo(server.url, server.accessToken, { name: 'video 2' })
75 74
76 await updateMyAvatar({ url: server.url, accessToken: server.accessToken, fixture: 'avatar.png' }) 75 await server.usersCommand.updateMyAvatar({ fixture: 'avatar.png' })
77 76
78 await server.playlistsCommand.create({ 77 await server.playlistsCommand.create({
79 attributes: { 78 attributes: {
diff --git a/server/tests/cli/reset-password.ts b/server/tests/cli/reset-password.ts
index a5f958bf7..5e1e1c2af 100644
--- a/server/tests/cli/reset-password.ts
+++ b/server/tests/cli/reset-password.ts
@@ -1,5 +1,5 @@
1import 'mocha' 1import 'mocha'
2import { cleanupTests, CLICommand, createUser, flushAndRunServer, ServerInfo, setAccessTokensToServers } from '../../../shared/extra-utils' 2import { cleanupTests, CLICommand, flushAndRunServer, ServerInfo, setAccessTokensToServers } from '../../../shared/extra-utils'
3 3
4describe('Test reset password scripts', function () { 4describe('Test reset password scripts', function () {
5 let server: ServerInfo 5 let server: ServerInfo
@@ -9,7 +9,7 @@ describe('Test reset password scripts', function () {
9 server = await flushAndRunServer(1) 9 server = await flushAndRunServer(1)
10 await setAccessTokensToServers([ server ]) 10 await setAccessTokensToServers([ server ])
11 11
12 await createUser({ url: server.url, accessToken: server.accessToken, username: 'user_1', password: 'super password' }) 12 await server.usersCommand.create({ username: 'user_1', password: 'super password' })
13 }) 13 })
14 14
15 it('Should change the user password from CLI', async function () { 15 it('Should change the user password from CLI', async function () {
diff --git a/server/tests/cli/update-host.ts b/server/tests/cli/update-host.ts
index e986a04f2..b857fcf28 100644
--- a/server/tests/cli/update-host.ts
+++ b/server/tests/cli/update-host.ts
@@ -4,7 +4,6 @@ import 'mocha'
4import { expect } from 'chai' 4import { expect } from 'chai'
5import { 5import {
6 cleanupTests, 6 cleanupTests,
7 createUser,
8 flushAndRunServer, 7 flushAndRunServer,
9 getVideo, 8 getVideo,
10 getVideosList, 9 getVideosList,
@@ -41,7 +40,7 @@ describe('Test update host scripts', function () {
41 await uploadVideo(server.url, server.accessToken, videoAttributes) 40 await uploadVideo(server.url, server.accessToken, videoAttributes)
42 41
43 // Create a user 42 // Create a user
44 await createUser({ url: server.url, accessToken: server.accessToken, username: 'toto', password: 'coucou' }) 43 await server.usersCommand.create({ username: 'toto', password: 'coucou' })
45 44
46 // Create channel 45 // Create channel
47 const videoChannel = { 46 const videoChannel = {
diff --git a/server/tests/client.ts b/server/tests/client.ts
index 1bdb2eb64..96403da37 100644
--- a/server/tests/client.ts
+++ b/server/tests/client.ts
@@ -15,7 +15,6 @@ import {
15 ServerInfo, 15 ServerInfo,
16 setAccessTokensToServers, 16 setAccessTokensToServers,
17 setDefaultVideoChannel, 17 setDefaultVideoChannel,
18 updateMyUser,
19 uploadVideo, 18 uploadVideo,
20 waitJobs 19 waitJobs
21} from '../../shared/extra-utils' 20} from '../../shared/extra-utils'
@@ -96,7 +95,7 @@ describe('Test a client controllers', function () {
96 95
97 // Account 96 // Account
98 97
99 await updateMyUser({ url: servers[0].url, accessToken: servers[0].accessToken, description: 'my account description' }) 98 await servers[0].usersCommand.updateMe({ description: 'my account description' })
100 99
101 account = await servers[0].accountsCommand.get({ accountName: `${servers[0].user.username}@${servers[0].host}` }) 100 account = await servers[0].accountsCommand.get({ accountName: `${servers[0].user.username}@${servers[0].host}` })
102 101
diff --git a/server/tests/external-plugins/auth-ldap.ts b/server/tests/external-plugins/auth-ldap.ts
index 8153e2b81..d99b3badc 100644
--- a/server/tests/external-plugins/auth-ldap.ts
+++ b/server/tests/external-plugins/auth-ldap.ts
@@ -3,9 +3,7 @@
3import 'mocha' 3import 'mocha'
4import { expect } from 'chai' 4import { expect } from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { User } from '@shared/models/users/user.model' 6import { cleanupTests, flushAndRunServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '@shared/extra-utils'
7import { blockUser, getMyUserInformation, setAccessTokensToServers, unblockUser, uploadVideo } from '../../../shared/extra-utils'
8import { cleanupTests, flushAndRunServer, ServerInfo } from '../../../shared/extra-utils/server/servers'
9 7
10describe('Official plugin auth-ldap', function () { 8describe('Official plugin auth-ldap', function () {
11 let server: ServerInfo 9 let server: ServerInfo
@@ -71,9 +69,7 @@ describe('Official plugin auth-ldap', function () {
71 }) 69 })
72 70
73 it('Should login get my profile', async function () { 71 it('Should login get my profile', async function () {
74 const res = await getMyUserInformation(server.url, accessToken) 72 const body = await server.usersCommand.getMyInfo({ token: accessToken })
75 const body: User = res.body
76
77 expect(body.username).to.equal('fry') 73 expect(body.username).to.equal('fry')
78 expect(body.email).to.equal('fry@planetexpress.com') 74 expect(body.email).to.equal('fry@planetexpress.com')
79 75
@@ -85,7 +81,7 @@ describe('Official plugin auth-ldap', function () {
85 }) 81 })
86 82
87 it('Should not be able to login if the user is banned', async function () { 83 it('Should not be able to login if the user is banned', async function () {
88 await blockUser(server.url, userId, server.accessToken) 84 await server.usersCommand.banUser({ userId })
89 85
90 await server.loginCommand.login({ 86 await server.loginCommand.login({
91 user: { username: 'fry@planetexpress.com', password: 'fry' }, 87 user: { username: 'fry@planetexpress.com', password: 'fry' },
@@ -94,7 +90,7 @@ describe('Official plugin auth-ldap', function () {
94 }) 90 })
95 91
96 it('Should be able to login if the user is unbanned', async function () { 92 it('Should be able to login if the user is unbanned', async function () {
97 await unblockUser(server.url, userId, server.accessToken) 93 await server.usersCommand.unbanUser({ userId })
98 94
99 await server.loginCommand.login({ user: { username: 'fry@planetexpress.com', password: 'fry' } }) 95 await server.loginCommand.login({ user: { username: 'fry@planetexpress.com', password: 'fry' } })
100 }) 96 })
diff --git a/server/tests/feeds/feeds.ts b/server/tests/feeds/feeds.ts
index 9c78ae0e8..18ce8f7c5 100644
--- a/server/tests/feeds/feeds.ts
+++ b/server/tests/feeds/feeds.ts
@@ -6,21 +6,16 @@ import * as xmlParser from 'fast-xml-parser'
6import { HttpStatusCode } from '@shared/core-utils' 6import { HttpStatusCode } from '@shared/core-utils'
7import { 7import {
8 cleanupTests, 8 cleanupTests,
9 createUser,
10 doubleFollow, 9 doubleFollow,
11 flushAndRunMultipleServers, 10 flushAndRunMultipleServers,
12 flushAndRunServer, 11 flushAndRunServer,
13 getMyUserInformation,
14 getUserScopedTokens,
15 renewUserScopedTokens,
16 ServerInfo, 12 ServerInfo,
17 setAccessTokensToServers, 13 setAccessTokensToServers,
18 uploadVideo, 14 uploadVideo,
19 uploadVideoAndGetId, 15 uploadVideoAndGetId,
20 waitJobs 16 waitJobs
21} from '@shared/extra-utils' 17} from '@shared/extra-utils'
22import { User, VideoPrivacy } from '@shared/models' 18import { VideoPrivacy } from '@shared/models'
23import { ScopedToken } from '@shared/models/users/user-scoped-token'
24 19
25chai.use(require('chai-xml')) 20chai.use(require('chai-xml'))
26chai.use(require('chai-json-schema')) 21chai.use(require('chai-json-schema'))
@@ -54,24 +49,21 @@ describe('Test syndication feeds', () => {
54 await doubleFollow(servers[0], servers[1]) 49 await doubleFollow(servers[0], servers[1])
55 50
56 { 51 {
57 const res = await getMyUserInformation(servers[0].url, servers[0].accessToken) 52 const user = await servers[0].usersCommand.getMyInfo()
58 const user: User = res.body
59 rootAccountId = user.account.id 53 rootAccountId = user.account.id
60 rootChannelId = user.videoChannels[0].id 54 rootChannelId = user.videoChannels[0].id
61 } 55 }
62 56
63 { 57 {
64 const attr = { username: 'john', password: 'password' } 58 const attr = { username: 'john', password: 'password' }
65 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: attr.username, password: attr.password }) 59 await servers[0].usersCommand.create({ username: attr.username, password: attr.password })
66 userAccessToken = await servers[0].loginCommand.getAccessToken(attr) 60 userAccessToken = await servers[0].loginCommand.getAccessToken(attr)
67 61
68 const res = await getMyUserInformation(servers[0].url, userAccessToken) 62 const user = await servers[0].usersCommand.getMyInfo({ token: userAccessToken })
69 const user: User = res.body
70 userAccountId = user.account.id 63 userAccountId = user.account.id
71 userChannelId = user.videoChannels[0].id 64 userChannelId = user.videoChannels[0].id
72 65
73 const res2 = await getUserScopedTokens(servers[0].url, userAccessToken) 66 const token = await servers[0].usersCommand.getMyScopedTokens({ token: userAccessToken })
74 const token: ScopedToken = res2.body
75 userFeedToken = token.feedToken 67 userFeedToken = token.feedToken
76 } 68 }
77 69
@@ -299,18 +291,16 @@ describe('Test syndication feeds', () => {
299 291
300 it('Should list no videos for a user with no videos and no subscriptions', async function () { 292 it('Should list no videos for a user with no videos and no subscriptions', async function () {
301 const attr = { username: 'feeduser', password: 'password' } 293 const attr = { username: 'feeduser', password: 'password' }
302 await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: attr.username, password: attr.password }) 294 await servers[0].usersCommand.create({ username: attr.username, password: attr.password })
303 const feeduserAccessToken = await servers[0].loginCommand.getAccessToken(attr) 295 const feeduserAccessToken = await servers[0].loginCommand.getAccessToken(attr)
304 296
305 { 297 {
306 const res = await getMyUserInformation(servers[0].url, feeduserAccessToken) 298 const user = await servers[0].usersCommand.getMyInfo({ token: feeduserAccessToken })
307 const user: User = res.body
308 feeduserAccountId = user.account.id 299 feeduserAccountId = user.account.id
309 } 300 }
310 301
311 { 302 {
312 const res = await getUserScopedTokens(servers[0].url, feeduserAccessToken) 303 const token = await servers[0].usersCommand.getMyScopedTokens({ token: feeduserAccessToken })
313 const token: ScopedToken = res.body
314 feeduserFeedToken = token.feedToken 304 feeduserFeedToken = token.feedToken
315 } 305 }
316 306
@@ -381,15 +371,14 @@ describe('Test syndication feeds', () => {
381 }) 371 })
382 372
383 it('Should renew the token, and so have an invalid old token', async function () { 373 it('Should renew the token, and so have an invalid old token', async function () {
384 await renewUserScopedTokens(servers[0].url, userAccessToken) 374 await servers[0].usersCommand.renewMyScopedTokens({ token: userAccessToken })
385 375
386 const query = { accountId: userAccountId, token: userFeedToken, version: 3 } 376 const query = { accountId: userAccountId, token: userFeedToken, version: 3 }
387 await servers[0].feedCommand.getJSON({ feed: 'subscriptions', query, expectedStatus: HttpStatusCode.FORBIDDEN_403 }) 377 await servers[0].feedCommand.getJSON({ feed: 'subscriptions', query, expectedStatus: HttpStatusCode.FORBIDDEN_403 })
388 }) 378 })
389 379
390 it('Should succeed with the new token', async function () { 380 it('Should succeed with the new token', async function () {
391 const res2 = await getUserScopedTokens(servers[0].url, userAccessToken) 381 const token = await servers[0].usersCommand.getMyScopedTokens({ token: userAccessToken })
392 const token: ScopedToken = res2.body
393 userFeedToken = token.feedToken 382 userFeedToken = token.feedToken
394 383
395 const query = { accountId: userAccountId, token: userFeedToken, version: 4 } 384 const query = { accountId: userAccountId, token: userFeedToken, version: 4 }
diff --git a/server/tests/misc-endpoints.ts b/server/tests/misc-endpoints.ts
index 4b7b2163d..84bdcaabf 100644
--- a/server/tests/misc-endpoints.ts
+++ b/server/tests/misc-endpoints.ts
@@ -5,7 +5,6 @@ import * as chai from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 flushAndRunServer, 8 flushAndRunServer,
10 makeGetRequest, 9 makeGetRequest,
11 ServerInfo, 10 ServerInfo,
@@ -173,8 +172,8 @@ describe('Test misc endpoints', function () {
173 await server.channelsCommand.create({ attributes: { name: 'channel1', displayName: 'channel 1' } }) 172 await server.channelsCommand.create({ attributes: { name: 'channel1', displayName: 'channel 1' } })
174 await server.channelsCommand.create({ attributes: { name: 'channel2', displayName: 'channel 2' } }) 173 await server.channelsCommand.create({ attributes: { name: 'channel2', displayName: 'channel 2' } })
175 174
176 await createUser({ url: server.url, accessToken: server.accessToken, username: 'user1', password: 'password' }) 175 await server.usersCommand.create({ username: 'user1', password: 'password' })
177 await createUser({ url: server.url, accessToken: server.accessToken, username: 'user2', password: 'password' }) 176 await server.usersCommand.create({ username: 'user2', password: 'password' })
178 177
179 const res = await makeGetRequest({ 178 const res = await makeGetRequest({
180 url: server.url, 179 url: server.url,
diff --git a/server/tests/plugins/action-hooks.ts b/server/tests/plugins/action-hooks.ts
index 84f4e8501..b156f6b60 100644
--- a/server/tests/plugins/action-hooks.ts
+++ b/server/tests/plugins/action-hooks.ts
@@ -1,28 +1,20 @@
1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2 2
3import 'mocha' 3import 'mocha'
4import { ServerHookName, VideoPlaylistPrivacy, VideoPrivacy } from '@shared/models'
5import { 4import {
6 blockUser, 5 cleanupTests,
7 createUser, 6 flushAndRunMultipleServers,
7 killallServers,
8 PluginsCommand, 8 PluginsCommand,
9 registerUser, 9 reRunServer,
10 removeUser, 10 ServerInfo,
11 setAccessTokensToServers, 11 setAccessTokensToServers,
12 setDefaultVideoChannel, 12 setDefaultVideoChannel,
13 unblockUser,
14 updateUser,
15 updateVideo, 13 updateVideo,
16 uploadVideo, 14 uploadVideo,
17 viewVideo 15 viewVideo
18} from '../../../shared/extra-utils' 16} from '@shared/extra-utils'
19import { 17import { ServerHookName, VideoPlaylistPrivacy, VideoPrivacy } from '@shared/models'
20 cleanupTests,
21 flushAndRunMultipleServers,
22 killallServers,
23 reRunServer,
24 ServerInfo
25} from '../../../shared/extra-utils/server/servers'
26 18
27describe('Test plugin action hooks', function () { 19describe('Test plugin action hooks', function () {
28 let servers: ServerInfo[] 20 let servers: ServerInfo[]
@@ -119,19 +111,14 @@ describe('Test plugin action hooks', function () {
119 let userId: number 111 let userId: number
120 112
121 it('Should run action:api.user.registered', async function () { 113 it('Should run action:api.user.registered', async function () {
122 await registerUser(servers[0].url, 'registered_user', 'super_password') 114 await servers[0].usersCommand.register({ username: 'registered_user' })
123 115
124 await checkHook('action:api.user.registered') 116 await checkHook('action:api.user.registered')
125 }) 117 })
126 118
127 it('Should run action:api.user.created', async function () { 119 it('Should run action:api.user.created', async function () {
128 const res = await createUser({ 120 const user = await servers[0].usersCommand.create({ username: 'created_user' })
129 url: servers[0].url, 121 userId = user.id
130 accessToken: servers[0].accessToken,
131 username: 'created_user',
132 password: 'super_password'
133 })
134 userId = res.body.user.id
135 122
136 await checkHook('action:api.user.created') 123 await checkHook('action:api.user.created')
137 }) 124 })
@@ -143,25 +130,25 @@ describe('Test plugin action hooks', function () {
143 }) 130 })
144 131
145 it('Should run action:api.user.blocked', async function () { 132 it('Should run action:api.user.blocked', async function () {
146 await blockUser(servers[0].url, userId, servers[0].accessToken) 133 await servers[0].usersCommand.banUser({ userId })
147 134
148 await checkHook('action:api.user.blocked') 135 await checkHook('action:api.user.blocked')
149 }) 136 })
150 137
151 it('Should run action:api.user.unblocked', async function () { 138 it('Should run action:api.user.unblocked', async function () {
152 await unblockUser(servers[0].url, userId, servers[0].accessToken) 139 await servers[0].usersCommand.unbanUser({ userId })
153 140
154 await checkHook('action:api.user.unblocked') 141 await checkHook('action:api.user.unblocked')
155 }) 142 })
156 143
157 it('Should run action:api.user.updated', async function () { 144 it('Should run action:api.user.updated', async function () {
158 await updateUser({ url: servers[0].url, accessToken: servers[0].accessToken, userId, videoQuota: 50 }) 145 await servers[0].usersCommand.update({ userId, videoQuota: 50 })
159 146
160 await checkHook('action:api.user.updated') 147 await checkHook('action:api.user.updated')
161 }) 148 })
162 149
163 it('Should run action:api.user.deleted', async function () { 150 it('Should run action:api.user.deleted', async function () {
164 await removeUser(servers[0].url, userId, servers[0].accessToken) 151 await servers[0].usersCommand.remove({ userId })
165 152
166 await checkHook('action:api.user.deleted') 153 await checkHook('action:api.user.deleted')
167 }) 154 })
diff --git a/server/tests/plugins/external-auth.ts b/server/tests/plugins/external-auth.ts
index e421fd224..3e8305611 100644
--- a/server/tests/plugins/external-auth.ts
+++ b/server/tests/plugins/external-auth.ts
@@ -5,17 +5,14 @@ import { expect } from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import {
7 cleanupTests, 7 cleanupTests,
8 createUser,
9 decodeQueryString, 8 decodeQueryString,
10 flushAndRunServer, 9 flushAndRunServer,
11 getMyUserInformation,
12 PluginsCommand, 10 PluginsCommand,
13 ServerInfo, 11 ServerInfo,
14 setAccessTokensToServers, 12 setAccessTokensToServers,
15 updateMyUser,
16 wait 13 wait
17} from '@shared/extra-utils' 14} from '@shared/extra-utils'
18import { User, UserRole } from '@shared/models' 15import { UserRole } from '@shared/models'
19 16
20async function loginExternal (options: { 17async function loginExternal (options: {
21 server: ServerInfo 18 server: ServerInfo
@@ -149,9 +146,7 @@ describe('Test external auth plugins', function () {
149 } 146 }
150 147
151 { 148 {
152 const res = await getMyUserInformation(server.url, cyanAccessToken) 149 const body = await server.usersCommand.getMyInfo({ token: cyanAccessToken })
153
154 const body: User = res.body
155 expect(body.username).to.equal('cyan') 150 expect(body.username).to.equal('cyan')
156 expect(body.account.displayName).to.equal('cyan') 151 expect(body.account.displayName).to.equal('cyan')
157 expect(body.email).to.equal('cyan@example.com') 152 expect(body.email).to.equal('cyan@example.com')
@@ -173,9 +168,7 @@ describe('Test external auth plugins', function () {
173 } 168 }
174 169
175 { 170 {
176 const res = await getMyUserInformation(server.url, kefkaAccessToken) 171 const body = await server.usersCommand.getMyInfo({ token: kefkaAccessToken })
177
178 const body: User = res.body
179 expect(body.username).to.equal('kefka') 172 expect(body.username).to.equal('kefka')
180 expect(body.account.displayName).to.equal('Kefka Palazzo') 173 expect(body.account.displayName).to.equal('Kefka Palazzo')
181 expect(body.email).to.equal('kefka@example.com') 174 expect(body.email).to.equal('kefka@example.com')
@@ -189,9 +182,8 @@ describe('Test external auth plugins', function () {
189 cyanAccessToken = resRefresh.body.access_token 182 cyanAccessToken = resRefresh.body.access_token
190 cyanRefreshToken = resRefresh.body.refresh_token 183 cyanRefreshToken = resRefresh.body.refresh_token
191 184
192 const res = await getMyUserInformation(server.url, cyanAccessToken) 185 const body = await server.usersCommand.getMyInfo({ token: cyanAccessToken })
193 const user: User = res.body 186 expect(body.username).to.equal('cyan')
194 expect(user.username).to.equal('cyan')
195 } 187 }
196 188
197 { 189 {
@@ -200,16 +192,13 @@ describe('Test external auth plugins', function () {
200 }) 192 })
201 193
202 it('Should update Cyan profile', async function () { 194 it('Should update Cyan profile', async function () {
203 await updateMyUser({ 195 await server.usersCommand.updateMe({
204 url: server.url, 196 token: cyanAccessToken,
205 accessToken: cyanAccessToken,
206 displayName: 'Cyan Garamonde', 197 displayName: 'Cyan Garamonde',
207 description: 'Retainer to the king of Doma' 198 description: 'Retainer to the king of Doma'
208 }) 199 })
209 200
210 const res = await getMyUserInformation(server.url, cyanAccessToken) 201 const body = await server.usersCommand.getMyInfo({ token: cyanAccessToken })
211
212 const body: User = res.body
213 expect(body.account.displayName).to.equal('Cyan Garamonde') 202 expect(body.account.displayName).to.equal('Cyan Garamonde')
214 expect(body.account.description).to.equal('Retainer to the king of Doma') 203 expect(body.account.description).to.equal('Retainer to the king of Doma')
215 }) 204 })
@@ -221,7 +210,7 @@ describe('Test external auth plugins', function () {
221 it('Should have logged out Cyan', async function () { 210 it('Should have logged out Cyan', async function () {
222 await server.serversCommand.waitUntilLog('On logout cyan') 211 await server.serversCommand.waitUntilLog('On logout cyan')
223 212
224 await getMyUserInformation(server.url, cyanAccessToken, HttpStatusCode.UNAUTHORIZED_401) 213 await server.usersCommand.getMyInfo({ token: cyanAccessToken, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
225 }) 214 })
226 215
227 it('Should login Cyan and keep the old existing profile', async function () { 216 it('Should login Cyan and keep the old existing profile', async function () {
@@ -239,9 +228,7 @@ describe('Test external auth plugins', function () {
239 cyanAccessToken = res.access_token 228 cyanAccessToken = res.access_token
240 } 229 }
241 230
242 const res = await getMyUserInformation(server.url, cyanAccessToken) 231 const body = await server.usersCommand.getMyInfo({ token: cyanAccessToken })
243
244 const body: User = res.body
245 expect(body.username).to.equal('cyan') 232 expect(body.username).to.equal('cyan')
246 expect(body.account.displayName).to.equal('Cyan Garamonde') 233 expect(body.account.displayName).to.equal('Cyan Garamonde')
247 expect(body.account.description).to.equal('Retainer to the king of Doma') 234 expect(body.account.description).to.equal('Retainer to the king of Doma')
@@ -249,12 +236,11 @@ describe('Test external auth plugins', function () {
249 }) 236 })
250 237
251 it('Should not update an external auth email', async function () { 238 it('Should not update an external auth email', async function () {
252 await updateMyUser({ 239 await server.usersCommand.updateMe({
253 url: server.url, 240 token: cyanAccessToken,
254 accessToken: cyanAccessToken,
255 email: 'toto@example.com', 241 email: 'toto@example.com',
256 currentPassword: 'toto', 242 currentPassword: 'toto',
257 statusCodeExpected: HttpStatusCode.BAD_REQUEST_400 243 expectedStatus: HttpStatusCode.BAD_REQUEST_400
258 }) 244 })
259 }) 245 })
260 246
@@ -263,7 +249,7 @@ describe('Test external auth plugins', function () {
263 249
264 await wait(5000) 250 await wait(5000)
265 251
266 await getMyUserInformation(server.url, kefkaAccessToken, HttpStatusCode.UNAUTHORIZED_401) 252 await server.usersCommand.getMyInfo({ token: kefkaAccessToken, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
267 }) 253 })
268 254
269 it('Should unregister external-auth-2 and do not login existing Kefka', async function () { 255 it('Should unregister external-auth-2 and do not login existing Kefka', async function () {
@@ -334,12 +320,7 @@ describe('Test external auth plugins', function () {
334 }) 320 })
335 321
336 it('Should not login an existing user', async function () { 322 it('Should not login an existing user', async function () {
337 await createUser({ 323 await server.usersCommand.create({ username: 'existing_user', password: 'super_password' })
338 url: server.url,
339 accessToken: server.accessToken,
340 username: 'existing_user',
341 password: 'super_password'
342 })
343 324
344 await loginExternal({ 325 await loginExternal({
345 server, 326 server,
diff --git a/server/tests/plugins/filter-hooks.ts b/server/tests/plugins/filter-hooks.ts
index b5e29d298..c82025f6a 100644
--- a/server/tests/plugins/filter-hooks.ts
+++ b/server/tests/plugins/filter-hooks.ts
@@ -17,7 +17,6 @@ import {
17 ImportsCommand, 17 ImportsCommand,
18 makeRawRequest, 18 makeRawRequest,
19 PluginsCommand, 19 PluginsCommand,
20 registerUser,
21 ServerInfo, 20 ServerInfo,
22 setAccessTokensToServers, 21 setAccessTokensToServers,
23 setDefaultVideoChannel, 22 setDefaultVideoChannel,
@@ -335,11 +334,15 @@ describe('Test plugin filter hooks', function () {
335 }) 334 })
336 335
337 it('Should allow a signup', async function () { 336 it('Should allow a signup', async function () {
338 await registerUser(servers[0].url, 'john', 'password') 337 await servers[0].usersCommand.register({ username: 'john', password: 'password' })
339 }) 338 })
340 339
341 it('Should not allow a signup', async function () { 340 it('Should not allow a signup', async function () {
342 const res = await registerUser(servers[0].url, 'jma', 'password', HttpStatusCode.FORBIDDEN_403) 341 const res = await servers[0].usersCommand.register({
342 username: 'jma',
343 password: 'password',
344 expectedStatus: HttpStatusCode.FORBIDDEN_403
345 })
343 346
344 expect(res.body.error).to.equal('No jma') 347 expect(res.body.error).to.equal('No jma')
345 }) 348 })
diff --git a/server/tests/plugins/id-and-pass-auth.ts b/server/tests/plugins/id-and-pass-auth.ts
index e3da64110..787080e7c 100644
--- a/server/tests/plugins/id-and-pass-auth.ts
+++ b/server/tests/plugins/id-and-pass-auth.ts
@@ -3,18 +3,8 @@
3import 'mocha' 3import 'mocha'
4import { expect } from 'chai' 4import { expect } from 'chai'
5import { HttpStatusCode } from '@shared/core-utils' 5import { HttpStatusCode } from '@shared/core-utils'
6import { 6import { cleanupTests, flushAndRunServer, PluginsCommand, ServerInfo, setAccessTokensToServers, wait } from '@shared/extra-utils'
7 cleanupTests, 7import { UserRole } from '@shared/models'
8 flushAndRunServer,
9 getMyUserInformation,
10 getUsersList,
11 PluginsCommand,
12 ServerInfo,
13 setAccessTokensToServers,
14 updateMyUser,
15 wait
16} from '@shared/extra-utils'
17import { User, UserRole } from '@shared/models'
18 8
19describe('Test id and pass auth plugins', function () { 9describe('Test id and pass auth plugins', function () {
20 let server: ServerInfo 10 let server: ServerInfo
@@ -55,9 +45,8 @@ describe('Test id and pass auth plugins', function () {
55 it('Should login Spyro, create the user and use the token', async function () { 45 it('Should login Spyro, create the user and use the token', async function () {
56 const accessToken = await server.loginCommand.getAccessToken({ username: 'spyro', password: 'spyro password' }) 46 const accessToken = await server.loginCommand.getAccessToken({ username: 'spyro', password: 'spyro password' })
57 47
58 const res = await getMyUserInformation(server.url, accessToken) 48 const body = await server.usersCommand.getMyInfo({ token: accessToken })
59 49
60 const body: User = res.body
61 expect(body.username).to.equal('spyro') 50 expect(body.username).to.equal('spyro')
62 expect(body.account.displayName).to.equal('Spyro the Dragon') 51 expect(body.account.displayName).to.equal('Spyro the Dragon')
63 expect(body.role).to.equal(UserRole.USER) 52 expect(body.role).to.equal(UserRole.USER)
@@ -71,9 +60,8 @@ describe('Test id and pass auth plugins', function () {
71 } 60 }
72 61
73 { 62 {
74 const res = await getMyUserInformation(server.url, crashAccessToken) 63 const body = await server.usersCommand.getMyInfo({ token: crashAccessToken })
75 64
76 const body: User = res.body
77 expect(body.username).to.equal('crash') 65 expect(body.username).to.equal('crash')
78 expect(body.account.displayName).to.equal('Crash Bandicoot') 66 expect(body.account.displayName).to.equal('Crash Bandicoot')
79 expect(body.role).to.equal(UserRole.MODERATOR) 67 expect(body.role).to.equal(UserRole.MODERATOR)
@@ -88,9 +76,8 @@ describe('Test id and pass auth plugins', function () {
88 } 76 }
89 77
90 { 78 {
91 const res = await getMyUserInformation(server.url, lagunaAccessToken) 79 const body = await server.usersCommand.getMyInfo({ token: lagunaAccessToken })
92 80
93 const body: User = res.body
94 expect(body.username).to.equal('laguna') 81 expect(body.username).to.equal('laguna')
95 expect(body.account.displayName).to.equal('laguna') 82 expect(body.account.displayName).to.equal('laguna')
96 expect(body.role).to.equal(UserRole.USER) 83 expect(body.role).to.equal(UserRole.USER)
@@ -103,9 +90,8 @@ describe('Test id and pass auth plugins', function () {
103 crashAccessToken = resRefresh.body.access_token 90 crashAccessToken = resRefresh.body.access_token
104 crashRefreshToken = resRefresh.body.refresh_token 91 crashRefreshToken = resRefresh.body.refresh_token
105 92
106 const res = await getMyUserInformation(server.url, crashAccessToken) 93 const body = await server.usersCommand.getMyInfo({ token: crashAccessToken })
107 const user: User = res.body 94 expect(body.username).to.equal('crash')
108 expect(user.username).to.equal('crash')
109 } 95 }
110 96
111 { 97 {
@@ -114,16 +100,14 @@ describe('Test id and pass auth plugins', function () {
114 }) 100 })
115 101
116 it('Should update Crash profile', async function () { 102 it('Should update Crash profile', async function () {
117 await updateMyUser({ 103 await server.usersCommand.updateMe({
118 url: server.url, 104 token: crashAccessToken,
119 accessToken: crashAccessToken,
120 displayName: 'Beautiful Crash', 105 displayName: 'Beautiful Crash',
121 description: 'Mutant eastern barred bandicoot' 106 description: 'Mutant eastern barred bandicoot'
122 }) 107 })
123 108
124 const res = await getMyUserInformation(server.url, crashAccessToken) 109 const body = await server.usersCommand.getMyInfo({ token: crashAccessToken })
125 110
126 const body: User = res.body
127 expect(body.account.displayName).to.equal('Beautiful Crash') 111 expect(body.account.displayName).to.equal('Beautiful Crash')
128 expect(body.account.description).to.equal('Mutant eastern barred bandicoot') 112 expect(body.account.description).to.equal('Mutant eastern barred bandicoot')
129 }) 113 })
@@ -135,15 +119,14 @@ describe('Test id and pass auth plugins', function () {
135 it('Should have logged out Crash', async function () { 119 it('Should have logged out Crash', async function () {
136 await server.serversCommand.waitUntilLog('On logout for auth 1 - 2') 120 await server.serversCommand.waitUntilLog('On logout for auth 1 - 2')
137 121
138 await getMyUserInformation(server.url, crashAccessToken, 401) 122 await server.usersCommand.getMyInfo({ token: crashAccessToken, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
139 }) 123 })
140 124
141 it('Should login Crash and keep the old existing profile', async function () { 125 it('Should login Crash and keep the old existing profile', async function () {
142 crashAccessToken = await server.loginCommand.getAccessToken({ username: 'crash', password: 'crash password' }) 126 crashAccessToken = await server.loginCommand.getAccessToken({ username: 'crash', password: 'crash password' })
143 127
144 const res = await getMyUserInformation(server.url, crashAccessToken) 128 const body = await server.usersCommand.getMyInfo({ token: crashAccessToken })
145 129
146 const body: User = res.body
147 expect(body.username).to.equal('crash') 130 expect(body.username).to.equal('crash')
148 expect(body.account.displayName).to.equal('Beautiful Crash') 131 expect(body.account.displayName).to.equal('Beautiful Crash')
149 expect(body.account.description).to.equal('Mutant eastern barred bandicoot') 132 expect(body.account.description).to.equal('Mutant eastern barred bandicoot')
@@ -155,7 +138,7 @@ describe('Test id and pass auth plugins', function () {
155 138
156 await wait(5000) 139 await wait(5000)
157 140
158 await getMyUserInformation(server.url, lagunaAccessToken, 401) 141 await server.usersCommand.getMyInfo({ token: lagunaAccessToken, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 })
159 }) 142 })
160 143
161 it('Should reject an invalid username, email, role or display name', async function () { 144 it('Should reject an invalid username, email, role or display name', async function () {
@@ -215,13 +198,11 @@ describe('Test id and pass auth plugins', function () {
215 }) 198 })
216 199
217 it('Should display plugin auth information in users list', async function () { 200 it('Should display plugin auth information in users list', async function () {
218 const res = await getUsersList(server.url, server.accessToken) 201 const { data } = await server.usersCommand.list()
219
220 const users: User[] = res.body.data
221 202
222 const root = users.find(u => u.username === 'root') 203 const root = data.find(u => u.username === 'root')
223 const crash = users.find(u => u.username === 'crash') 204 const crash = data.find(u => u.username === 'crash')
224 const laguna = users.find(u => u.username === 'laguna') 205 const laguna = data.find(u => u.username === 'laguna')
225 206
226 expect(root.pluginAuth).to.be.null 207 expect(root.pluginAuth).to.be.null
227 expect(crash.pluginAuth).to.equal('peertube-plugin-test-id-pass-auth-one') 208 expect(crash.pluginAuth).to.equal('peertube-plugin-test-id-pass-auth-one')
diff --git a/server/tools/cli.ts b/server/tools/cli.ts
index 3e0e03b97..17c2e8c74 100644
--- a/server/tools/cli.ts
+++ b/server/tools/cli.ts
@@ -3,8 +3,7 @@ import { Netrc } from 'netrc-parser'
3import { join } from 'path' 3import { join } from 'path'
4import { createLogger, format, transports } from 'winston' 4import { createLogger, format, transports } from 'winston'
5import { assignCommands, ServerInfo } from '@shared/extra-utils' 5import { assignCommands, ServerInfo } from '@shared/extra-utils'
6import { getMyUserInformation } from '@shared/extra-utils/users/users' 6import { UserRole } from '@shared/models'
7import { User, UserRole } from '@shared/models'
8import { VideoPrivacy } from '../../shared/models/videos' 7import { VideoPrivacy } from '../../shared/models/videos'
9import { getAppNumber, isTestInstance, root } from '../helpers/core-utils' 8import { getAppNumber, isTestInstance, root } from '../helpers/core-utils'
10 9
@@ -16,16 +15,15 @@ const config = require('application-config')(configName)
16const version = require('../../../package.json').version 15const version = require('../../../package.json').version
17 16
18async function getAdminTokenOrDie (server: ServerInfo, username: string, password: string) { 17async function getAdminTokenOrDie (server: ServerInfo, username: string, password: string) {
19 const accessToken = await server.loginCommand.getAccessToken(username, password) 18 const token = await server.loginCommand.getAccessToken(username, password)
20 const resMe = await getMyUserInformation(server.url, accessToken) 19 const me = await server.usersCommand.getMyUserInformation({ token })
21 const me: User = resMe.body
22 20
23 if (me.role !== UserRole.ADMINISTRATOR) { 21 if (me.role !== UserRole.ADMINISTRATOR) {
24 console.error('You must be an administrator.') 22 console.error('You must be an administrator.')
25 process.exit(-1) 23 process.exit(-1)
26 } 24 }
27 25
28 return accessToken 26 return token
29} 27}
30 28
31interface Settings { 29interface Settings {
diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts
index 4d9599680..b6d597c5d 100644
--- a/shared/extra-utils/server/servers.ts
+++ b/shared/extra-utils/server/servers.ts
@@ -16,7 +16,7 @@ import { AbusesCommand } from '../moderation'
16import { OverviewsCommand } from '../overviews' 16import { OverviewsCommand } from '../overviews'
17import { SearchCommand } from '../search' 17import { SearchCommand } from '../search'
18import { SocketIOCommand } from '../socket' 18import { SocketIOCommand } from '../socket'
19import { AccountsCommand, BlocklistCommand, LoginCommand, NotificationsCommand, SubscriptionsCommand } from '../users' 19import { AccountsCommand, BlocklistCommand, LoginCommand, NotificationsCommand, SubscriptionsCommand, UsersCommand } from '../users'
20import { 20import {
21 BlacklistCommand, 21 BlacklistCommand,
22 CaptionsCommand, 22 CaptionsCommand,
@@ -127,6 +127,7 @@ interface ServerInfo {
127 notificationsCommand?: NotificationsCommand 127 notificationsCommand?: NotificationsCommand
128 serversCommand?: ServersCommand 128 serversCommand?: ServersCommand
129 loginCommand?: LoginCommand 129 loginCommand?: LoginCommand
130 usersCommand?: UsersCommand
130} 131}
131 132
132function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) { 133function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) {
@@ -359,6 +360,7 @@ function assignCommands (server: ServerInfo) {
359 server.notificationsCommand = new NotificationsCommand(server) 360 server.notificationsCommand = new NotificationsCommand(server)
360 server.serversCommand = new ServersCommand(server) 361 server.serversCommand = new ServersCommand(server)
361 server.loginCommand = new LoginCommand(server) 362 server.loginCommand = new LoginCommand(server)
363 server.usersCommand = new UsersCommand(server)
362} 364}
363 365
364async function reRunServer (server: ServerInfo, configOverride?: any) { 366async function reRunServer (server: ServerInfo, configOverride?: any) {
diff --git a/shared/extra-utils/users/index.ts b/shared/extra-utils/users/index.ts
index b200ae705..e6107afa5 100644
--- a/shared/extra-utils/users/index.ts
+++ b/shared/extra-utils/users/index.ts
@@ -6,4 +6,5 @@ export * from './login-command'
6export * from './notifications' 6export * from './notifications'
7export * from './notifications-command' 7export * from './notifications-command'
8export * from './subscriptions-command' 8export * from './subscriptions-command'
9export * from './users-command'
9export * from './users' 10export * from './users'
diff --git a/shared/extra-utils/users/login-command.ts b/shared/extra-utils/users/login-command.ts
index 8af3531f9..b4e3bb602 100644
--- a/shared/extra-utils/users/login-command.ts
+++ b/shared/extra-utils/users/login-command.ts
@@ -7,7 +7,7 @@ export class LoginCommand extends AbstractCommand {
7 7
8 login (options: OverrideCommandOptions & { 8 login (options: OverrideCommandOptions & {
9 client?: { id?: string, secret?: string } 9 client?: { id?: string, secret?: string }
10 user?: { username: string, password: string } 10 user?: { username: string, password?: string }
11 } = {}) { 11 } = {}) {
12 const { client = this.server.client, user = this.server.user } = options 12 const { client = this.server.client, user = this.server.user } = options
13 const path = '/api/v1/users/token' 13 const path = '/api/v1/users/token'
@@ -16,7 +16,7 @@ export class LoginCommand extends AbstractCommand {
16 client_id: client.id, 16 client_id: client.id,
17 client_secret: client.secret, 17 client_secret: client.secret,
18 username: user.username, 18 username: user.username,
19 password: user.password, 19 password: user.password ?? 'password',
20 response_type: 'code', 20 response_type: 'code',
21 grant_type: 'password', 21 grant_type: 'password',
22 scope: 'upload' 22 scope: 'upload'
@@ -33,10 +33,10 @@ export class LoginCommand extends AbstractCommand {
33 })) 33 }))
34 } 34 }
35 35
36 getAccessToken (arg1?: { username: string, password: string }): Promise<string> 36 getAccessToken (arg1?: { username: string, password?: string }): Promise<string>
37 getAccessToken (arg1: string, password: string): Promise<string> 37 getAccessToken (arg1: string, password?: string): Promise<string>
38 async getAccessToken (arg1?: { username: string, password: string } | string, password?: string) { 38 async getAccessToken (arg1?: { username: string, password?: string } | string, password?: string) {
39 let user: { username: string, password: string } 39 let user: { username: string, password?: string }
40 40
41 if (!arg1) user = this.server.user 41 if (!arg1) user = this.server.user
42 else if (typeof arg1 === 'object') user = arg1 42 else if (typeof arg1 === 'object') user = arg1
diff --git a/shared/extra-utils/users/notifications.ts b/shared/extra-utils/users/notifications.ts
index 79cb6f617..0af7d8a18 100644
--- a/shared/extra-utils/users/notifications.ts
+++ b/shared/extra-utils/users/notifications.ts
@@ -8,7 +8,6 @@ import { MockSmtpServer } from '../mock-servers/mock-email'
8import { doubleFollow } from '../server/follows' 8import { doubleFollow } from '../server/follows'
9import { flushAndRunMultipleServers, ServerInfo } from '../server/servers' 9import { flushAndRunMultipleServers, ServerInfo } from '../server/servers'
10import { setAccessTokensToServers } from './login' 10import { setAccessTokensToServers } from './login'
11import { createUser, getMyUserInformation } from './users'
12 11
13function getAllNotificationsSettings (): UserNotificationSetting { 12function getAllNotificationsSettings (): UserNotificationSetting {
14 return { 13 return {
@@ -651,17 +650,8 @@ async function prepareNotificationsTest (serversCount = 3, overrideConfigArg: an
651 await doubleFollow(servers[0], servers[1]) 650 await doubleFollow(servers[0], servers[1])
652 } 651 }
653 652
654 const user = { 653 const user = { username: 'user_1', password: 'super password' }
655 username: 'user_1', 654 await servers[0].usersCommand.create({ ...user, videoQuota: 10 * 1000 * 1000 })
656 password: 'super password'
657 }
658 await createUser({
659 url: servers[0].url,
660 accessToken: servers[0].accessToken,
661 username: user.username,
662 password: user.password,
663 videoQuota: 10 * 1000 * 1000
664 })
665 const userAccessToken = await servers[0].loginCommand.getAccessToken(user) 655 const userAccessToken = await servers[0].loginCommand.getAccessToken(user)
666 656
667 await servers[0].notificationsCommand.updateMySettings({ token: userAccessToken, settings: getAllNotificationsSettings() }) 657 await servers[0].notificationsCommand.updateMySettings({ token: userAccessToken, settings: getAllNotificationsSettings() })
@@ -685,8 +675,8 @@ async function prepareNotificationsTest (serversCount = 3, overrideConfigArg: an
685 socket.on('new-notification', n => adminNotificationsServer2.push(n)) 675 socket.on('new-notification', n => adminNotificationsServer2.push(n))
686 } 676 }
687 677
688 const resChannel = await getMyUserInformation(servers[0].url, servers[0].accessToken) 678 const { videoChannels } = await servers[0].usersCommand.getMyInfo()
689 const channelId = resChannel.body.videoChannels[0].id 679 const channelId = videoChannels[0].id
690 680
691 return { 681 return {
692 userNotifications, 682 userNotifications,
diff --git a/shared/extra-utils/users/users-command.ts b/shared/extra-utils/users/users-command.ts
new file mode 100644
index 000000000..202528b8d
--- /dev/null
+++ b/shared/extra-utils/users/users-command.ts
@@ -0,0 +1,414 @@
1import { omit, pick } from 'lodash'
2import { HttpStatusCode } from '@shared/core-utils'
3import {
4 MyUser,
5 ResultList,
6 User,
7 UserAdminFlag,
8 UserCreateResult,
9 UserRole,
10 UserUpdate,
11 UserUpdateMe,
12 UserVideoQuota,
13 UserVideoRate
14} from '@shared/models'
15import { ScopedToken } from '@shared/models/users/user-scoped-token'
16import { unwrapBody } from '../requests'
17import { AbstractCommand, OverrideCommandOptions } from '../shared'
18
19export class UsersCommand extends AbstractCommand {
20
21 askResetPassword (options: OverrideCommandOptions & {
22 email: string
23 }) {
24 const { email } = options
25 const path = '/api/v1/users/ask-reset-password'
26
27 return this.postBodyRequest({
28 ...options,
29
30 path,
31 fields: { email },
32 implicitToken: false,
33 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
34 })
35 }
36
37 resetPassword (options: OverrideCommandOptions & {
38 userId: number
39 verificationString: string
40 password: string
41 }) {
42 const { userId, verificationString, password } = options
43 const path = '/api/v1/users/' + userId + '/reset-password'
44
45 return this.postBodyRequest({
46 ...options,
47
48 path,
49 fields: { password, verificationString },
50 implicitToken: false,
51 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
52 })
53 }
54
55 // ---------------------------------------------------------------------------
56
57 askSendVerifyEmail (options: OverrideCommandOptions & {
58 email: string
59 }) {
60 const { email } = options
61 const path = '/api/v1/users/ask-send-verify-email'
62
63 return this.postBodyRequest({
64 ...options,
65
66 path,
67 fields: { email },
68 implicitToken: false,
69 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
70 })
71 }
72
73 verifyEmail (options: OverrideCommandOptions & {
74 userId: number
75 verificationString: string
76 isPendingEmail?: boolean // default false
77 }) {
78 const { userId, verificationString, isPendingEmail = false } = options
79 const path = '/api/v1/users/' + userId + '/verify-email'
80
81 return this.postBodyRequest({
82 ...options,
83
84 path,
85 fields: {
86 verificationString,
87 isPendingEmail
88 },
89 implicitToken: false,
90 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
91 })
92 }
93
94 // ---------------------------------------------------------------------------
95
96 banUser (options: OverrideCommandOptions & {
97 userId: number
98 reason?: string
99 }) {
100 const { userId, reason } = options
101 const path = '/api/v1/users' + '/' + userId + '/block'
102
103 return this.postBodyRequest({
104 ...options,
105
106 path,
107 fields: { reason },
108 implicitToken: true,
109 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
110 })
111 }
112
113 unbanUser (options: OverrideCommandOptions & {
114 userId: number
115 }) {
116 const { userId } = options
117 const path = '/api/v1/users' + '/' + userId + '/unblock'
118
119 return this.postBodyRequest({
120 ...options,
121
122 path,
123 implicitToken: true,
124 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
125 })
126 }
127
128 // ---------------------------------------------------------------------------
129
130 getMyScopedTokens (options: OverrideCommandOptions = {}) {
131 const path = '/api/v1/users/scoped-tokens'
132
133 return this.getRequestBody<ScopedToken>({
134 ...options,
135
136 path,
137 implicitToken: true,
138 defaultExpectedStatus: HttpStatusCode.OK_200
139 })
140 }
141
142 renewMyScopedTokens (options: OverrideCommandOptions = {}) {
143 const path = '/api/v1/users/scoped-tokens'
144
145 return this.postBodyRequest({
146 ...options,
147
148 path,
149 implicitToken: true,
150 defaultExpectedStatus: HttpStatusCode.OK_200
151 })
152 }
153
154 // ---------------------------------------------------------------------------
155
156 create (options: OverrideCommandOptions & {
157 username: string
158 password?: string
159 videoQuota?: number
160 videoQuotaDaily?: number
161 role?: UserRole
162 adminFlags?: UserAdminFlag
163 }) {
164 const {
165 username,
166 adminFlags,
167 password = 'password',
168 videoQuota = 42000000,
169 videoQuotaDaily = -1,
170 role = UserRole.USER
171 } = options
172
173 const path = '/api/v1/users'
174
175 return unwrapBody<{ user: UserCreateResult }>(this.postBodyRequest({
176 ...options,
177
178 path,
179 fields: {
180 username,
181 password,
182 role,
183 adminFlags,
184 email: username + '@example.com',
185 videoQuota,
186 videoQuotaDaily
187 },
188 implicitToken: true,
189 defaultExpectedStatus: HttpStatusCode.OK_200
190 })).then(res => res.user)
191 }
192
193 async generate (username: string) {
194 const password = 'password'
195 const user = await this.create({ username, password })
196
197 const token = await this.server.loginCommand.getAccessToken({ username, password })
198
199 const me = await this.getMyInfo({ token })
200
201 return {
202 token,
203 userId: user.id,
204 userChannelId: me.videoChannels[0].id
205 }
206 }
207
208 async generateUserAndToken (username: string) {
209 const password = 'password'
210 await this.create({ username, password })
211
212 return this.server.loginCommand.getAccessToken({ username, password })
213 }
214
215 register (options: OverrideCommandOptions & {
216 username: string
217 password?: string
218 displayName?: string
219 channel?: {
220 name: string
221 displayName: string
222 }
223 }) {
224 const { username, password = 'password', displayName, channel } = options
225 const path = '/api/v1/users/register'
226
227 return this.postBodyRequest({
228 ...options,
229
230 path,
231 fields: {
232 username,
233 password,
234 email: username + '@example.com',
235 displayName,
236 channel
237 },
238 implicitToken: false,
239 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
240 })
241 }
242
243 // ---------------------------------------------------------------------------
244
245 getMyInfo (options: OverrideCommandOptions = {}) {
246 const path = '/api/v1/users/me'
247
248 return this.getRequestBody<MyUser>({
249 ...options,
250
251 path,
252 implicitToken: true,
253 defaultExpectedStatus: HttpStatusCode.OK_200
254 })
255 }
256
257 getMyQuotaUsed (options: OverrideCommandOptions = {}) {
258 const path = '/api/v1/users/me/video-quota-used'
259
260 return this.getRequestBody<UserVideoQuota>({
261 ...options,
262
263 path,
264 implicitToken: true,
265 defaultExpectedStatus: HttpStatusCode.OK_200
266 })
267 }
268
269 getMyRating (options: OverrideCommandOptions & {
270 videoId: number | string
271 }) {
272 const { videoId } = options
273 const path = '/api/v1/users/me/videos/' + videoId + '/rating'
274
275 return this.getRequestBody<UserVideoRate>({
276 ...options,
277
278 path,
279 implicitToken: true,
280 defaultExpectedStatus: HttpStatusCode.OK_200
281 })
282 }
283
284 deleteMe (options: OverrideCommandOptions = {}) {
285 const path = '/api/v1/users/me'
286
287 return this.deleteRequest({
288 ...options,
289
290 path,
291 implicitToken: true,
292 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
293 })
294 }
295
296 updateMe (options: OverrideCommandOptions & UserUpdateMe) {
297 const path = '/api/v1/users/me'
298
299 const toSend: UserUpdateMe = omit(options, 'url', 'accessToken')
300
301 return this.putBodyRequest({
302 ...options,
303
304 path,
305 fields: toSend,
306 implicitToken: true,
307 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
308 })
309 }
310
311 updateMyAvatar (options: OverrideCommandOptions & {
312 fixture: string
313 }) {
314 const { fixture } = options
315 const path = '/api/v1/users/me/avatar/pick'
316
317 return this.updateImageRequest({
318 ...options,
319
320 path,
321 fixture,
322 fieldname: 'avatarfile',
323
324 implicitToken: true,
325 defaultExpectedStatus: HttpStatusCode.OK_200
326 })
327 }
328
329 // ---------------------------------------------------------------------------
330
331 get (options: OverrideCommandOptions & {
332 userId: number
333 withStats?: boolean // default false
334 }) {
335 const { userId, withStats } = options
336 const path = '/api/v1/users/' + userId
337
338 return this.getRequestBody<User>({
339 ...options,
340
341 path,
342 query: { withStats },
343 implicitToken: true,
344 defaultExpectedStatus: HttpStatusCode.OK_200
345 })
346 }
347
348 list (options: OverrideCommandOptions & {
349 start?: number
350 count?: number
351 sort?: string
352 search?: string
353 blocked?: boolean
354 } = {}) {
355 const path = '/api/v1/users'
356
357 return this.getRequestBody<ResultList<User>>({
358 ...options,
359
360 path,
361 query: pick(options, [ 'start', 'count', 'sort', 'search', 'blocked' ]),
362 implicitToken: true,
363 defaultExpectedStatus: HttpStatusCode.OK_200
364 })
365 }
366
367 remove (options: OverrideCommandOptions & {
368 userId: number
369 }) {
370 const { userId } = options
371 const path = '/api/v1/users/' + userId
372
373 return this.deleteRequest({
374 ...options,
375
376 path,
377 implicitToken: true,
378 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
379 })
380 }
381
382 update (options: OverrideCommandOptions & {
383 userId: number
384 email?: string
385 emailVerified?: boolean
386 videoQuota?: number
387 videoQuotaDaily?: number
388 password?: string
389 adminFlags?: UserAdminFlag
390 pluginAuth?: string
391 role?: UserRole
392 }) {
393 const path = '/api/v1/users/' + options.userId
394
395 const toSend: UserUpdate = {}
396 if (options.password !== undefined && options.password !== null) toSend.password = options.password
397 if (options.email !== undefined && options.email !== null) toSend.email = options.email
398 if (options.emailVerified !== undefined && options.emailVerified !== null) toSend.emailVerified = options.emailVerified
399 if (options.videoQuota !== undefined && options.videoQuota !== null) toSend.videoQuota = options.videoQuota
400 if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend.videoQuotaDaily = options.videoQuotaDaily
401 if (options.role !== undefined && options.role !== null) toSend.role = options.role
402 if (options.adminFlags !== undefined && options.adminFlags !== null) toSend.adminFlags = options.adminFlags
403 if (options.pluginAuth !== undefined) toSend.pluginAuth = options.pluginAuth
404
405 return this.putBodyRequest({
406 ...options,
407
408 path,
409 fields: toSend,
410 implicitToken: true,
411 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
412 })
413 }
414}
diff --git a/shared/extra-utils/users/users.ts b/shared/extra-utils/users/users.ts
index 835ad08ba..6cf61d60e 100644
--- a/shared/extra-utils/users/users.ts
+++ b/shared/extra-utils/users/users.ts
@@ -1,118 +1,8 @@
1import { omit } from 'lodash'
2import * as request from 'supertest' 1import * as request from 'supertest'
3import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes' 2import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
4import { UserUpdateMe } from '../../models/users'
5import { UserAdminFlag } from '../../models/users/user-flag.model'
6import { UserRegister } from '../../models/users/user-register.model'
7import { UserRole } from '../../models/users/user-role'
8import { makeGetRequest, makePostBodyRequest, makePutBodyRequest, updateImageRequest } from '../requests/requests'
9import { ServerInfo } from '../server/servers'
10 3
11function createUser (parameters: { 4// FIXME: delete once videos does not use it anymore
12 url: string 5function xxxgetMyUserInformation (url: string, accessToken: string, specialStatus = HttpStatusCode.OK_200) {
13 accessToken: string
14 username: string
15 password: string
16 videoQuota?: number
17 videoQuotaDaily?: number
18 role?: UserRole
19 adminFlags?: UserAdminFlag
20 specialStatus?: number
21}) {
22 const {
23 url,
24 accessToken,
25 username,
26 adminFlags,
27 password = 'password',
28 videoQuota = 1000000,
29 videoQuotaDaily = -1,
30 role = UserRole.USER,
31 specialStatus = HttpStatusCode.OK_200
32 } = parameters
33
34 const path = '/api/v1/users'
35 const body = {
36 username,
37 password,
38 role,
39 adminFlags,
40 email: username + '@example.com',
41 videoQuota,
42 videoQuotaDaily
43 }
44
45 return request(url)
46 .post(path)
47 .set('Accept', 'application/json')
48 .set('Authorization', 'Bearer ' + accessToken)
49 .send(body)
50 .expect(specialStatus)
51}
52
53async function generateUser (server: ServerInfo, username: string) {
54 const password = 'my super password'
55 const resCreate = await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password })
56
57 const token = await server.loginCommand.getAccessToken({ username, password })
58
59 const resMe = await getMyUserInformation(server.url, token)
60
61 return {
62 token,
63 userId: resCreate.body.user.id,
64 userChannelId: resMe.body.videoChannels[0].id
65 }
66}
67
68async function generateUserAccessToken (server: ServerInfo, username: string) {
69 const password = 'my super password'
70 await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password })
71
72 return server.loginCommand.getAccessToken({ username, password })
73}
74
75function registerUser (url: string, username: string, password: string, specialStatus = HttpStatusCode.NO_CONTENT_204) {
76 const path = '/api/v1/users/register'
77 const body = {
78 username,
79 password,
80 email: username + '@example.com'
81 }
82
83 return request(url)
84 .post(path)
85 .set('Accept', 'application/json')
86 .send(body)
87 .expect(specialStatus)
88}
89
90function registerUserWithChannel (options: {
91 url: string
92 user: { username: string, password: string, displayName?: string }
93 channel: { name: string, displayName: string }
94}) {
95 const path = '/api/v1/users/register'
96 const body: UserRegister = {
97 username: options.user.username,
98 password: options.user.password,
99 email: options.user.username + '@example.com',
100 channel: options.channel
101 }
102
103 if (options.user.displayName) {
104 Object.assign(body, { displayName: options.user.displayName })
105 }
106
107 return makePostBodyRequest({
108 url: options.url,
109 path,
110 fields: body,
111 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
112 })
113}
114
115function getMyUserInformation (url: string, accessToken: string, specialStatus = HttpStatusCode.OK_200) {
116 const path = '/api/v1/users/me' 6 const path = '/api/v1/users/me'
117 7
118 return request(url) 8 return request(url)
@@ -123,292 +13,8 @@ function getMyUserInformation (url: string, accessToken: string, specialStatus =
123 .expect('Content-Type', /json/) 13 .expect('Content-Type', /json/)
124} 14}
125 15
126function getUserScopedTokens (url: string, token: string, statusCodeExpected = HttpStatusCode.OK_200) {
127 const path = '/api/v1/users/scoped-tokens'
128
129 return makeGetRequest({
130 url,
131 path,
132 token,
133 statusCodeExpected
134 })
135}
136
137function renewUserScopedTokens (url: string, token: string, statusCodeExpected = HttpStatusCode.OK_200) {
138 const path = '/api/v1/users/scoped-tokens'
139
140 return makePostBodyRequest({
141 url,
142 path,
143 token,
144 statusCodeExpected
145 })
146}
147
148function deleteMe (url: string, accessToken: string, specialStatus = HttpStatusCode.NO_CONTENT_204) {
149 const path = '/api/v1/users/me'
150
151 return request(url)
152 .delete(path)
153 .set('Accept', 'application/json')
154 .set('Authorization', 'Bearer ' + accessToken)
155 .expect(specialStatus)
156}
157
158function getMyUserVideoQuotaUsed (url: string, accessToken: string, specialStatus = HttpStatusCode.OK_200) {
159 const path = '/api/v1/users/me/video-quota-used'
160
161 return request(url)
162 .get(path)
163 .set('Accept', 'application/json')
164 .set('Authorization', 'Bearer ' + accessToken)
165 .expect(specialStatus)
166 .expect('Content-Type', /json/)
167}
168
169function getUserInformation (url: string, accessToken: string, userId: number, withStats = false) {
170 const path = '/api/v1/users/' + userId
171
172 return request(url)
173 .get(path)
174 .query({ withStats })
175 .set('Accept', 'application/json')
176 .set('Authorization', 'Bearer ' + accessToken)
177 .expect(HttpStatusCode.OK_200)
178 .expect('Content-Type', /json/)
179}
180
181function getMyUserVideoRating (url: string, accessToken: string, videoId: number | string, specialStatus = HttpStatusCode.OK_200) {
182 const path = '/api/v1/users/me/videos/' + videoId + '/rating'
183
184 return request(url)
185 .get(path)
186 .set('Accept', 'application/json')
187 .set('Authorization', 'Bearer ' + accessToken)
188 .expect(specialStatus)
189 .expect('Content-Type', /json/)
190}
191
192function getUsersList (url: string, accessToken: string) {
193 const path = '/api/v1/users'
194
195 return request(url)
196 .get(path)
197 .set('Accept', 'application/json')
198 .set('Authorization', 'Bearer ' + accessToken)
199 .expect(HttpStatusCode.OK_200)
200 .expect('Content-Type', /json/)
201}
202
203function getUsersListPaginationAndSort (
204 url: string,
205 accessToken: string,
206 start: number,
207 count: number,
208 sort: string,
209 search?: string,
210 blocked?: boolean
211) {
212 const path = '/api/v1/users'
213
214 const query = {
215 start,
216 count,
217 sort,
218 search,
219 blocked
220 }
221
222 return request(url)
223 .get(path)
224 .query(query)
225 .set('Accept', 'application/json')
226 .set('Authorization', 'Bearer ' + accessToken)
227 .expect(HttpStatusCode.OK_200)
228 .expect('Content-Type', /json/)
229}
230
231function removeUser (url: string, userId: number | string, accessToken: string, expectedStatus = HttpStatusCode.NO_CONTENT_204) {
232 const path = '/api/v1/users'
233
234 return request(url)
235 .delete(path + '/' + userId)
236 .set('Accept', 'application/json')
237 .set('Authorization', 'Bearer ' + accessToken)
238 .expect(expectedStatus)
239}
240
241function blockUser (
242 url: string,
243 userId: number | string,
244 accessToken: string,
245 expectedStatus = HttpStatusCode.NO_CONTENT_204,
246 reason?: string
247) {
248 const path = '/api/v1/users'
249 let body: any
250 if (reason) body = { reason }
251
252 return request(url)
253 .post(path + '/' + userId + '/block')
254 .send(body)
255 .set('Accept', 'application/json')
256 .set('Authorization', 'Bearer ' + accessToken)
257 .expect(expectedStatus)
258}
259
260function unblockUser (url: string, userId: number | string, accessToken: string, expectedStatus = HttpStatusCode.NO_CONTENT_204) {
261 const path = '/api/v1/users'
262
263 return request(url)
264 .post(path + '/' + userId + '/unblock')
265 .set('Accept', 'application/json')
266 .set('Authorization', 'Bearer ' + accessToken)
267 .expect(expectedStatus)
268}
269
270function updateMyUser (options: { url: string, accessToken: string, statusCodeExpected?: HttpStatusCode } & UserUpdateMe) {
271 const path = '/api/v1/users/me'
272
273 const toSend: UserUpdateMe = omit(options, 'url', 'accessToken')
274
275 return makePutBodyRequest({
276 url: options.url,
277 path,
278 token: options.accessToken,
279 fields: toSend,
280 statusCodeExpected: options.statusCodeExpected || HttpStatusCode.NO_CONTENT_204
281 })
282}
283
284function updateMyAvatar (options: {
285 url: string
286 accessToken: string
287 fixture: string
288}) {
289 const path = '/api/v1/users/me/avatar/pick'
290
291 return updateImageRequest({ ...options, path, fieldname: 'avatarfile' })
292}
293
294function updateUser (options: {
295 url: string
296 userId: number
297 accessToken: string
298 email?: string
299 emailVerified?: boolean
300 videoQuota?: number
301 videoQuotaDaily?: number
302 password?: string
303 adminFlags?: UserAdminFlag
304 pluginAuth?: string
305 role?: UserRole
306}) {
307 const path = '/api/v1/users/' + options.userId
308
309 const toSend = {}
310 if (options.password !== undefined && options.password !== null) toSend['password'] = options.password
311 if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
312 if (options.emailVerified !== undefined && options.emailVerified !== null) toSend['emailVerified'] = options.emailVerified
313 if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota
314 if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily
315 if (options.role !== undefined && options.role !== null) toSend['role'] = options.role
316 if (options.adminFlags !== undefined && options.adminFlags !== null) toSend['adminFlags'] = options.adminFlags
317 if (options.pluginAuth !== undefined) toSend['pluginAuth'] = options.pluginAuth
318
319 return makePutBodyRequest({
320 url: options.url,
321 path,
322 token: options.accessToken,
323 fields: toSend,
324 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
325 })
326}
327
328function askResetPassword (url: string, email: string) {
329 const path = '/api/v1/users/ask-reset-password'
330
331 return makePostBodyRequest({
332 url,
333 path,
334 fields: { email },
335 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
336 })
337}
338
339function resetPassword (
340 url: string,
341 userId: number,
342 verificationString: string,
343 password: string,
344 statusCodeExpected = HttpStatusCode.NO_CONTENT_204
345) {
346 const path = '/api/v1/users/' + userId + '/reset-password'
347
348 return makePostBodyRequest({
349 url,
350 path,
351 fields: { password, verificationString },
352 statusCodeExpected
353 })
354}
355
356function askSendVerifyEmail (url: string, email: string) {
357 const path = '/api/v1/users/ask-send-verify-email'
358
359 return makePostBodyRequest({
360 url,
361 path,
362 fields: { email },
363 statusCodeExpected: HttpStatusCode.NO_CONTENT_204
364 })
365}
366
367function verifyEmail (
368 url: string,
369 userId: number,
370 verificationString: string,
371 isPendingEmail = false,
372 statusCodeExpected = HttpStatusCode.NO_CONTENT_204
373) {
374 const path = '/api/v1/users/' + userId + '/verify-email'
375
376 return makePostBodyRequest({
377 url,
378 path,
379 fields: {
380 verificationString,
381 isPendingEmail
382 },
383 statusCodeExpected
384 })
385}
386
387// --------------------------------------------------------------------------- 16// ---------------------------------------------------------------------------
388 17
389export { 18export {
390 createUser, 19 xxxgetMyUserInformation
391 registerUser,
392 getMyUserInformation,
393 getMyUserVideoRating,
394 deleteMe,
395 registerUserWithChannel,
396 getMyUserVideoQuotaUsed,
397 getUsersList,
398 getUsersListPaginationAndSort,
399 removeUser,
400 updateUser,
401 updateMyUser,
402 getUserInformation,
403 blockUser,
404 unblockUser,
405 askResetPassword,
406 resetPassword,
407 renewUserScopedTokens,
408 updateMyAvatar,
409 generateUser,
410 askSendVerifyEmail,
411 generateUserAccessToken,
412 verifyEmail,
413 getUserScopedTokens
414} 20}
diff --git a/shared/extra-utils/videos/channels.ts b/shared/extra-utils/videos/channels.ts
index a77543c92..9e7ec565d 100644
--- a/shared/extra-utils/videos/channels.ts
+++ b/shared/extra-utils/videos/channels.ts
@@ -1,13 +1,11 @@
1import { User } from '../../models/users/user.model'
2import { ServerInfo } from '../server/servers' 1import { ServerInfo } from '../server/servers'
3import { getMyUserInformation } from '../users/users'
4 2
5function setDefaultVideoChannel (servers: ServerInfo[]) { 3function setDefaultVideoChannel (servers: ServerInfo[]) {
6 const tasks: Promise<any>[] = [] 4 const tasks: Promise<any>[] = []
7 5
8 for (const server of servers) { 6 for (const server of servers) {
9 const p = getMyUserInformation(server.url, server.accessToken) 7 const p = server.usersCommand.getMyInfo()
10 .then(res => { server.videoChannel = (res.body as User).videoChannels[0] }) 8 .then(user => { server.videoChannel = user.videoChannels[0] })
11 9
12 tasks.push(p) 10 tasks.push(p)
13 } 11 }
diff --git a/shared/extra-utils/videos/videos.ts b/shared/extra-utils/videos/videos.ts
index 5dd71ce8b..5e20f8010 100644
--- a/shared/extra-utils/videos/videos.ts
+++ b/shared/extra-utils/videos/videos.ts
@@ -17,7 +17,7 @@ import { buildAbsoluteFixturePath, dateIsValid, testImage, wait, webtorrentAdd }
17import { makeGetRequest, makePutBodyRequest, makeRawRequest, makeUploadRequest } from '../requests/requests' 17import { makeGetRequest, makePutBodyRequest, makeRawRequest, makeUploadRequest } from '../requests/requests'
18import { waitJobs } from '../server/jobs' 18import { waitJobs } from '../server/jobs'
19import { ServerInfo } from '../server/servers' 19import { ServerInfo } from '../server/servers'
20import { getMyUserInformation } from '../users/users' 20import { xxxgetMyUserInformation } from '../users'
21 21
22loadLanguages() 22loadLanguages()
23 23
@@ -339,7 +339,7 @@ async function uploadVideo (
339 let defaultChannelId = '1' 339 let defaultChannelId = '1'
340 340
341 try { 341 try {
342 const res = await getMyUserInformation(url, accessToken) 342 const res = await xxxgetMyUserInformation(url, accessToken)
343 defaultChannelId = res.body.videoChannels[0].id 343 defaultChannelId = res.body.videoChannels[0].id
344 } catch (e) { /* empty */ } 344 } catch (e) { /* empty */ }
345 345
diff --git a/shared/models/users/index.ts b/shared/models/users/index.ts
index a9d578054..b61a8cd40 100644
--- a/shared/models/users/index.ts
+++ b/shared/models/users/index.ts
@@ -1,3 +1,4 @@
1export * from './user-create-result.model'
1export * from './user-create.model' 2export * from './user-create.model'
2export * from './user-flag.model' 3export * from './user-flag.model'
3export * from './user-login.model' 4export * from './user-login.model'
diff --git a/shared/models/users/user-create-result.model.ts b/shared/models/users/user-create-result.model.ts
new file mode 100644
index 000000000..835b241ed
--- /dev/null
+++ b/shared/models/users/user-create-result.model.ts
@@ -0,0 +1,7 @@
1export interface UserCreateResult {
2 id: number
3
4 account: {
5 id: number
6 }
7}