Add auto follow instances index support
[oweals/peertube.git] / server / tests / api / server / auto-follows.ts
1 /* tslint:disable:no-unused-expression */
2
3 import * as chai from 'chai'
4 import 'mocha'
5 import {
6   acceptFollower,
7   cleanupTests,
8   flushAndRunMultipleServers,
9   MockInstancesIndex,
10   ServerInfo,
11   setAccessTokensToServers,
12   unfollow,
13   updateCustomSubConfig,
14   wait
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'
19
20 const expect = chai.expect
21
22 async 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
54 async function server1Follows2 (servers: ServerInfo[]) {
55   await follow(servers[0].url, [ servers[1].host ], servers[0].accessToken)
56
57   await waitJobs(servers)
58 }
59
60 async 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
72 describe('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   })
148
149   describe('Auto follow index', function () {
150     const instanceIndexServer = new MockInstancesIndex()
151
152     before(async () => {
153       await instanceIndexServer.initialize()
154     })
155
156     it('Should not auto follow index if the option is not enabled', async function () {
157       this.timeout(30000)
158
159       await wait(5000)
160       await waitJobs(servers)
161
162       await checkFollow(servers[ 0 ], servers[ 1 ], false)
163       await checkFollow(servers[ 1 ], servers[ 0 ], false)
164     })
165
166     it('Should auto follow the index', async function () {
167       this.timeout(30000)
168
169       instanceIndexServer.addInstance(servers[1].host)
170
171       const config = {
172         followings: {
173           instance: {
174             autoFollowIndex: {
175               indexUrl: 'http://localhost:42100',
176               enabled: true
177             }
178           }
179         }
180       }
181       await updateCustomSubConfig(servers[0].url, servers[0].accessToken, config)
182
183       await wait(5000)
184       await waitJobs(servers)
185
186       await checkFollow(servers[ 0 ], servers[ 1 ], true)
187
188       await resetFollows(servers)
189     })
190
191     it('Should follow new added instances in the index but not old ones', async function () {
192       this.timeout(30000)
193
194       instanceIndexServer.addInstance(servers[2].host)
195
196       await wait(5000)
197       await waitJobs(servers)
198
199       await checkFollow(servers[ 0 ], servers[ 1 ], false)
200       await checkFollow(servers[ 0 ], servers[ 2 ], true)
201     })
202   })
203
204   after(async function () {
205     await cleanupTests(servers)
206   })
207 })