Add auto follow back support for instances
[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   ServerInfo,
10   setAccessTokensToServers,
11   unfollow,
12   updateCustomSubConfig
13 } from '../../../../shared/extra-utils/index'
14 import { follow, getFollowersListPaginationAndSort, getFollowingListPaginationAndSort } from '../../../../shared/extra-utils/server/follows'
15 import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
16 import { ActorFollow } from '../../../../shared/models/actors'
17
18 const expect = chai.expect
19
20 async function checkFollow (follower: ServerInfo, following: ServerInfo, exists: boolean) {
21   {
22     const res = await getFollowersListPaginationAndSort(following.url, 0, 5, '-createdAt')
23     const follows = res.body.data as ActorFollow[]
24
25     if (exists === true) {
26       expect(res.body.total).to.equal(1)
27
28       expect(follows[ 0 ].follower.host).to.equal(follower.host)
29       expect(follows[ 0 ].state).to.equal('accepted')
30     } else {
31       expect(follows.filter(f => f.state === 'accepted')).to.have.lengthOf(0)
32     }
33   }
34
35   {
36     const res = await getFollowingListPaginationAndSort(follower.url, 0, 5, '-createdAt')
37     const follows = res.body.data as ActorFollow[]
38
39     if (exists === true) {
40       expect(res.body.total).to.equal(1)
41
42       expect(follows[ 0 ].following.host).to.equal(following.host)
43       expect(follows[ 0 ].state).to.equal('accepted')
44     } else {
45       expect(follows.filter(f => f.state === 'accepted')).to.have.lengthOf(0)
46     }
47   }
48 }
49
50 async function server1Follows2 (servers: ServerInfo[]) {
51   await follow(servers[0].url, [ servers[1].host ], servers[0].accessToken)
52
53   await waitJobs(servers)
54 }
55
56 async function resetFollows (servers: ServerInfo[]) {
57   try {
58     await unfollow(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ])
59     await unfollow(servers[ 1 ].url, servers[ 1 ].accessToken, servers[ 0 ])
60   } catch { /* empty */ }
61
62   await waitJobs(servers)
63
64   await checkFollow(servers[0], servers[1], false)
65   await checkFollow(servers[1], servers[0], false)
66 }
67
68 describe('Test auto follows', function () {
69   let servers: ServerInfo[] = []
70
71   before(async function () {
72     this.timeout(30000)
73
74     servers = await flushAndRunMultipleServers(2)
75
76     // Get the access tokens
77     await setAccessTokensToServers(servers)
78   })
79
80   describe('Auto follow back', function () {
81
82     it('Should not auto follow back if the option is not enabled', async function () {
83       this.timeout(15000)
84
85       await server1Follows2(servers)
86
87       await checkFollow(servers[0], servers[1], true)
88       await checkFollow(servers[1], servers[0], false)
89
90       await resetFollows(servers)
91     })
92
93     it('Should auto follow back on auto accept if the option is enabled', async function () {
94       this.timeout(15000)
95
96       const config = {
97         followings: {
98           instance: {
99             autoFollowBack: { enabled: true }
100           }
101         }
102       }
103       await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
104
105       await server1Follows2(servers)
106
107       await checkFollow(servers[0], servers[1], true)
108       await checkFollow(servers[1], servers[0], true)
109
110       await resetFollows(servers)
111     })
112
113     it('Should wait the acceptation before auto follow back', async function () {
114       this.timeout(30000)
115
116       const config = {
117         followings: {
118           instance: {
119             autoFollowBack: { enabled: true }
120           }
121         },
122         followers: {
123           instance: {
124             manualApproval: true
125           }
126         }
127       }
128       await updateCustomSubConfig(servers[1].url, servers[1].accessToken, config)
129
130       await server1Follows2(servers)
131
132       await checkFollow(servers[0], servers[1], false)
133       await checkFollow(servers[1], servers[0], false)
134
135       await acceptFollower(servers[1].url, servers[1].accessToken, 'peertube@' + servers[0].host)
136       await waitJobs(servers)
137
138       await checkFollow(servers[0], servers[1], true)
139       await checkFollow(servers[1], servers[0], true)
140
141       await resetFollows(servers)
142     })
143   })
144
145   after(async function () {
146     await cleanupTests(servers)
147   })
148 })