aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/tests/api
diff options
context:
space:
mode:
Diffstat (limited to 'server/tests/api')
-rw-r--r--server/tests/api/activitypub/helpers.ts13
-rw-r--r--server/tests/api/check-params/config.ts35
-rw-r--r--server/tests/api/check-params/user-notifications.ts3
-rw-r--r--server/tests/api/check-params/users.ts20
-rw-r--r--server/tests/api/notifications/user-notifications.ts73
-rw-r--r--server/tests/api/search/search-videos.ts8
-rw-r--r--server/tests/api/server/auto-follows.ts211
-rw-r--r--server/tests/api/server/config.ts66
-rw-r--r--server/tests/api/server/index.ts1
-rw-r--r--server/tests/api/users/users.ts21
-rw-r--r--server/tests/api/videos/video-abuse.ts77
-rw-r--r--server/tests/api/videos/video-change-ownership.ts2
12 files changed, 500 insertions, 30 deletions
diff --git a/server/tests/api/activitypub/helpers.ts b/server/tests/api/activitypub/helpers.ts
index 365d0e1ae..0d1f154fe 100644
--- a/server/tests/api/activitypub/helpers.ts
+++ b/server/tests/api/activitypub/helpers.ts
@@ -53,19 +53,6 @@ describe('Test activity pub helpers', function () {
53 expect(result).to.be.false 53 expect(result).to.be.false
54 }) 54 })
55 55
56 it('Should fail with an invalid PeerTube URL', async function () {
57 const keys = require('./json/peertube/keys.json')
58 const body = require('./json/peertube/announce-without-context.json')
59
60 const actorSignature = { url: 'http://localhost:9002/accounts/peertube', privateKey: keys.privateKey }
61 const signedBody = await buildSignedActivity(actorSignature as any, body)
62
63 const fromActor = { publicKey: keys.publicKey, url: 'http://localhost:9003/accounts/peertube' }
64 const result = await isJsonLDSignatureVerified(fromActor as any, signedBody)
65
66 expect(result).to.be.false
67 })
68
69 it('Should succeed with a valid PeerTube signature', async function () { 56 it('Should succeed with a valid PeerTube signature', async function () {
70 const keys = require('./json/peertube/keys.json') 57 const keys = require('./json/peertube/keys.json')
71 const body = require('./json/peertube/announce-without-context.json') 58 const body = require('./json/peertube/announce-without-context.json')
diff --git a/server/tests/api/check-params/config.ts b/server/tests/api/check-params/config.ts
index 7773ae1e7..9435bb1e8 100644
--- a/server/tests/api/check-params/config.ts
+++ b/server/tests/api/check-params/config.ts
@@ -5,8 +5,16 @@ import 'mocha'
5import { CustomConfig } from '../../../../shared/models/server/custom-config.model' 5import { CustomConfig } from '../../../../shared/models/server/custom-config.model'
6 6
7import { 7import {
8 createUser, flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePutBodyRequest, flushAndRunServer, ServerInfo, 8 cleanupTests,
9 setAccessTokensToServers, userLogin, immutableAssign, cleanupTests 9 createUser,
10 flushAndRunServer,
11 immutableAssign,
12 makeDeleteRequest,
13 makeGetRequest,
14 makePutBodyRequest,
15 ServerInfo,
16 setAccessTokensToServers,
17 userLogin
10} from '../../../../shared/extra-utils' 18} from '../../../../shared/extra-utils'
11 19
12describe('Test config API validators', function () { 20describe('Test config API validators', function () {
@@ -19,6 +27,18 @@ describe('Test config API validators', function () {
19 shortDescription: 'my short description', 27 shortDescription: 'my short description',
20 description: 'my super description', 28 description: 'my super description',
21 terms: 'my super terms', 29 terms: 'my super terms',
30 codeOfConduct: 'my super coc',
31
32 creationReason: 'my super reason',
33 moderationInformation: 'my super moderation information',
34 administrator: 'Kuja',
35 maintenanceLifetime: 'forever',
36 businessModel: 'my super business model',
37 hardwareInformation: '2vCore 3GB RAM',
38
39 languages: [ 'en', 'es' ],
40 categories: [ 1, 2 ],
41
22 isNSFW: true, 42 isNSFW: true,
23 defaultClientRoute: '/videos/recently-added', 43 defaultClientRoute: '/videos/recently-added',
24 defaultNSFWPolicy: 'blur', 44 defaultNSFWPolicy: 'blur',
@@ -98,6 +118,17 @@ describe('Test config API validators', function () {
98 enabled: false, 118 enabled: false,
99 manualApproval: true 119 manualApproval: true
100 } 120 }
121 },
122 followings: {
123 instance: {
124 autoFollowBack: {
125 enabled: true
126 },
127 autoFollowIndex: {
128 enabled: true,
129 indexUrl: 'https://index.example.com'
130 }
131 }
101 } 132 }
102 } 133 }
103 134
diff --git a/server/tests/api/check-params/user-notifications.ts b/server/tests/api/check-params/user-notifications.ts
index 14ee20d45..3b06be7ef 100644
--- a/server/tests/api/check-params/user-notifications.ts
+++ b/server/tests/api/check-params/user-notifications.ts
@@ -172,7 +172,8 @@ describe('Test user notifications API validators', function () {
172 commentMention: UserNotificationSettingValue.WEB, 172 commentMention: UserNotificationSettingValue.WEB,
173 newFollow: UserNotificationSettingValue.WEB, 173 newFollow: UserNotificationSettingValue.WEB,
174 newUserRegistration: UserNotificationSettingValue.WEB, 174 newUserRegistration: UserNotificationSettingValue.WEB,
175 newInstanceFollower: UserNotificationSettingValue.WEB 175 newInstanceFollower: UserNotificationSettingValue.WEB,
176 autoInstanceFollowing: UserNotificationSettingValue.WEB
176 } 177 }
177 178
178 it('Should fail with missing fields', async function () { 179 it('Should fail with missing fields', async function () {
diff --git a/server/tests/api/check-params/users.ts b/server/tests/api/check-params/users.ts
index 939b919ed..55094795c 100644
--- a/server/tests/api/check-params/users.ts
+++ b/server/tests/api/check-params/users.ts
@@ -476,6 +476,22 @@ describe('Test users API validators', function () {
476 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields }) 476 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
477 }) 477 })
478 478
479 it('Should fail with an invalid noInstanceConfigWarningModal attribute', async function () {
480 const fields = {
481 noInstanceConfigWarningModal: -1
482 }
483
484 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
485 })
486
487 it('Should fail with an invalid noWelcomeModal attribute', async function () {
488 const fields = {
489 noWelcomeModal: -1
490 }
491
492 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields })
493 })
494
479 it('Should succeed to change password with the correct params', async function () { 495 it('Should succeed to change password with the correct params', async function () {
480 const fields = { 496 const fields = {
481 currentPassword: 'my super password', 497 currentPassword: 'my super password',
@@ -483,7 +499,9 @@ describe('Test users API validators', function () {
483 nsfwPolicy: 'blur', 499 nsfwPolicy: 'blur',
484 autoPlayVideo: false, 500 autoPlayVideo: false,
485 email: 'super_email@example.com', 501 email: 'super_email@example.com',
486 theme: 'default' 502 theme: 'default',
503 noInstanceConfigWarningModal: true,
504 noWelcomeModal: true
487 } 505 }
488 506
489 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields, statusCodeExpected: 204 }) 507 await makePutBodyRequest({ url: server.url, path: path + 'me', token: userAccessToken, fields, statusCodeExpected: 204 })
diff --git a/server/tests/api/notifications/user-notifications.ts b/server/tests/api/notifications/user-notifications.ts
index 6fa630562..15a34f5aa 100644
--- a/server/tests/api/notifications/user-notifications.ts
+++ b/server/tests/api/notifications/user-notifications.ts
@@ -14,10 +14,13 @@ import {
14 getVideoCommentThreads, 14 getVideoCommentThreads,
15 getVideoThreadComments, 15 getVideoThreadComments,
16 immutableAssign, 16 immutableAssign,
17 MockInstancesIndex,
17 registerUser, 18 registerUser,
18 removeVideoFromBlacklist, 19 removeVideoFromBlacklist,
19 reportVideoAbuse, 20 reportVideoAbuse,
21 unfollow,
20 updateCustomConfig, 22 updateCustomConfig,
23 updateCustomSubConfig,
21 updateMyUser, 24 updateMyUser,
22 updateVideo, 25 updateVideo,
23 updateVideoChannel, 26 updateVideoChannel,
@@ -29,6 +32,7 @@ import { setAccessTokensToServers } from '../../../../shared/extra-utils/users/l
29import { waitJobs } from '../../../../shared/extra-utils/server/jobs' 32import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
30import { getUserNotificationSocket } from '../../../../shared/extra-utils/socket/socket-io' 33import { getUserNotificationSocket } from '../../../../shared/extra-utils/socket/socket-io'
31import { 34import {
35 checkAutoInstanceFollowing,
32 checkCommentMention, 36 checkCommentMention,
33 CheckerBaseParams, 37 CheckerBaseParams,
34 checkMyVideoImportIsFinished, 38 checkMyVideoImportIsFinished,
@@ -108,7 +112,8 @@ describe('Test users notifications', function () {
108 commentMention: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL, 112 commentMention: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
109 newFollow: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL, 113 newFollow: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
110 newUserRegistration: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL, 114 newUserRegistration: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
111 newInstanceFollower: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL 115 newInstanceFollower: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL,
116 autoInstanceFollowing: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
112 } 117 }
113 118
114 before(async function () { 119 before(async function () {
@@ -873,7 +878,18 @@ describe('Test users notifications', function () {
873 }) 878 })
874 }) 879 })
875 880
876 describe('New instance follower', function () { 881 describe('New instance follows', function () {
882 const instanceIndexServer = new MockInstancesIndex()
883 const config = {
884 followings: {
885 instance: {
886 autoFollowIndex: {
887 indexUrl: 'http://localhost:42100',
888 enabled: true
889 }
890 }
891 }
892 }
877 let baseParams: CheckerBaseParams 893 let baseParams: CheckerBaseParams
878 894
879 before(async () => { 895 before(async () => {
@@ -883,6 +899,9 @@ describe('Test users notifications', function () {
883 socketNotifications: adminNotifications, 899 socketNotifications: adminNotifications,
884 token: servers[0].accessToken 900 token: servers[0].accessToken
885 } 901 }
902
903 await instanceIndexServer.initialize()
904 instanceIndexServer.addInstance(servers[1].host)
886 }) 905 })
887 906
888 it('Should send a notification only to admin when there is a new instance follower', async function () { 907 it('Should send a notification only to admin when there is a new instance follower', async function () {
@@ -897,6 +916,56 @@ describe('Test users notifications', function () {
897 const userOverride = { socketNotifications: userNotifications, token: userAccessToken, check: { web: true, mail: false } } 916 const userOverride = { socketNotifications: userNotifications, token: userAccessToken, check: { web: true, mail: false } }
898 await checkNewInstanceFollower(immutableAssign(baseParams, userOverride), 'localhost:' + servers[2].port, 'absence') 917 await checkNewInstanceFollower(immutableAssign(baseParams, userOverride), 'localhost:' + servers[2].port, 'absence')
899 }) 918 })
919
920 it('Should send a notification on auto follow back', async function () {
921 this.timeout(40000)
922
923 await unfollow(servers[2].url, servers[2].accessToken, servers[0])
924 await waitJobs(servers)
925
926 const config = {
927 followings: {
928 instance: {
929 autoFollowBack: { enabled: true }
930 }
931 }
932 }
933 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, config)
934
935 await follow(servers[2].url, [ servers[0].url ], servers[2].accessToken)
936
937 await waitJobs(servers)
938
939 const followerHost = servers[0].host
940 const followingHost = servers[2].host
941 await checkAutoInstanceFollowing(baseParams, followerHost, followingHost, 'presence')
942
943 const userOverride = { socketNotifications: userNotifications, token: userAccessToken, check: { web: true, mail: false } }
944 await checkAutoInstanceFollowing(immutableAssign(baseParams, userOverride), followerHost, followingHost, 'absence')
945
946 config.followings.instance.autoFollowBack.enabled = false
947 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, config)
948 await unfollow(servers[0].url, servers[0].accessToken, servers[2])
949 await unfollow(servers[2].url, servers[2].accessToken, servers[0])
950 })
951
952 it('Should send a notification on auto instances index follow', async function () {
953 this.timeout(30000)
954 await unfollow(servers[0].url, servers[0].accessToken, servers[1])
955
956 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, config)
957
958 await wait(5000)
959 await waitJobs(servers)
960
961 const followerHost = servers[0].host
962 const followingHost = servers[1].host
963 await checkAutoInstanceFollowing(baseParams, followerHost, followingHost, 'presence')
964
965 config.followings.instance.autoFollowIndex.enabled = false
966 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, config)
967 await unfollow(servers[0].url, servers[0].accessToken, servers[1])
968 })
900 }) 969 })
901 970
902 describe('New actor follow', function () { 971 describe('New actor follow', function () {
diff --git a/server/tests/api/search/search-videos.ts b/server/tests/api/search/search-videos.ts
index c06200ffe..a3e05156b 100644
--- a/server/tests/api/search/search-videos.ts
+++ b/server/tests/api/search/search-videos.ts
@@ -206,7 +206,7 @@ describe('Test videos search', function () {
206 const query = { 206 const query = {
207 search: '9999', 207 search: '9999',
208 categoryOneOf: [ 1 ], 208 categoryOneOf: [ 1 ],
209 tagsOneOf: [ 'aaaa', 'ffff' ] 209 tagsOneOf: [ 'aAaa', 'ffff' ]
210 } 210 }
211 const res1 = await advancedVideosSearch(server.url, query) 211 const res1 = await advancedVideosSearch(server.url, query)
212 expect(res1.body.total).to.equal(2) 212 expect(res1.body.total).to.equal(2)
@@ -219,15 +219,15 @@ describe('Test videos search', function () {
219 const query = { 219 const query = {
220 search: '9999', 220 search: '9999',
221 categoryOneOf: [ 1 ], 221 categoryOneOf: [ 1 ],
222 tagsAllOf: [ 'cccc' ] 222 tagsAllOf: [ 'CCcc' ]
223 } 223 }
224 const res1 = await advancedVideosSearch(server.url, query) 224 const res1 = await advancedVideosSearch(server.url, query)
225 expect(res1.body.total).to.equal(2) 225 expect(res1.body.total).to.equal(2)
226 226
227 const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'blabla' ] })) 227 const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'blAbla' ] }))
228 expect(res2.body.total).to.equal(0) 228 expect(res2.body.total).to.equal(0)
229 229
230 const res3 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'bbbb', 'cccc' ] })) 230 const res3 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'bbbb', 'CCCC' ] }))
231 expect(res3.body.total).to.equal(1) 231 expect(res3.body.total).to.equal(1)
232 }) 232 })
233 233
diff --git a/server/tests/api/server/auto-follows.ts b/server/tests/api/server/auto-follows.ts
new file mode 100644
index 000000000..df468034c
--- /dev/null
+++ b/server/tests/api/server/auto-follows.ts
@@ -0,0 +1,211 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 acceptFollower,
7 cleanupTests,
8 flushAndRunMultipleServers,
9 MockInstancesIndex,
10 ServerInfo,
11 setAccessTokensToServers,
12 unfollow,
13 updateCustomSubConfig,
14 wait
15} from '../../../../shared/extra-utils/index'
16import { follow, getFollowersListPaginationAndSort, getFollowingListPaginationAndSort } from '../../../../shared/extra-utils/server/follows'
17import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
18import { ActorFollow } from '../../../../shared/models/actors'
19
20const expect = chai.expect
21
22async function checkFollow (follower: ServerInfo, following: ServerInfo, exists: boolean) {
23 {
24 const res = await getFollowersListPaginationAndSort(following.url, 0, 5, '-createdAt')
25 const follows = res.body.data as ActorFollow[]
26
27 const follow = follows.find(f => {
28 return f.follower.host === follower.host && f.state === 'accepted'
29 })
30
31 if (exists === true) {
32 expect(follow).to.exist
33 } else {
34 expect(follow).to.be.undefined
35 }
36 }
37
38 {
39 const res = await getFollowingListPaginationAndSort(follower.url, 0, 5, '-createdAt')
40 const follows = res.body.data as ActorFollow[]
41
42 const follow = follows.find(f => {
43 return f.following.host === following.host && f.state === 'accepted'
44 })
45
46 if (exists === true) {
47 expect(follow).to.exist
48 } else {
49 expect(follow).to.be.undefined
50 }
51 }
52}
53
54async function server1Follows2 (servers: ServerInfo[]) {
55 await follow(servers[0].url, [ servers[1].host ], servers[0].accessToken)
56
57 await waitJobs(servers)
58}
59
60async function resetFollows (servers: ServerInfo[]) {
61 try {
62 await unfollow(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ])
63 await unfollow(servers[ 1 ].url, servers[ 1 ].accessToken, servers[ 0 ])
64 } catch { /* empty */ }
65
66 await waitJobs(servers)
67
68 await checkFollow(servers[0], servers[1], false)
69 await checkFollow(servers[1], servers[0], false)
70}
71
72describe('Test auto follows', function () {
73 let servers: ServerInfo[] = []
74
75 before(async function () {
76 this.timeout(30000)
77
78 servers = await flushAndRunMultipleServers(3)
79
80 // Get the access tokens
81 await setAccessTokensToServers(servers)
82 })
83
84 describe('Auto follow back', function () {
85
86 it('Should not auto follow back if the option is not enabled', async function () {
87 this.timeout(15000)
88
89 await server1Follows2(servers)
90
91 await checkFollow(servers[0], servers[1], true)
92 await checkFollow(servers[1], servers[0], false)
93
94 await resetFollows(servers)
95 })
96
97 it('Should auto follow back on auto accept if the option is enabled', async function () {
98 this.timeout(15000)
99
100 const config = {
101 followings: {
102 instance: {
103 autoFollowBack: { enabled: true }
104 }
105 }
106 }
107 await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
108
109 await server1Follows2(servers)
110
111 await checkFollow(servers[0], servers[1], true)
112 await checkFollow(servers[1], servers[0], true)
113
114 await resetFollows(servers)
115 })
116
117 it('Should wait the acceptation before auto follow back', async function () {
118 this.timeout(30000)
119
120 const config = {
121 followings: {
122 instance: {
123 autoFollowBack: { enabled: true }
124 }
125 },
126 followers: {
127 instance: {
128 manualApproval: true
129 }
130 }
131 }
132 await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
133
134 await server1Follows2(servers)
135
136 await checkFollow(servers[0], servers[1], false)
137 await checkFollow(servers[1], servers[0], false)
138
139 await acceptFollower(servers[1].url, servers[1].accessToken, 'peertube@' + servers[0].host)
140 await waitJobs(servers)
141
142 await checkFollow(servers[0], servers[1], true)
143 await checkFollow(servers[1], servers[0], true)
144
145 await resetFollows(servers)
146
147 config.followings.instance.autoFollowBack.enabled = false
148 config.followers.instance.manualApproval = false
149 await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
150 })
151 })
152
153 describe('Auto follow index', function () {
154 const instanceIndexServer = new MockInstancesIndex()
155
156 before(async () => {
157 await instanceIndexServer.initialize()
158 })
159
160 it('Should not auto follow index if the option is not enabled', async function () {
161 this.timeout(30000)
162
163 await wait(5000)
164 await waitJobs(servers)
165
166 await checkFollow(servers[ 0 ], servers[ 1 ], false)
167 await checkFollow(servers[ 1 ], servers[ 0 ], false)
168 })
169
170 it('Should auto follow the index', async function () {
171 this.timeout(30000)
172
173 instanceIndexServer.addInstance(servers[1].host)
174
175 const config = {
176 followings: {
177 instance: {
178 autoFollowIndex: {
179 indexUrl: 'http://localhost:42100',
180 enabled: true
181 }
182 }
183 }
184 }
185 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, config)
186
187 await wait(5000)
188 await waitJobs(servers)
189
190 await checkFollow(servers[ 0 ], servers[ 1 ], true)
191
192 await resetFollows(servers)
193 })
194
195 it('Should follow new added instances in the index but not old ones', async function () {
196 this.timeout(30000)
197
198 instanceIndexServer.addInstance(servers[2].host)
199
200 await wait(5000)
201 await waitJobs(servers)
202
203 await checkFollow(servers[ 0 ], servers[ 1 ], false)
204 await checkFollow(servers[ 0 ], servers[ 2 ], true)
205 })
206 })
207
208 after(async function () {
209 await cleanupTests(servers)
210 })
211})
diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts
index 78fdc9cc0..97cc99eea 100644
--- a/server/tests/api/server/config.ts
+++ b/server/tests/api/server/config.ts
@@ -28,7 +28,19 @@ function checkInitialConfig (server: ServerInfo, data: CustomConfig) {
28 'with WebTorrent and Angular.' 28 'with WebTorrent and Angular.'
29 ) 29 )
30 expect(data.instance.description).to.equal('Welcome to this PeerTube instance!') 30 expect(data.instance.description).to.equal('Welcome to this PeerTube instance!')
31
31 expect(data.instance.terms).to.equal('No terms for now.') 32 expect(data.instance.terms).to.equal('No terms for now.')
33 expect(data.instance.creationReason).to.be.empty
34 expect(data.instance.codeOfConduct).to.be.empty
35 expect(data.instance.moderationInformation).to.be.empty
36 expect(data.instance.administrator).to.be.empty
37 expect(data.instance.maintenanceLifetime).to.be.empty
38 expect(data.instance.businessModel).to.be.empty
39 expect(data.instance.hardwareInformation).to.be.empty
40
41 expect(data.instance.languages).to.have.lengthOf(0)
42 expect(data.instance.categories).to.have.lengthOf(0)
43
32 expect(data.instance.defaultClientRoute).to.equal('/videos/trending') 44 expect(data.instance.defaultClientRoute).to.equal('/videos/trending')
33 expect(data.instance.isNSFW).to.be.false 45 expect(data.instance.isNSFW).to.be.false
34 expect(data.instance.defaultNSFWPolicy).to.equal('display') 46 expect(data.instance.defaultNSFWPolicy).to.equal('display')
@@ -68,13 +80,29 @@ function checkInitialConfig (server: ServerInfo, data: CustomConfig) {
68 80
69 expect(data.followers.instance.enabled).to.be.true 81 expect(data.followers.instance.enabled).to.be.true
70 expect(data.followers.instance.manualApproval).to.be.false 82 expect(data.followers.instance.manualApproval).to.be.false
83
84 expect(data.followings.instance.autoFollowBack.enabled).to.be.false
85 expect(data.followings.instance.autoFollowIndex.enabled).to.be.false
86 expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('https://instances.joinpeertube.org')
71} 87}
72 88
73function checkUpdatedConfig (data: CustomConfig) { 89function checkUpdatedConfig (data: CustomConfig) {
74 expect(data.instance.name).to.equal('PeerTube updated') 90 expect(data.instance.name).to.equal('PeerTube updated')
75 expect(data.instance.shortDescription).to.equal('my short description') 91 expect(data.instance.shortDescription).to.equal('my short description')
76 expect(data.instance.description).to.equal('my super description') 92 expect(data.instance.description).to.equal('my super description')
93
77 expect(data.instance.terms).to.equal('my super terms') 94 expect(data.instance.terms).to.equal('my super terms')
95 expect(data.instance.creationReason).to.equal('my super creation reason')
96 expect(data.instance.codeOfConduct).to.equal('my super coc')
97 expect(data.instance.moderationInformation).to.equal('my super moderation information')
98 expect(data.instance.administrator).to.equal('Kuja')
99 expect(data.instance.maintenanceLifetime).to.equal('forever')
100 expect(data.instance.businessModel).to.equal('my super business model')
101 expect(data.instance.hardwareInformation).to.equal('2vCore 3GB RAM')
102
103 expect(data.instance.languages).to.deep.equal([ 'en', 'es' ])
104 expect(data.instance.categories).to.deep.equal([ 1, 2 ])
105
78 expect(data.instance.defaultClientRoute).to.equal('/videos/recently-added') 106 expect(data.instance.defaultClientRoute).to.equal('/videos/recently-added')
79 expect(data.instance.isNSFW).to.be.true 107 expect(data.instance.isNSFW).to.be.true
80 expect(data.instance.defaultNSFWPolicy).to.equal('blur') 108 expect(data.instance.defaultNSFWPolicy).to.equal('blur')
@@ -119,6 +147,10 @@ function checkUpdatedConfig (data: CustomConfig) {
119 147
120 expect(data.followers.instance.enabled).to.be.false 148 expect(data.followers.instance.enabled).to.be.false
121 expect(data.followers.instance.manualApproval).to.be.true 149 expect(data.followers.instance.manualApproval).to.be.true
150
151 expect(data.followings.instance.autoFollowBack.enabled).to.be.true
152 expect(data.followings.instance.autoFollowIndex.enabled).to.be.true
153 expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('https://updated.example.com')
122} 154}
123 155
124describe('Test config', function () { 156describe('Test config', function () {
@@ -182,6 +214,18 @@ describe('Test config', function () {
182 shortDescription: 'my short description', 214 shortDescription: 'my short description',
183 description: 'my super description', 215 description: 'my super description',
184 terms: 'my super terms', 216 terms: 'my super terms',
217 codeOfConduct: 'my super coc',
218
219 creationReason: 'my super creation reason',
220 moderationInformation: 'my super moderation information',
221 administrator: 'Kuja',
222 maintenanceLifetime: 'forever',
223 businessModel: 'my super business model',
224 hardwareInformation: '2vCore 3GB RAM',
225
226 languages: [ 'en', 'es' ],
227 categories: [ 1, 2 ],
228
185 defaultClientRoute: '/videos/recently-added', 229 defaultClientRoute: '/videos/recently-added',
186 isNSFW: true, 230 isNSFW: true,
187 defaultNSFWPolicy: 'blur' as 'blur', 231 defaultNSFWPolicy: 'blur' as 'blur',
@@ -261,6 +305,17 @@ describe('Test config', function () {
261 enabled: false, 305 enabled: false,
262 manualApproval: true 306 manualApproval: true
263 } 307 }
308 },
309 followings: {
310 instance: {
311 autoFollowBack: {
312 enabled: true
313 },
314 autoFollowIndex: {
315 enabled: true,
316 indexUrl: 'https://updated.example.com'
317 }
318 }
264 } 319 }
265 } 320 }
266 await updateCustomConfig(server.url, server.accessToken, newCustomConfig) 321 await updateCustomConfig(server.url, server.accessToken, newCustomConfig)
@@ -310,6 +365,17 @@ describe('Test config', function () {
310 expect(data.instance.shortDescription).to.equal('my short description') 365 expect(data.instance.shortDescription).to.equal('my short description')
311 expect(data.instance.description).to.equal('my super description') 366 expect(data.instance.description).to.equal('my super description')
312 expect(data.instance.terms).to.equal('my super terms') 367 expect(data.instance.terms).to.equal('my super terms')
368 expect(data.instance.codeOfConduct).to.equal('my super coc')
369
370 expect(data.instance.creationReason).to.equal('my super creation reason')
371 expect(data.instance.moderationInformation).to.equal('my super moderation information')
372 expect(data.instance.administrator).to.equal('Kuja')
373 expect(data.instance.maintenanceLifetime).to.equal('forever')
374 expect(data.instance.businessModel).to.equal('my super business model')
375 expect(data.instance.hardwareInformation).to.equal('2vCore 3GB RAM')
376
377 expect(data.instance.languages).to.deep.equal([ 'en', 'es' ])
378 expect(data.instance.categories).to.deep.equal([ 1, 2 ])
313 }) 379 })
314 380
315 it('Should remove the custom configuration', async function () { 381 it('Should remove the custom configuration', async function () {
diff --git a/server/tests/api/server/index.ts b/server/tests/api/server/index.ts
index 3daeeb49a..08205b2c8 100644
--- a/server/tests/api/server/index.ts
+++ b/server/tests/api/server/index.ts
@@ -1,3 +1,4 @@
1import './auto-follows'
1import './config' 2import './config'
2import './contact-form' 3import './contact-form'
3import './email' 4import './email'
diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts
index 3a3fabb4c..95b1bb626 100644
--- a/server/tests/api/users/users.ts
+++ b/server/tests/api/users/users.ts
@@ -442,7 +442,7 @@ describe('Test users', function () {
442 url: server.url, 442 url: server.url,
443 accessToken: accessTokenUser, 443 accessToken: accessTokenUser,
444 currentPassword: 'super password', 444 currentPassword: 'super password',
445 newPassword: 'new password' 445 password: 'new password'
446 }) 446 })
447 user.password = 'new password' 447 user.password = 'new password'
448 448
@@ -543,7 +543,7 @@ describe('Test users', function () {
543 }) 543 })
544 544
545 const res = await getMyUserInformation(server.url, accessTokenUser) 545 const res = await getMyUserInformation(server.url, accessTokenUser)
546 const user = res.body 546 const user: User = res.body
547 547
548 expect(user.username).to.equal('user_1') 548 expect(user.username).to.equal('user_1')
549 expect(user.email).to.equal('updated@example.com') 549 expect(user.email).to.equal('updated@example.com')
@@ -552,6 +552,8 @@ describe('Test users', function () {
552 expect(user.id).to.be.a('number') 552 expect(user.id).to.be.a('number')
553 expect(user.account.displayName).to.equal('new display name') 553 expect(user.account.displayName).to.equal('new display name')
554 expect(user.account.description).to.equal('my super description updated') 554 expect(user.account.description).to.equal('my super description updated')
555 expect(user.noWelcomeModal).to.be.false
556 expect(user.noInstanceConfigWarningModal).to.be.false
555 }) 557 })
556 558
557 it('Should be able to update my theme', async function () { 559 it('Should be able to update my theme', async function () {
@@ -568,6 +570,21 @@ describe('Test users', function () {
568 expect(body.theme).to.equal(theme) 570 expect(body.theme).to.equal(theme)
569 } 571 }
570 }) 572 })
573
574 it('Should be able to update my modal preferences', async function () {
575 await updateMyUser({
576 url: server.url,
577 accessToken: accessTokenUser,
578 noInstanceConfigWarningModal: true,
579 noWelcomeModal: true
580 })
581
582 const res = await getMyUserInformation(server.url, accessTokenUser)
583 const user: User = res.body
584
585 expect(user.noWelcomeModal).to.be.true
586 expect(user.noInstanceConfigWarningModal).to.be.true
587 })
571 }) 588 })
572 589
573 describe('Updating another user', function () { 590 describe('Updating another user', function () {
diff --git a/server/tests/api/videos/video-abuse.ts b/server/tests/api/videos/video-abuse.ts
index a2f3ee161..0cd6f22c7 100644
--- a/server/tests/api/videos/video-abuse.ts
+++ b/server/tests/api/videos/video-abuse.ts
@@ -17,6 +17,12 @@ import {
17} from '../../../../shared/extra-utils/index' 17} from '../../../../shared/extra-utils/index'
18import { doubleFollow } from '../../../../shared/extra-utils/server/follows' 18import { doubleFollow } from '../../../../shared/extra-utils/server/follows'
19import { waitJobs } from '../../../../shared/extra-utils/server/jobs' 19import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
20import {
21 addAccountToServerBlocklist,
22 addServerToServerBlocklist,
23 removeAccountFromServerBlocklist,
24 removeServerFromServerBlocklist
25} from '../../../../shared/extra-utils/users/blocklist'
20 26
21const expect = chai.expect 27const expect = chai.expect
22 28
@@ -163,13 +169,76 @@ describe('Test video abuses', function () {
163 expect(res.body.data[0].moderationComment).to.equal('It is valid') 169 expect(res.body.data[0].moderationComment).to.equal('It is valid')
164 }) 170 })
165 171
172 it('Should hide video abuses from blocked accounts', async function () {
173 this.timeout(10000)
174
175 {
176 await reportVideoAbuse(servers[1].url, servers[1].accessToken, servers[0].video.uuid, 'will mute this')
177 await waitJobs(servers)
178
179 const res = await getVideoAbusesList(servers[0].url, servers[0].accessToken)
180 expect(res.body.total).to.equal(3)
181 }
182
183 const accountToBlock = 'root@localhost:' + servers[1].port
184
185 {
186 await addAccountToServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, accountToBlock)
187
188 const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
189 expect(res.body.total).to.equal(2)
190
191 const abuse = res.body.data.find(a => a.reason === 'will mute this')
192 expect(abuse).to.be.undefined
193 }
194
195 {
196 await removeAccountFromServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, accountToBlock)
197
198 const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
199 expect(res.body.total).to.equal(3)
200 }
201 })
202
203 it('Should hide video abuses from blocked servers', async function () {
204 const serverToBlock = servers[1].host
205
206 {
207 await addServerToServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, servers[1].host)
208
209 const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
210 expect(res.body.total).to.equal(2)
211
212 const abuse = res.body.data.find(a => a.reason === 'will mute this')
213 expect(abuse).to.be.undefined
214 }
215
216 {
217 await removeServerFromServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, serverToBlock)
218
219 const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
220 expect(res.body.total).to.equal(3)
221 }
222 })
223
166 it('Should delete the video abuse', async function () { 224 it('Should delete the video abuse', async function () {
225 this.timeout(10000)
226
167 await deleteVideoAbuse(servers[1].url, servers[1].accessToken, abuseServer2.video.uuid, abuseServer2.id) 227 await deleteVideoAbuse(servers[1].url, servers[1].accessToken, abuseServer2.video.uuid, abuseServer2.id)
168 228
169 const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken) 229 await waitJobs(servers)
170 expect(res.body.total).to.equal(0) 230
171 expect(res.body.data).to.be.an('array') 231 {
172 expect(res.body.data.length).to.equal(0) 232 const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken)
233 expect(res.body.total).to.equal(1)
234 expect(res.body.data.length).to.equal(1)
235 expect(res.body.data[0].id).to.not.equal(abuseServer2.id)
236 }
237
238 {
239 const res = await getVideoAbusesList(servers[0].url, servers[0].accessToken)
240 expect(res.body.total).to.equal(3)
241 }
173 }) 242 })
174 243
175 after(async function () { 244 after(async function () {
diff --git a/server/tests/api/videos/video-change-ownership.ts b/server/tests/api/videos/video-change-ownership.ts
index 3a3add71b..64ee2355a 100644
--- a/server/tests/api/videos/video-change-ownership.ts
+++ b/server/tests/api/videos/video-change-ownership.ts
@@ -191,7 +191,7 @@ describe('Test video change ownership - nominal', function () {
191 await waitJobs(servers) 191 await waitJobs(servers)
192 }) 192 })
193 193
194 it('Should have video channel updated', async function () { 194 it('Should have the channel of the video updated', async function () {
195 for (const server of servers) { 195 for (const server of servers) {
196 const res = await getVideo(server.url, servers[0].video.uuid) 196 const res = await getVideo(server.url, servers[0].video.uuid)
197 197