]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fix channel follow with manually approved follower
authorChocobozzz <me@florianbigard.com>
Tue, 11 Oct 2022 11:27:22 +0000 (13:27 +0200)
committerChocobozzz <me@florianbigard.com>
Tue, 11 Oct 2022 11:27:22 +0000 (13:27 +0200)
server/lib/activitypub/process/process-follow.ts
server/tests/api/server/follows-moderation.ts
server/tests/api/users/user-subscriptions.ts

index da660bda333503851d9a44b199b46be12d072c4e..7def753d52c7277cb5890705c1a5c20a213f6cd2 100644 (file)
@@ -47,7 +47,7 @@ async function processFollow (byActor: MActorSignature, activityId: string, targ
       byActor,
       targetActor,
       activityId,
-      state: CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL
+      state: await isFollowingInstance(targetActor) && CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL
         ? 'pending'
         : 'accepted',
       transaction: t
@@ -134,7 +134,7 @@ async function acceptIfNeeded (actorFollow: MActorFollow, targetActor: MActorFul
   // Or if the instance automatically accepts followers
   if (actorFollow.state === 'accepted') return
   if (!await isFollowingInstance(targetActor)) return
-  if (CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL === true) return
+  if (CONFIG.FOLLOWERS.INSTANCE.MANUAL_APPROVAL === true && await isFollowingInstance(targetActor)) return
 
   actorFollow.state = 'accepted'
 
index deeaac85a0859b5b51d680f2ef26a2c9172dc531..45e56518a2196713c033153e3af8fe5bd56b7336 100644 (file)
@@ -96,247 +96,273 @@ describe('Test follows moderation', function () {
     commands = servers.map(s => s.follows)
   })
 
-  it('Should have server 1 following server 2', async function () {
-    this.timeout(30000)
+  describe('Default behaviour', function () {
 
-    await commands[0].follow({ hosts: [ servers[1].url ] })
+    it('Should have server 1 following server 2', async function () {
+      this.timeout(30000)
 
-    await waitJobs(servers)
-  })
+      await commands[0].follow({ hosts: [ servers[1].url ] })
 
-  it('Should have correct follows', async function () {
-    await checkServer1And2HasFollowers(servers)
-  })
+      await waitJobs(servers)
+    })
 
-  it('Should remove follower on server 2', async function () {
-    this.timeout(10000)
+    it('Should have correct follows', async function () {
+      await checkServer1And2HasFollowers(servers)
+    })
 
-    await commands[1].removeFollower({ follower: servers[0] })
+    it('Should remove follower on server 2', async function () {
+      this.timeout(10000)
 
-    await waitJobs(servers)
-  })
+      await commands[1].removeFollower({ follower: servers[0] })
 
-  it('Should not not have follows anymore', async function () {
-    await checkNoFollowers(servers)
+      await waitJobs(servers)
+    })
+
+    it('Should not not have follows anymore', async function () {
+      await checkNoFollowers(servers)
+    })
   })
 
-  it('Should disable followers on server 2', async function () {
-    this.timeout(10000)
+  describe('Disabled/Enabled followers', function () {
 
-    const subConfig = {
-      followers: {
-        instance: {
-          enabled: false,
-          manualApproval: false
+    it('Should disable followers on server 2', async function () {
+      this.timeout(10000)
+
+      const subConfig = {
+        followers: {
+          instance: {
+            enabled: false,
+            manualApproval: false
+          }
         }
       }
-    }
 
-    await servers[1].config.updateCustomSubConfig({ newConfig: subConfig })
+      await servers[1].config.updateCustomSubConfig({ newConfig: subConfig })
 
-    await commands[0].follow({ hosts: [ servers[1].url ] })
-    await waitJobs(servers)
+      await commands[0].follow({ hosts: [ servers[1].url ] })
+      await waitJobs(servers)
 
-    await checkNoFollowers(servers)
-  })
+      await checkNoFollowers(servers)
+    })
 
-  it('Should re enable followers on server 2', async function () {
-    this.timeout(10000)
+    it('Should re enable followers on server 2', async function () {
+      this.timeout(10000)
 
-    const subConfig = {
-      followers: {
-        instance: {
-          enabled: true,
-          manualApproval: false
+      const subConfig = {
+        followers: {
+          instance: {
+            enabled: true,
+            manualApproval: false
+          }
         }
       }
-    }
 
-    await servers[1].config.updateCustomSubConfig({ newConfig: subConfig })
+      await servers[1].config.updateCustomSubConfig({ newConfig: subConfig })
 
-    await commands[0].follow({ hosts: [ servers[1].url ] })
-    await waitJobs(servers)
+      await commands[0].follow({ hosts: [ servers[1].url ] })
+      await waitJobs(servers)
 
-    await checkServer1And2HasFollowers(servers)
+      await checkServer1And2HasFollowers(servers)
+    })
   })
 
-  it('Should manually approve followers', async function () {
-    this.timeout(20000)
+  describe('Manual approbation', function () {
+
+    it('Should manually approve followers', async function () {
+      this.timeout(20000)
 
-    await commands[0].unfollow({ target: servers[1] })
-    await waitJobs(servers)
+      await commands[0].unfollow({ target: servers[1] })
+      await waitJobs(servers)
 
-    const subConfig = {
-      followers: {
-        instance: {
-          enabled: true,
-          manualApproval: true
+      const subConfig = {
+        followers: {
+          instance: {
+            enabled: true,
+            manualApproval: true
+          }
         }
       }
-    }
-
-    await servers[1].config.updateCustomSubConfig({ newConfig: subConfig })
-    await servers[2].config.updateCustomSubConfig({ newConfig: subConfig })
-
-    await commands[0].follow({ hosts: [ servers[1].url ] })
-    await waitJobs(servers)
-
-    await checkServer1And2HasFollowers(servers, 'pending')
-  })
-
-  it('Should accept a follower', async function () {
-    this.timeout(10000)
 
-    await commands[1].acceptFollower({ follower: 'peertube@' + servers[0].host })
-    await waitJobs(servers)
+      await servers[1].config.updateCustomSubConfig({ newConfig: subConfig })
+      await servers[2].config.updateCustomSubConfig({ newConfig: subConfig })
 
-    await checkServer1And2HasFollowers(servers)
-  })
+      await commands[0].follow({ hosts: [ servers[1].url ] })
+      await waitJobs(servers)
 
-  it('Should reject another follower', async function () {
-    this.timeout(20000)
+      await checkServer1And2HasFollowers(servers, 'pending')
+    })
 
-    await commands[0].follow({ hosts: [ servers[2].url ] })
-    await waitJobs(servers)
+    it('Should accept a follower', async function () {
+      this.timeout(10000)
 
-    {
-      const body = await commands[0].getFollowings()
-      expect(body.total).to.equal(2)
-    }
+      await commands[1].acceptFollower({ follower: 'peertube@' + servers[0].host })
+      await waitJobs(servers)
 
-    {
-      const body = await commands[1].getFollowers()
-      expect(body.total).to.equal(1)
-    }
+      await checkServer1And2HasFollowers(servers)
+    })
 
-    {
-      const body = await commands[2].getFollowers()
-      expect(body.total).to.equal(1)
-    }
+    it('Should reject another follower', async function () {
+      this.timeout(20000)
 
-    await commands[2].rejectFollower({ follower: 'peertube@' + servers[0].host })
-    await waitJobs(servers)
+      await commands[0].follow({ hosts: [ servers[2].url ] })
+      await waitJobs(servers)
 
-    { // server 1
       {
-        const { data } = await commands[0].getFollowings({ state: 'accepted' })
-        expect(data).to.have.lengthOf(1)
+        const body = await commands[0].getFollowings()
+        expect(body.total).to.equal(2)
       }
 
       {
-        const { data } = await commands[0].getFollowings({ state: 'rejected' })
-        expect(data).to.have.lengthOf(1)
-        expectStartWith(data[0].following.url, servers[2].url)
+        const body = await commands[1].getFollowers()
+        expect(body.total).to.equal(1)
       }
-    }
 
-    { // server 3
       {
-        const { data } = await commands[2].getFollowers({ state: 'accepted' })
-        expect(data).to.have.lengthOf(0)
+        const body = await commands[2].getFollowers()
+        expect(body.total).to.equal(1)
       }
 
-      {
-        const { data } = await commands[2].getFollowers({ state: 'rejected' })
-        expect(data).to.have.lengthOf(1)
-        expectStartWith(data[0].follower.url, servers[0].url)
+      await commands[2].rejectFollower({ follower: 'peertube@' + servers[0].host })
+      await waitJobs(servers)
+
+      { // server 1
+        {
+          const { data } = await commands[0].getFollowings({ state: 'accepted' })
+          expect(data).to.have.lengthOf(1)
+        }
+
+        {
+          const { data } = await commands[0].getFollowings({ state: 'rejected' })
+          expect(data).to.have.lengthOf(1)
+          expectStartWith(data[0].following.url, servers[2].url)
+        }
       }
-    }
+
+      { // server 3
+        {
+          const { data } = await commands[2].getFollowers({ state: 'accepted' })
+          expect(data).to.have.lengthOf(0)
+        }
+
+        {
+          const { data } = await commands[2].getFollowers({ state: 'rejected' })
+          expect(data).to.have.lengthOf(1)
+          expectStartWith(data[0].follower.url, servers[0].url)
+        }
+      }
+    })
+
+    it('Should still auto accept channel followers', async function () {
+      await commands[0].follow({ handles: [ 'root_channel@' + servers[1].host ] })
+
+      await waitJobs(servers)
+
+      const body = await commands[0].getFollowings()
+      const follow = body.data[0]
+      expect(follow.following.name).to.equal('root_channel')
+      expect(follow.state).to.equal('accepted')
+    })
   })
 
-  it('Should not change the follow on refollow with and without auto accept', async function () {
-    const run = async () => {
-      await commands[0].follow({ hosts: [ servers[2].url ] })
+  describe('Accept/reject state', function () {
+
+    it('Should not change the follow on refollow with and without auto accept', async function () {
+      const run = async () => {
+        await commands[0].follow({ hosts: [ servers[2].url ] })
+        await waitJobs(servers)
+
+        await checkFollows({
+          follower: servers[0],
+          followerState: 'rejected',
+          following: servers[2],
+          followingState: 'rejected'
+        })
+      }
+
+      await servers[2].config.updateExistingSubConfig({ newConfig: { followers: { instance: { manualApproval: false } } } })
+      await run()
+
+      await servers[2].config.updateExistingSubConfig({ newConfig: { followers: { instance: { manualApproval: true } } } })
+      await run()
+    })
+
+    it('Should not change the rejected status on unfollow', async function () {
+      await commands[0].unfollow({ target: servers[2] })
       await waitJobs(servers)
 
       await checkFollows({
         follower: servers[0],
-        followerState: 'rejected',
+        followerState: 'deleted',
         following: servers[2],
         followingState: 'rejected'
       })
-    }
-
-    await servers[2].config.updateExistingSubConfig({ newConfig: { followers: { instance: { manualApproval: false } } } })
-    await run()
-
-    await servers[2].config.updateExistingSubConfig({ newConfig: { followers: { instance: { manualApproval: true } } } })
-    await run()
-  })
-
-  it('Should not change the rejected status on unfollow', async function () {
-    await commands[0].unfollow({ target: servers[2] })
-    await waitJobs(servers)
-
-    await checkFollows({
-      follower: servers[0],
-      followerState: 'deleted',
-      following: servers[2],
-      followingState: 'rejected'
     })
-  })
 
-  it('Should delete the follower and add again the follower', async function () {
-    await commands[2].removeFollower({ follower: servers[0] })
-    await waitJobs(servers)
+    it('Should delete the follower and add again the follower', async function () {
+      await commands[2].removeFollower({ follower: servers[0] })
+      await waitJobs(servers)
 
-    await commands[0].follow({ hosts: [ servers[2].url ] })
-    await waitJobs(servers)
+      await commands[0].follow({ hosts: [ servers[2].url ] })
+      await waitJobs(servers)
 
-    await checkFollows({
-      follower: servers[0],
-      followerState: 'pending',
-      following: servers[2],
-      followingState: 'pending'
+      await checkFollows({
+        follower: servers[0],
+        followerState: 'pending',
+        following: servers[2],
+        followingState: 'pending'
+      })
     })
-  })
 
-  it('Should be able to reject a previously accepted follower', async function () {
-    await commands[1].rejectFollower({ follower: 'peertube@' + servers[0].host })
-    await waitJobs(servers)
+    it('Should be able to reject a previously accepted follower', async function () {
+      await commands[1].rejectFollower({ follower: 'peertube@' + servers[0].host })
+      await waitJobs(servers)
 
-    await checkFollows({
-      follower: servers[0],
-      followerState: 'rejected',
-      following: servers[1],
-      followingState: 'rejected'
+      await checkFollows({
+        follower: servers[0],
+        followerState: 'rejected',
+        following: servers[1],
+        followingState: 'rejected'
+      })
     })
-  })
 
-  it('Should be able to re accept a previously rejected follower', async function () {
-    await commands[1].acceptFollower({ follower: 'peertube@' + servers[0].host })
-    await waitJobs(servers)
+    it('Should be able to re accept a previously rejected follower', async function () {
+      await commands[1].acceptFollower({ follower: 'peertube@' + servers[0].host })
+      await waitJobs(servers)
 
-    await checkFollows({
-      follower: servers[0],
-      followerState: 'accepted',
-      following: servers[1],
-      followingState: 'accepted'
+      await checkFollows({
+        follower: servers[0],
+        followerState: 'accepted',
+        following: servers[1],
+        followingState: 'accepted'
+      })
     })
   })
 
-  it('Should ignore follow requests of muted servers', async function () {
-    await servers[1].blocklist.addToServerBlocklist({ server: servers[0].host })
+  describe('Muted servers', function () {
 
-    await commands[0].unfollow({ target: servers[1] })
+    it('Should ignore follow requests of muted servers', async function () {
+      await servers[1].blocklist.addToServerBlocklist({ server: servers[0].host })
 
-    await waitJobs(servers)
+      await commands[0].unfollow({ target: servers[1] })
 
-    await checkFollows({
-      follower: servers[0],
-      followerState: 'deleted',
-      following: servers[1],
-      followingState: 'deleted'
-    })
+      await waitJobs(servers)
+
+      await checkFollows({
+        follower: servers[0],
+        followerState: 'deleted',
+        following: servers[1],
+        followingState: 'deleted'
+      })
 
-    await commands[0].follow({ hosts: [ servers[1].host ] })
-    await waitJobs(servers)
+      await commands[0].follow({ hosts: [ servers[1].host ] })
+      await waitJobs(servers)
 
-    await checkFollows({
-      follower: servers[0],
-      followerState: 'rejected',
-      following: servers[1],
-      followingState: 'deleted'
+      await checkFollows({
+        follower: servers[0],
+        followerState: 'rejected',
+        following: servers[1],
+        followingState: 'deleted'
+      })
     })
   })
 
index 894a49f984d035ef913e77f49c94a1fe16d31403..fbeca7d67cac4e0ef57236ce752114e9ac97c7c8 100644 (file)
@@ -53,310 +53,292 @@ describe('Test users subscriptions', function () {
     command = servers[0].subscriptions
   })
 
-  it('Should display videos of server 2 on server 1', async function () {
-    const { total } = await servers[0].videos.list()
+  describe('Destinction between server videos and user videos', function () {
+    it('Should display videos of server 2 on server 1', async function () {
+      const { total } = await servers[0].videos.list()
 
-    expect(total).to.equal(4)
-  })
+      expect(total).to.equal(4)
+    })
 
-  it('User of server 1 should follow user of server 3 and root of server 1', async function () {
-    this.timeout(60000)
+    it('User of server 1 should follow user of server 3 and root of server 1', async function () {
+      this.timeout(60000)
 
-    await command.add({ token: users[0].accessToken, targetUri: 'user3_channel@localhost:' + servers[2].port })
-    await command.add({ token: users[0].accessToken, targetUri: 'root_channel@localhost:' + servers[0].port })
+      await command.add({ token: users[0].accessToken, targetUri: 'user3_channel@localhost:' + servers[2].port })
+      await command.add({ token: users[0].accessToken, targetUri: 'root_channel@localhost:' + servers[0].port })
 
-    await waitJobs(servers)
+      await waitJobs(servers)
 
-    const attributes = { name: 'video server 3 added after follow' }
-    const { uuid } = await servers[2].videos.upload({ token: users[2].accessToken, attributes })
-    video3UUID = uuid
+      const attributes = { name: 'video server 3 added after follow' }
+      const { uuid } = await servers[2].videos.upload({ token: users[2].accessToken, attributes })
+      video3UUID = uuid
 
-    await waitJobs(servers)
-  })
+      await waitJobs(servers)
+    })
 
-  it('Should not display videos of server 3 on server 1', async function () {
-    const { total, data } = await servers[0].videos.list()
-    expect(total).to.equal(4)
+    it('Should not display videos of server 3 on server 1', async function () {
+      const { total, data } = await servers[0].videos.list()
+      expect(total).to.equal(4)
 
-    for (const video of data) {
-      expect(video.name).to.not.contain('1-3')
-      expect(video.name).to.not.contain('2-3')
-      expect(video.name).to.not.contain('video server 3 added after follow')
-    }
+      for (const video of data) {
+        expect(video.name).to.not.contain('1-3')
+        expect(video.name).to.not.contain('2-3')
+        expect(video.name).to.not.contain('video server 3 added after follow')
+      }
+    })
   })
 
-  it('Should list subscriptions', async function () {
-    {
-      const body = await command.list()
-      expect(body.total).to.equal(0)
-      expect(body.data).to.be.an('array')
-      expect(body.data).to.have.lengthOf(0)
-    }
+  describe('Subscription endpoints', function () {
 
-    {
-      const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
-      expect(body.total).to.equal(2)
+    it('Should list subscriptions', async function () {
+      {
+        const body = await command.list()
+        expect(body.total).to.equal(0)
+        expect(body.data).to.be.an('array')
+        expect(body.data).to.have.lengthOf(0)
+      }
 
-      const subscriptions = body.data
-      expect(subscriptions).to.be.an('array')
-      expect(subscriptions).to.have.lengthOf(2)
+      {
+        const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
+        expect(body.total).to.equal(2)
 
-      expect(subscriptions[0].name).to.equal('user3_channel')
-      expect(subscriptions[1].name).to.equal('root_channel')
-    }
-  })
-
-  it('Should get subscription', async function () {
-    {
-      const videoChannel = await command.get({ token: users[0].accessToken, uri: 'user3_channel@localhost:' + servers[2].port })
+        const subscriptions = body.data
+        expect(subscriptions).to.be.an('array')
+        expect(subscriptions).to.have.lengthOf(2)
 
-      expect(videoChannel.name).to.equal('user3_channel')
-      expect(videoChannel.host).to.equal('localhost:' + servers[2].port)
-      expect(videoChannel.displayName).to.equal('Main user3 channel')
-      expect(videoChannel.followingCount).to.equal(0)
-      expect(videoChannel.followersCount).to.equal(1)
-    }
+        expect(subscriptions[0].name).to.equal('user3_channel')
+        expect(subscriptions[1].name).to.equal('root_channel')
+      }
+    })
 
-    {
-      const videoChannel = await command.get({ token: users[0].accessToken, uri: 'root_channel@localhost:' + servers[0].port })
+    it('Should get subscription', async function () {
+      {
+        const videoChannel = await command.get({ token: users[0].accessToken, uri: 'user3_channel@localhost:' + servers[2].port })
 
-      expect(videoChannel.name).to.equal('root_channel')
-      expect(videoChannel.host).to.equal('localhost:' + servers[0].port)
-      expect(videoChannel.displayName).to.equal('Main root channel')
-      expect(videoChannel.followingCount).to.equal(0)
-      expect(videoChannel.followersCount).to.equal(1)
-    }
-  })
+        expect(videoChannel.name).to.equal('user3_channel')
+        expect(videoChannel.host).to.equal('localhost:' + servers[2].port)
+        expect(videoChannel.displayName).to.equal('Main user3 channel')
+        expect(videoChannel.followingCount).to.equal(0)
+        expect(videoChannel.followersCount).to.equal(1)
+      }
 
-  it('Should return the existing subscriptions', async function () {
-    const uris = [
-      'user3_channel@localhost:' + servers[2].port,
-      'root2_channel@localhost:' + servers[0].port,
-      'root_channel@localhost:' + servers[0].port,
-      'user3_channel@localhost:' + servers[0].port
-    ]
+      {
+        const videoChannel = await command.get({ token: users[0].accessToken, uri: 'root_channel@localhost:' + servers[0].port })
 
-    const body = await command.exist({ token: users[0].accessToken, uris })
+        expect(videoChannel.name).to.equal('root_channel')
+        expect(videoChannel.host).to.equal('localhost:' + servers[0].port)
+        expect(videoChannel.displayName).to.equal('Main root channel')
+        expect(videoChannel.followingCount).to.equal(0)
+        expect(videoChannel.followersCount).to.equal(1)
+      }
+    })
+
+    it('Should return the existing subscriptions', async function () {
+      const uris = [
+        'user3_channel@localhost:' + servers[2].port,
+        'root2_channel@localhost:' + servers[0].port,
+        'root_channel@localhost:' + servers[0].port,
+        'user3_channel@localhost:' + servers[0].port
+      ]
+
+      const body = await command.exist({ token: users[0].accessToken, uris })
+
+      expect(body['user3_channel@localhost:' + servers[2].port]).to.be.true
+      expect(body['root2_channel@localhost:' + servers[0].port]).to.be.false
+      expect(body['root_channel@localhost:' + servers[0].port]).to.be.true
+      expect(body['user3_channel@localhost:' + servers[0].port]).to.be.false
+    })
+
+    it('Should search among subscriptions', async function () {
+      {
+        const body = await command.list({ token: users[0].accessToken, sort: '-createdAt', search: 'user3_channel' })
+        expect(body.total).to.equal(1)
+        expect(body.data).to.have.lengthOf(1)
+      }
 
-    expect(body['user3_channel@localhost:' + servers[2].port]).to.be.true
-    expect(body['root2_channel@localhost:' + servers[0].port]).to.be.false
-    expect(body['root_channel@localhost:' + servers[0].port]).to.be.true
-    expect(body['user3_channel@localhost:' + servers[0].port]).to.be.false
+      {
+        const body = await command.list({ token: users[0].accessToken, sort: '-createdAt', search: 'toto' })
+        expect(body.total).to.equal(0)
+        expect(body.data).to.have.lengthOf(0)
+      }
+    })
   })
 
-  it('Should search among subscriptions', async function () {
-    {
-      const body = await command.list({ token: users[0].accessToken, sort: '-createdAt', search: 'user3_channel' })
-      expect(body.total).to.equal(1)
-      expect(body.data).to.have.lengthOf(1)
-    }
+  describe('Subscription videos', function () {
 
-    {
-      const body = await command.list({ token: users[0].accessToken, sort: '-createdAt', search: 'toto' })
-      expect(body.total).to.equal(0)
-      expect(body.data).to.have.lengthOf(0)
-    }
-  })
-
-  it('Should list subscription videos', async function () {
-    {
-      const body = await command.listVideos()
-      expect(body.total).to.equal(0)
-      expect(body.data).to.be.an('array')
-      expect(body.data).to.have.lengthOf(0)
-    }
+    it('Should list subscription videos', async function () {
+      {
+        const body = await command.listVideos()
+        expect(body.total).to.equal(0)
+        expect(body.data).to.be.an('array')
+        expect(body.data).to.have.lengthOf(0)
+      }
 
-    {
-      const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
-      expect(body.total).to.equal(3)
+      {
+        const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
+        expect(body.total).to.equal(3)
 
-      const videos = body.data
-      expect(videos).to.be.an('array')
-      expect(videos).to.have.lengthOf(3)
+        const videos = body.data
+        expect(videos).to.be.an('array')
+        expect(videos).to.have.lengthOf(3)
 
-      expect(videos[0].name).to.equal('video 1-3')
-      expect(videos[1].name).to.equal('video 2-3')
-      expect(videos[2].name).to.equal('video server 3 added after follow')
-    }
-  })
+        expect(videos[0].name).to.equal('video 1-3')
+        expect(videos[1].name).to.equal('video 2-3')
+        expect(videos[2].name).to.equal('video server 3 added after follow')
+      }
+    })
 
-  it('Should upload a video by root on server 1 and see it in the subscription videos', async function () {
-    this.timeout(60000)
+    it('Should upload a video by root on server 1 and see it in the subscription videos', async function () {
+      this.timeout(60000)
 
-    const videoName = 'video server 1 added after follow'
-    await servers[0].videos.upload({ attributes: { name: videoName } })
+      const videoName = 'video server 1 added after follow'
+      await servers[0].videos.upload({ attributes: { name: videoName } })
 
-    await waitJobs(servers)
+      await waitJobs(servers)
 
-    {
-      const body = await command.listVideos()
-      expect(body.total).to.equal(0)
-      expect(body.data).to.be.an('array')
-      expect(body.data).to.have.lengthOf(0)
-    }
+      {
+        const body = await command.listVideos()
+        expect(body.total).to.equal(0)
+        expect(body.data).to.be.an('array')
+        expect(body.data).to.have.lengthOf(0)
+      }
 
-    {
-      const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
-      expect(body.total).to.equal(4)
+      {
+        const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
+        expect(body.total).to.equal(4)
 
-      const videos = body.data
-      expect(videos).to.be.an('array')
-      expect(videos).to.have.lengthOf(4)
+        const videos = body.data
+        expect(videos).to.be.an('array')
+        expect(videos).to.have.lengthOf(4)
 
-      expect(videos[0].name).to.equal('video 1-3')
-      expect(videos[1].name).to.equal('video 2-3')
-      expect(videos[2].name).to.equal('video server 3 added after follow')
-      expect(videos[3].name).to.equal('video server 1 added after follow')
-    }
+        expect(videos[0].name).to.equal('video 1-3')
+        expect(videos[1].name).to.equal('video 2-3')
+        expect(videos[2].name).to.equal('video server 3 added after follow')
+        expect(videos[3].name).to.equal('video server 1 added after follow')
+      }
 
-    {
-      const { data, total } = await servers[0].videos.list()
-      expect(total).to.equal(5)
+      {
+        const { data, total } = await servers[0].videos.list()
+        expect(total).to.equal(5)
 
-      for (const video of data) {
-        expect(video.name).to.not.contain('1-3')
-        expect(video.name).to.not.contain('2-3')
-        expect(video.name).to.not.contain('video server 3 added after follow')
+        for (const video of data) {
+          expect(video.name).to.not.contain('1-3')
+          expect(video.name).to.not.contain('2-3')
+          expect(video.name).to.not.contain('video server 3 added after follow')
+        }
       }
-    }
-  })
+    })
 
-  it('Should have server 1 follow server 3 and display server 3 videos', async function () {
-    this.timeout(60000)
+    it('Should have server 1 following server 3 and display server 3 videos', async function () {
+      this.timeout(60000)
 
-    await servers[0].follows.follow({ hosts: [ servers[2].url ] })
+      await servers[0].follows.follow({ hosts: [ servers[2].url ] })
 
-    await waitJobs(servers)
-
-    const { data, total } = await servers[0].videos.list()
-    expect(total).to.equal(8)
+      await waitJobs(servers)
 
-    const names = [ '1-3', '2-3', 'video server 3 added after follow' ]
-    for (const name of names) {
-      const video = data.find(v => v.name.includes(name))
-      expect(video).to.not.be.undefined
-    }
-  })
+      const { data, total } = await servers[0].videos.list()
+      expect(total).to.equal(8)
 
-  it('Should remove follow server 1 -> server 3 and hide server 3 videos', async function () {
-    this.timeout(60000)
+      const names = [ '1-3', '2-3', 'video server 3 added after follow' ]
+      for (const name of names) {
+        const video = data.find(v => v.name.includes(name))
+        expect(video).to.not.be.undefined
+      }
+    })
 
-    await servers[0].follows.unfollow({ target: servers[2] })
+    it('Should remove follow server 1 -> server 3 and hide server 3 videos', async function () {
+      this.timeout(60000)
 
-    await waitJobs(servers)
+      await servers[0].follows.unfollow({ target: servers[2] })
 
-    const { total, data } = await servers[0].videos.list()
-    expect(total).to.equal(5)
+      await waitJobs(servers)
 
-    for (const video of data) {
-      expect(video.name).to.not.contain('1-3')
-      expect(video.name).to.not.contain('2-3')
-      expect(video.name).to.not.contain('video server 3 added after follow')
-    }
-  })
+      const { total, data } = await servers[0].videos.list()
+      expect(total).to.equal(5)
 
-  it('Should still list subscription videos', async function () {
-    {
-      const body = await command.listVideos()
-      expect(body.total).to.equal(0)
-      expect(body.data).to.be.an('array')
-      expect(body.data).to.have.lengthOf(0)
-    }
+      for (const video of data) {
+        expect(video.name).to.not.contain('1-3')
+        expect(video.name).to.not.contain('2-3')
+        expect(video.name).to.not.contain('video server 3 added after follow')
+      }
+    })
+
+    it('Should still list subscription videos', async function () {
+      {
+        const body = await command.listVideos()
+        expect(body.total).to.equal(0)
+        expect(body.data).to.be.an('array')
+        expect(body.data).to.have.lengthOf(0)
+      }
 
-    {
-      const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
-      expect(body.total).to.equal(4)
+      {
+        const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
+        expect(body.total).to.equal(4)
 
-      const videos = body.data
-      expect(videos).to.be.an('array')
-      expect(videos).to.have.lengthOf(4)
+        const videos = body.data
+        expect(videos).to.be.an('array')
+        expect(videos).to.have.lengthOf(4)
 
-      expect(videos[0].name).to.equal('video 1-3')
-      expect(videos[1].name).to.equal('video 2-3')
-      expect(videos[2].name).to.equal('video server 3 added after follow')
-      expect(videos[3].name).to.equal('video server 1 added after follow')
-    }
+        expect(videos[0].name).to.equal('video 1-3')
+        expect(videos[1].name).to.equal('video 2-3')
+        expect(videos[2].name).to.equal('video server 3 added after follow')
+        expect(videos[3].name).to.equal('video server 1 added after follow')
+      }
+    })
   })
 
-  it('Should update a video of server 3 and see the updated video on server 1', async function () {
-    this.timeout(30000)
-
-    await servers[2].videos.update({ id: video3UUID, attributes: { name: 'video server 3 added after follow updated' } })
-
-    await waitJobs(servers)
+  describe('Existing subscription video update', function () {
 
-    const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
-    expect(body.data[2].name).to.equal('video server 3 added after follow updated')
-  })
+    it('Should update a video of server 3 and see the updated video on server 1', async function () {
+      this.timeout(30000)
 
-  it('Should remove user of server 3 subscription', async function () {
-    this.timeout(30000)
+      await servers[2].videos.update({ id: video3UUID, attributes: { name: 'video server 3 added after follow updated' } })
 
-    await command.remove({ token: users[0].accessToken, uri: 'user3_channel@localhost:' + servers[2].port })
+      await waitJobs(servers)
 
-    await waitJobs(servers)
+      const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
+      expect(body.data[2].name).to.equal('video server 3 added after follow updated')
+    })
   })
 
-  it('Should not display its videos anymore', async function () {
-    const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
-    expect(body.total).to.equal(1)
+  describe('Subscription removal', function () {
 
-    const videos = body.data
-    expect(videos).to.be.an('array')
-    expect(videos).to.have.lengthOf(1)
-
-    expect(videos[0].name).to.equal('video server 1 added after follow')
-  })
+    it('Should remove user of server 3 subscription', async function () {
+      this.timeout(30000)
 
-  it('Should remove the root subscription and not display the videos anymore', async function () {
-    this.timeout(30000)
+      await command.remove({ token: users[0].accessToken, uri: 'user3_channel@localhost:' + servers[2].port })
 
-    await command.remove({ token: users[0].accessToken, uri: 'root_channel@localhost:' + servers[0].port })
+      await waitJobs(servers)
+    })
 
-    await waitJobs(servers)
-
-    {
-      const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
-      expect(body.total).to.equal(0)
+    it('Should not display its videos anymore', async function () {
+      const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
+      expect(body.total).to.equal(1)
 
       const videos = body.data
       expect(videos).to.be.an('array')
-      expect(videos).to.have.lengthOf(0)
-    }
-  })
+      expect(videos).to.have.lengthOf(1)
 
-  it('Should correctly display public videos on server 1', async function () {
-    const { total, data } = await servers[0].videos.list()
-    expect(total).to.equal(5)
+      expect(videos[0].name).to.equal('video server 1 added after follow')
+    })
 
-    for (const video of data) {
-      expect(video.name).to.not.contain('1-3')
-      expect(video.name).to.not.contain('2-3')
-      expect(video.name).to.not.contain('video server 3 added after follow updated')
-    }
-  })
+    it('Should remove the root subscription and not display the videos anymore', async function () {
+      this.timeout(30000)
 
-  it('Should follow user of server 3 again', async function () {
-    this.timeout(60000)
+      await command.remove({ token: users[0].accessToken, uri: 'root_channel@localhost:' + servers[0].port })
 
-    await command.add({ token: users[0].accessToken, targetUri: 'user3_channel@localhost:' + servers[2].port })
+      await waitJobs(servers)
 
-    await waitJobs(servers)
+      {
+        const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
+        expect(body.total).to.equal(0)
 
-    {
-      const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
-      expect(body.total).to.equal(3)
-
-      const videos = body.data
-      expect(videos).to.be.an('array')
-      expect(videos).to.have.lengthOf(3)
-
-      expect(videos[0].name).to.equal('video 1-3')
-      expect(videos[1].name).to.equal('video 2-3')
-      expect(videos[2].name).to.equal('video server 3 added after follow updated')
-    }
+        const videos = body.data
+        expect(videos).to.be.an('array')
+        expect(videos).to.have.lengthOf(0)
+      }
+    })
 
-    {
+    it('Should correctly display public videos on server 1', async function () {
       const { total, data } = await servers[0].videos.list()
       expect(total).to.equal(5)
 
@@ -365,213 +347,254 @@ describe('Test users subscriptions', function () {
         expect(video.name).to.not.contain('2-3')
         expect(video.name).to.not.contain('video server 3 added after follow updated')
       }
-    }
+    })
   })
 
-  it('Should follow user channels of server 3 by root of server 3', async function () {
-    this.timeout(60000)
+  describe('Re-follow', function () {
 
-    await servers[2].channels.create({ token: users[2].accessToken, attributes: { name: 'user3_channel2' } })
+    it('Should follow user of server 3 again', async function () {
+      this.timeout(60000)
 
-    await servers[2].subscriptions.add({ token: servers[2].accessToken, targetUri: 'user3_channel@localhost:' + servers[2].port })
-    await servers[2].subscriptions.add({ token: servers[2].accessToken, targetUri: 'user3_channel2@localhost:' + servers[2].port })
+      await command.add({ token: users[0].accessToken, targetUri: 'user3_channel@localhost:' + servers[2].port })
 
-    await waitJobs(servers)
-  })
+      await waitJobs(servers)
 
-  it('Should list user 3 followers', async function () {
-    {
-      const { total, data } = await servers[2].accounts.listFollowers({
-        token: users[2].accessToken,
-        accountName: 'user3',
-        start: 0,
-        count: 5,
-        sort: 'createdAt'
-      })
-
-      expect(total).to.equal(3)
-      expect(data).to.have.lengthOf(3)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel')
-      expect(data[0].follower.host).to.equal(servers[0].host)
-      expect(data[0].follower.name).to.equal('user1')
-
-      expect(data[1].following.host).to.equal(servers[2].host)
-      expect(data[1].following.name).to.equal('user3_channel')
-      expect(data[1].follower.host).to.equal(servers[2].host)
-      expect(data[1].follower.name).to.equal('root')
-
-      expect(data[2].following.host).to.equal(servers[2].host)
-      expect(data[2].following.name).to.equal('user3_channel2')
-      expect(data[2].follower.host).to.equal(servers[2].host)
-      expect(data[2].follower.name).to.equal('root')
-    }
+      {
+        const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
+        expect(body.total).to.equal(3)
 
-    {
-      const { total, data } = await servers[2].accounts.listFollowers({
-        token: users[2].accessToken,
-        accountName: 'user3',
-        start: 0,
-        count: 1,
-        sort: '-createdAt'
-      })
-
-      expect(total).to.equal(3)
-      expect(data).to.have.lengthOf(1)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel2')
-      expect(data[0].follower.host).to.equal(servers[2].host)
-      expect(data[0].follower.name).to.equal('root')
-    }
+        const videos = body.data
+        expect(videos).to.be.an('array')
+        expect(videos).to.have.lengthOf(3)
 
-    {
-      const { total, data } = await servers[2].accounts.listFollowers({
-        token: users[2].accessToken,
-        accountName: 'user3',
-        start: 1,
-        count: 1,
-        sort: '-createdAt'
-      })
-
-      expect(total).to.equal(3)
-      expect(data).to.have.lengthOf(1)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel')
-      expect(data[0].follower.host).to.equal(servers[2].host)
-      expect(data[0].follower.name).to.equal('root')
-    }
+        expect(videos[0].name).to.equal('video 1-3')
+        expect(videos[1].name).to.equal('video 2-3')
+        expect(videos[2].name).to.equal('video server 3 added after follow updated')
+      }
 
-    {
-      const { total, data } = await servers[2].accounts.listFollowers({
-        token: users[2].accessToken,
-        accountName: 'user3',
-        search: 'user1',
-        sort: '-createdAt'
-      })
-
-      expect(total).to.equal(1)
-      expect(data).to.have.lengthOf(1)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel')
-      expect(data[0].follower.host).to.equal(servers[0].host)
-      expect(data[0].follower.name).to.equal('user1')
-    }
-  })
+      {
+        const { total, data } = await servers[0].videos.list()
+        expect(total).to.equal(5)
 
-  it('Should list user3_channel followers', async function () {
-    {
-      const { total, data } = await servers[2].channels.listFollowers({
-        token: users[2].accessToken,
-        channelName: 'user3_channel',
-        start: 0,
-        count: 5,
-        sort: 'createdAt'
-      })
-
-      expect(total).to.equal(2)
-      expect(data).to.have.lengthOf(2)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel')
-      expect(data[0].follower.host).to.equal(servers[0].host)
-      expect(data[0].follower.name).to.equal('user1')
-
-      expect(data[1].following.host).to.equal(servers[2].host)
-      expect(data[1].following.name).to.equal('user3_channel')
-      expect(data[1].follower.host).to.equal(servers[2].host)
-      expect(data[1].follower.name).to.equal('root')
-    }
+        for (const video of data) {
+          expect(video.name).to.not.contain('1-3')
+          expect(video.name).to.not.contain('2-3')
+          expect(video.name).to.not.contain('video server 3 added after follow updated')
+        }
+      }
+    })
 
-    {
-      const { total, data } = await servers[2].channels.listFollowers({
-        token: users[2].accessToken,
-        channelName: 'user3_channel',
-        start: 0,
-        count: 1,
-        sort: '-createdAt'
-      })
-
-      expect(total).to.equal(2)
-      expect(data).to.have.lengthOf(1)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel')
-      expect(data[0].follower.host).to.equal(servers[2].host)
-      expect(data[0].follower.name).to.equal('root')
-    }
+    it('Should follow user channels of server 3 by root of server 3', async function () {
+      this.timeout(60000)
 
-    {
-      const { total, data } = await servers[2].channels.listFollowers({
-        token: users[2].accessToken,
-        channelName: 'user3_channel',
-        start: 1,
-        count: 1,
-        sort: '-createdAt'
-      })
-
-      expect(total).to.equal(2)
-      expect(data).to.have.lengthOf(1)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel')
-      expect(data[0].follower.host).to.equal(servers[0].host)
-      expect(data[0].follower.name).to.equal('user1')
-    }
+      await servers[2].channels.create({ token: users[2].accessToken, attributes: { name: 'user3_channel2' } })
 
-    {
-      const { total, data } = await servers[2].channels.listFollowers({
-        token: users[2].accessToken,
-        channelName: 'user3_channel',
-        search: 'user1',
-        sort: '-createdAt'
-      })
-
-      expect(total).to.equal(1)
-      expect(data).to.have.lengthOf(1)
-
-      expect(data[0].following.host).to.equal(servers[2].host)
-      expect(data[0].following.name).to.equal('user3_channel')
-      expect(data[0].follower.host).to.equal(servers[0].host)
-      expect(data[0].follower.name).to.equal('user1')
-    }
+      await servers[2].subscriptions.add({ token: servers[2].accessToken, targetUri: 'user3_channel@localhost:' + servers[2].port })
+      await servers[2].subscriptions.add({ token: servers[2].accessToken, targetUri: 'user3_channel2@localhost:' + servers[2].port })
+
+      await waitJobs(servers)
+    })
   })
 
-  it('Should update video as internal and not see from remote server', async function () {
-    this.timeout(30000)
+  describe('Followers listing', function () {
+
+    it('Should list user 3 followers', async function () {
+      {
+        const { total, data } = await servers[2].accounts.listFollowers({
+          token: users[2].accessToken,
+          accountName: 'user3',
+          start: 0,
+          count: 5,
+          sort: 'createdAt'
+        })
+
+        expect(total).to.equal(3)
+        expect(data).to.have.lengthOf(3)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel')
+        expect(data[0].follower.host).to.equal(servers[0].host)
+        expect(data[0].follower.name).to.equal('user1')
+
+        expect(data[1].following.host).to.equal(servers[2].host)
+        expect(data[1].following.name).to.equal('user3_channel')
+        expect(data[1].follower.host).to.equal(servers[2].host)
+        expect(data[1].follower.name).to.equal('root')
+
+        expect(data[2].following.host).to.equal(servers[2].host)
+        expect(data[2].following.name).to.equal('user3_channel2')
+        expect(data[2].follower.host).to.equal(servers[2].host)
+        expect(data[2].follower.name).to.equal('root')
+      }
 
-    await servers[2].videos.update({ id: video3UUID, attributes: { name: 'internal', privacy: VideoPrivacy.INTERNAL } })
-    await waitJobs(servers)
+      {
+        const { total, data } = await servers[2].accounts.listFollowers({
+          token: users[2].accessToken,
+          accountName: 'user3',
+          start: 0,
+          count: 1,
+          sort: '-createdAt'
+        })
+
+        expect(total).to.equal(3)
+        expect(data).to.have.lengthOf(1)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel2')
+        expect(data[0].follower.host).to.equal(servers[2].host)
+        expect(data[0].follower.name).to.equal('root')
+      }
 
-    {
-      const { data } = await command.listVideos({ token: users[0].accessToken })
-      expect(data.find(v => v.name === 'internal')).to.not.exist
-    }
-  })
+      {
+        const { total, data } = await servers[2].accounts.listFollowers({
+          token: users[2].accessToken,
+          accountName: 'user3',
+          start: 1,
+          count: 1,
+          sort: '-createdAt'
+        })
+
+        expect(total).to.equal(3)
+        expect(data).to.have.lengthOf(1)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel')
+        expect(data[0].follower.host).to.equal(servers[2].host)
+        expect(data[0].follower.name).to.equal('root')
+      }
 
-  it('Should see internal from local user', async function () {
-    const { data } = await servers[2].subscriptions.listVideos({ token: servers[2].accessToken })
-    expect(data.find(v => v.name === 'internal')).to.exist
+      {
+        const { total, data } = await servers[2].accounts.listFollowers({
+          token: users[2].accessToken,
+          accountName: 'user3',
+          search: 'user1',
+          sort: '-createdAt'
+        })
+
+        expect(total).to.equal(1)
+        expect(data).to.have.lengthOf(1)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel')
+        expect(data[0].follower.host).to.equal(servers[0].host)
+        expect(data[0].follower.name).to.equal('user1')
+      }
+    })
+
+    it('Should list user3_channel followers', async function () {
+      {
+        const { total, data } = await servers[2].channels.listFollowers({
+          token: users[2].accessToken,
+          channelName: 'user3_channel',
+          start: 0,
+          count: 5,
+          sort: 'createdAt'
+        })
+
+        expect(total).to.equal(2)
+        expect(data).to.have.lengthOf(2)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel')
+        expect(data[0].follower.host).to.equal(servers[0].host)
+        expect(data[0].follower.name).to.equal('user1')
+
+        expect(data[1].following.host).to.equal(servers[2].host)
+        expect(data[1].following.name).to.equal('user3_channel')
+        expect(data[1].follower.host).to.equal(servers[2].host)
+        expect(data[1].follower.name).to.equal('root')
+      }
+
+      {
+        const { total, data } = await servers[2].channels.listFollowers({
+          token: users[2].accessToken,
+          channelName: 'user3_channel',
+          start: 0,
+          count: 1,
+          sort: '-createdAt'
+        })
+
+        expect(total).to.equal(2)
+        expect(data).to.have.lengthOf(1)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel')
+        expect(data[0].follower.host).to.equal(servers[2].host)
+        expect(data[0].follower.name).to.equal('root')
+      }
+
+      {
+        const { total, data } = await servers[2].channels.listFollowers({
+          token: users[2].accessToken,
+          channelName: 'user3_channel',
+          start: 1,
+          count: 1,
+          sort: '-createdAt'
+        })
+
+        expect(total).to.equal(2)
+        expect(data).to.have.lengthOf(1)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel')
+        expect(data[0].follower.host).to.equal(servers[0].host)
+        expect(data[0].follower.name).to.equal('user1')
+      }
+
+      {
+        const { total, data } = await servers[2].channels.listFollowers({
+          token: users[2].accessToken,
+          channelName: 'user3_channel',
+          search: 'user1',
+          sort: '-createdAt'
+        })
+
+        expect(total).to.equal(1)
+        expect(data).to.have.lengthOf(1)
+
+        expect(data[0].following.host).to.equal(servers[2].host)
+        expect(data[0].following.name).to.equal('user3_channel')
+        expect(data[0].follower.host).to.equal(servers[0].host)
+        expect(data[0].follower.name).to.equal('user1')
+      }
+    })
   })
 
-  it('Should update video as private and not see from anyone server', async function () {
-    this.timeout(30000)
+  describe('Subscription videos privacy', function () {
 
-    await servers[2].videos.update({ id: video3UUID, attributes: { name: 'private', privacy: VideoPrivacy.PRIVATE } })
-    await waitJobs(servers)
+    it('Should update video as internal and not see from remote server', async function () {
+      this.timeout(30000)
 
-    {
-      const { data } = await command.listVideos({ token: users[0].accessToken })
-      expect(data.find(v => v.name === 'private')).to.not.exist
-    }
+      await servers[2].videos.update({ id: video3UUID, attributes: { name: 'internal', privacy: VideoPrivacy.INTERNAL } })
+      await waitJobs(servers)
 
-    {
+      {
+        const { data } = await command.listVideos({ token: users[0].accessToken })
+        expect(data.find(v => v.name === 'internal')).to.not.exist
+      }
+    })
+
+    it('Should see internal from local user', async function () {
       const { data } = await servers[2].subscriptions.listVideos({ token: servers[2].accessToken })
-      expect(data.find(v => v.name === 'private')).to.not.exist
-    }
+      expect(data.find(v => v.name === 'internal')).to.exist
+    })
+
+    it('Should update video as private and not see from anyone server', async function () {
+      this.timeout(30000)
+
+      await servers[2].videos.update({ id: video3UUID, attributes: { name: 'private', privacy: VideoPrivacy.PRIVATE } })
+      await waitJobs(servers)
+
+      {
+        const { data } = await command.listVideos({ token: users[0].accessToken })
+        expect(data.find(v => v.name === 'private')).to.not.exist
+      }
+
+      {
+        const { data } = await servers[2].subscriptions.listVideos({ token: servers[2].accessToken })
+        expect(data.find(v => v.name === 'private')).to.not.exist
+      }
+    })
   })
 
   after(async function () {