1 /* tslint:disable:no-unused-expression */
3 import * as chai from 'chai'
8 flushAndRunMultipleServers,
11 setAccessTokensToServers,
13 updateCustomSubConfig,
15 } from '../../../../shared/extra-utils/index'
16 import { follow, getFollowersListPaginationAndSort, getFollowingListPaginationAndSort } from '../../../../shared/extra-utils/server/follows'
17 import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
18 import { ActorFollow } from '../../../../shared/models/actors'
20 const expect = chai.expect
22 async function checkFollow (follower: ServerInfo, following: ServerInfo, exists: boolean) {
24 const res = await getFollowersListPaginationAndSort(following.url, 0, 5, '-createdAt')
25 const follows = res.body.data as ActorFollow[]
27 const follow = follows.find(f => {
28 return f.follower.host === follower.host && f.state === 'accepted'
31 if (exists === true) {
32 expect(follow).to.exist
34 expect(follow).to.be.undefined
39 const res = await getFollowingListPaginationAndSort(follower.url, 0, 5, '-createdAt')
40 const follows = res.body.data as ActorFollow[]
42 const follow = follows.find(f => {
43 return f.following.host === following.host && f.state === 'accepted'
46 if (exists === true) {
47 expect(follow).to.exist
49 expect(follow).to.be.undefined
54 async function server1Follows2 (servers: ServerInfo[]) {
55 await follow(servers[0].url, [ servers[1].host ], servers[0].accessToken)
57 await waitJobs(servers)
60 async function resetFollows (servers: ServerInfo[]) {
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 */ }
66 await waitJobs(servers)
68 await checkFollow(servers[0], servers[1], false)
69 await checkFollow(servers[1], servers[0], false)
72 describe('Test auto follows', function () {
73 let servers: ServerInfo[] = []
75 before(async function () {
78 servers = await flushAndRunMultipleServers(3)
80 // Get the access tokens
81 await setAccessTokensToServers(servers)
84 describe('Auto follow back', function () {
86 it('Should not auto follow back if the option is not enabled', async function () {
89 await server1Follows2(servers)
91 await checkFollow(servers[0], servers[1], true)
92 await checkFollow(servers[1], servers[0], false)
94 await resetFollows(servers)
97 it('Should auto follow back on auto accept if the option is enabled', async function () {
103 autoFollowBack: { enabled: true }
107 await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
109 await server1Follows2(servers)
111 await checkFollow(servers[0], servers[1], true)
112 await checkFollow(servers[1], servers[0], true)
114 await resetFollows(servers)
117 it('Should wait the acceptation before auto follow back', async function () {
123 autoFollowBack: { enabled: true }
132 await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
134 await server1Follows2(servers)
136 await checkFollow(servers[0], servers[1], false)
137 await checkFollow(servers[1], servers[0], false)
139 await acceptFollower(servers[1].url, servers[1].accessToken, 'peertube@' + servers[0].host)
140 await waitJobs(servers)
142 await checkFollow(servers[0], servers[1], true)
143 await checkFollow(servers[1], servers[0], true)
145 await resetFollows(servers)
147 config.followings.instance.autoFollowBack.enabled = false
148 config.followers.instance.manualApproval = false
149 await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
153 describe('Auto follow index', function () {
154 const instanceIndexServer = new MockInstancesIndex()
157 await instanceIndexServer.initialize()
160 it('Should not auto follow index if the option is not enabled', async function () {
164 await waitJobs(servers)
166 await checkFollow(servers[ 0 ], servers[ 1 ], false)
167 await checkFollow(servers[ 1 ], servers[ 0 ], false)
170 it('Should auto follow the index', async function () {
173 instanceIndexServer.addInstance(servers[1].host)
179 indexUrl: 'http://localhost:42100',
185 await updateCustomSubConfig(servers[0].url, servers[0].accessToken, config)
188 await waitJobs(servers)
190 await checkFollow(servers[ 0 ], servers[ 1 ], true)
192 await resetFollows(servers)
195 it('Should follow new added instances in the index but not old ones', async function () {
198 instanceIndexServer.addInstance(servers[2].host)
201 await waitJobs(servers)
203 await checkFollow(servers[ 0 ], servers[ 1 ], false)
204 await checkFollow(servers[ 0 ], servers[ 2 ], true)
208 after(async function () {
209 await cleanupTests(servers)