Fix channel follow with manually approved follower

pull/5325/head
Chocobozzz 2022-10-11 13:27:22 +02:00
parent 1593e0dd5c
commit a6b26afc56
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
3 changed files with 668 additions and 619 deletions

View 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'

View 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 ] })
await waitJobs(servers)
})
it('Should have correct follows', async function () {
await checkServer1And2HasFollowers(servers)
})
it('Should remove follower on server 2', async function () {
this.timeout(10000)
await commands[1].removeFollower({ follower: servers[0] })
await waitJobs(servers)
})
it('Should not not have follows anymore', async function () {
await checkNoFollowers(servers)
})
})
it('Should have correct follows', async function () {
await checkServer1And2HasFollowers(servers)
})
describe('Disabled/Enabled followers', function () {
it('Should remove follower on server 2', async function () {
this.timeout(10000)
it('Should disable followers on server 2', async function () {
this.timeout(10000)
await commands[1].removeFollower({ follower: servers[0] })
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)
const subConfig = {
followers: {
instance: {
enabled: false,
manualApproval: false
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 () {
await commands[0].unfollow({ target: servers[1] })
await waitJobs(servers)
it('Should manually approve followers', async function () {
this.timeout(20000)
const subConfig = {
followers: {
instance: {
enabled: true,
manualApproval: true
await commands[0].unfollow({ target: servers[1] })
await waitJobs(servers)
const subConfig = {
followers: {
instance: {
enabled: true,
manualApproval: true
}
}
}
}
await servers[1].config.updateCustomSubConfig({ newConfig: subConfig })
await servers[2].config.updateCustomSubConfig({ newConfig: subConfig })
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 commands[0].follow({ hosts: [ servers[1].url ] })
await waitJobs(servers)
await checkServer1And2HasFollowers(servers, 'pending')
})
await checkServer1And2HasFollowers(servers, 'pending')
})
it('Should accept a follower', async function () {
this.timeout(10000)
it('Should accept a follower', async function () {
this.timeout(10000)
await commands[1].acceptFollower({ follower: 'peertube@' + servers[0].host })
await waitJobs(servers)
await commands[1].acceptFollower({ follower: 'peertube@' + servers[0].host })
await waitJobs(servers)
await checkServer1And2HasFollowers(servers)
})
await checkServer1And2HasFollowers(servers)
})
it('Should reject another follower', async function () {
this.timeout(20000)
it('Should reject another follower', async function () {
this.timeout(20000)
await commands[0].follow({ hosts: [ servers[2].url ] })
await waitJobs(servers)
await commands[0].follow({ hosts: [ servers[2].url ] })
await waitJobs(servers)
{
const body = await commands[0].getFollowings()
expect(body.total).to.equal(2)
}
{
const body = await commands[1].getFollowers()
expect(body.total).to.equal(1)
}
{
const body = await commands[2].getFollowers()
expect(body.total).to.equal(1)
}
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()
expect(body.total).to.equal(2)
}
{
const body = await commands[1].getFollowers()
expect(body.total).to.equal(1)
}
{
const body = await commands[2].getFollowers()
expect(body.total).to.equal(1)
}
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)
}
}
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 () => {
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: '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)
await commands[0].follow({ hosts: [ servers[2].url ] })
await waitJobs(servers)
await checkFollows({
follower: servers[0],
followerState: 'rejected',
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)
await checkFollows({
follower: servers[0],
followerState: 'rejected',
following: servers[1],
followingState: 'rejected'
})
}
})
await servers[2].config.updateExistingSubConfig({ newConfig: { followers: { instance: { manualApproval: false } } } })
await run()
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 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'
await checkFollows({
follower: servers[0],
followerState: 'accepted',
following: servers[1],
followingState: 'accepted'
})
})
})
it('Should delete the follower and add again the follower', async function () {
await commands[2].removeFollower({ follower: servers[0] })
await waitJobs(servers)
describe('Muted servers', function () {
await commands[0].follow({ hosts: [ servers[2].url ] })
await waitJobs(servers)
it('Should ignore follow requests of muted servers', async function () {
await servers[1].blocklist.addToServerBlocklist({ server: servers[0].host })
await checkFollows({
follower: servers[0],
followerState: 'pending',
following: servers[2],
followingState: 'pending'
})
})
await commands[0].unfollow({ target: servers[1] })
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 waitJobs(servers)
await checkFollows({
follower: servers[0],
followerState: 'rejected',
following: servers[1],
followingState: 'rejected'
})
})
await checkFollows({
follower: servers[0],
followerState: 'deleted',
following: servers[1],
followingState: 'deleted'
})
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 commands[0].follow({ hosts: [ servers[1].host ] })
await waitJobs(servers)
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 })
await commands[0].unfollow({ target: servers[1] })
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 checkFollows({
follower: servers[0],
followerState: 'rejected',
following: servers[1],
followingState: 'deleted'
await checkFollows({
follower: servers[0],
followerState: 'rejected',
following: servers[1],
followingState: 'deleted'
})
})
})

View File

@ -53,164 +53,206 @@ 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)
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)
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)
})
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')
}
})
})
it('User of server 1 should follow user of server 3 and root of server 1', async function () {
this.timeout(60000)
describe('Subscription endpoints', function () {
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 })
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)
}
await waitJobs(servers)
{
const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
expect(body.total).to.equal(2)
const attributes = { name: 'video server 3 added after follow' }
const { uuid } = await servers[2].videos.upload({ token: users[2].accessToken, attributes })
video3UUID = uuid
const subscriptions = body.data
expect(subscriptions).to.be.an('array')
expect(subscriptions).to.have.lengthOf(2)
await waitJobs(servers)
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 })
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)
}
{
const videoChannel = await command.get({ token: users[0].accessToken, uri: 'root_channel@localhost:' + servers[0].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)
}
})
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)
}
{
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 not display videos of server 3 on server 1', async function () {
const { total, data } = await servers[0].videos.list()
expect(total).to.equal(4)
describe('Subscription videos', function () {
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 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 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 body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
expect(body.total).to.equal(3)
{
const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
expect(body.total).to.equal(2)
const videos = body.data
expect(videos).to.be.an('array')
expect(videos).to.have.lengthOf(3)
const subscriptions = body.data
expect(subscriptions).to.be.an('array')
expect(subscriptions).to.have.lengthOf(2)
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(subscriptions[0].name).to.equal('user3_channel')
expect(subscriptions[1].name).to.equal('root_channel')
}
})
it('Should upload a video by root on server 1 and see it in the subscription videos', async function () {
this.timeout(60000)
it('Should get subscription', async function () {
{
const videoChannel = await command.get({ token: users[0].accessToken, uri: 'user3_channel@localhost:' + servers[2].port })
const videoName = 'video server 1 added after follow'
await servers[0].videos.upload({ attributes: { name: videoName } })
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)
}
await waitJobs(servers)
{
const videoChannel = await command.get({ token: users[0].accessToken, uri: 'root_channel@localhost:' + servers[0].port })
{
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)
}
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)
}
})
{
const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
expect(body.total).to.equal(4)
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 videos = body.data
expect(videos).to.be.an('array')
expect(videos).to.have.lengthOf(4)
const body = await command.exist({ token: users[0].accessToken, uris })
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(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 { data, total } = await servers[0].videos.list()
expect(total).to.equal(5)
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)
}
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 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 have server 1 following server 3 and display server 3 videos', async function () {
this.timeout(60000)
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)
}
await servers[0].follows.follow({ hosts: [ servers[2].url ] })
{
const body = await command.listVideos({ token: users[0].accessToken, sort: 'createdAt' })
expect(body.total).to.equal(3)
await waitJobs(servers)
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')
}
})
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 } })
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({ 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)
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(8)
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
}
})
it('Should remove follow server 1 -> server 3 and hide server 3 videos', async function () {
this.timeout(60000)
await servers[0].follows.unfollow({ target: servers[2] })
await waitJobs(servers)
const { total, data } = await servers[0].videos.list()
expect(total).to.equal(5)
for (const video of data) {
@ -218,145 +260,85 @@ 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')
}
}
})
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 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')
}
})
})
it('Should have server 1 follow server 3 and display server 3 videos', async function () {
this.timeout(60000)
describe('Existing subscription video update', function () {
await servers[0].follows.follow({ hosts: [ servers[2].url ] })
it('Should update a video of server 3 and see the updated video on server 1', async function () {
this.timeout(30000)
await waitJobs(servers)
await servers[2].videos.update({ id: video3UUID, attributes: { name: 'video server 3 added after follow updated' } })
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
}
})
it('Should remove follow server 1 -> server 3 and hide server 3 videos', async function () {
this.timeout(60000)
await servers[0].follows.unfollow({ target: servers[2] })
await waitJobs(servers)
const { total, data } = 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')
}
})
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 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(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)
describe('Subscription removal', function () {
await servers[2].videos.update({ id: video3UUID, attributes: { name: 'video server 3 added after follow updated' } })
it('Should remove user of server 3 subscription', async function () {
this.timeout(30000)
await waitJobs(servers)
await command.remove({ token: users[0].accessToken, uri: 'user3_channel@localhost:' + servers[2].port })
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')
})
await waitJobs(servers)
})
it('Should remove user of server 3 subscription', async function () {
this.timeout(30000)
await command.remove({ token: users[0].accessToken, uri: 'user3_channel@localhost:' + servers[2].port })
await waitJobs(servers)
})
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(1)
expect(videos[0].name).to.equal('video server 1 added after follow')
})
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: 'root_channel@localhost:' + servers[0].port })
await waitJobs(servers)
{
const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
expect(body.total).to.equal(0)
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)
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 follow user of server 3 again', async function () {
this.timeout(60000)
await command.add({ token: users[0].accessToken, targetUri: 'user3_channel@localhost:' + servers[2].port })
await waitJobs(servers)
{
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(3)
expect(body.total).to.equal(1)
const videos = body.data
expect(videos).to.be.an('array')
expect(videos).to.have.lengthOf(3)
expect(videos).to.have.lengthOf(1)
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')
}
expect(videos[0].name).to.equal('video server 1 added after follow')
})
{
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: 'root_channel@localhost:' + servers[0].port })
await waitJobs(servers)
{
const body = await command.list({ token: users[0].accessToken, sort: 'createdAt' })
expect(body.total).to.equal(0)
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)
{
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 { total, data } = 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 updated')
}
}
})
it('Should follow user channels of server 3 by root of server 3', async function () {
this.timeout(60000)
await servers[2].channels.create({ token: users[2].accessToken, attributes: { name: 'user3_channel2' } })
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 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'
})
describe('Followers listing', function () {
expect(total).to.equal(3)
expect(data).to.have.lengthOf(3)
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(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(total).to.equal(3)
expect(data).to.have.lengthOf(3)
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[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[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')
}
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].accounts.listFollowers({
token: users[2].accessToken,
accountName: 'user3',
start: 0,
count: 1,
sort: '-createdAt'
})
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')
}
expect(total).to.equal(3)
expect(data).to.have.lengthOf(1)
{
const { total, data } = await servers[2].accounts.listFollowers({
token: users[2].accessToken,
accountName: 'user3',
start: 0,
count: 1,
sort: '-createdAt'
})
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')
}
expect(total).to.equal(3)
expect(data).to.have.lengthOf(1)
{
const { total, data } = await servers[2].accounts.listFollowers({
token: users[2].accessToken,
accountName: 'user3',
start: 1,
count: 1,
sort: '-createdAt'
})
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')
}
expect(total).to.equal(3)
expect(data).to.have.lengthOf(1)
{
const { total, data } = await servers[2].accounts.listFollowers({
token: users[2].accessToken,
accountName: 'user3',
start: 1,
count: 1,
sort: '-createdAt'
})
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(total).to.equal(3)
expect(data).to.have.lengthOf(1)
{
const { total, data } = await servers[2].accounts.listFollowers({
token: users[2].accessToken,
accountName: 'user3',
search: 'user1',
sort: '-createdAt'
})
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(total).to.equal(1)
expect(data).to.have.lengthOf(1)
{
const { total, data } = await servers[2].accounts.listFollowers({
token: users[2].accessToken,
accountName: 'user3',
search: 'user1',
sort: '-createdAt'
})
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(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 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'
})
describe('Subscription videos privacy', function () {
expect(total).to.equal(2)
expect(data).to.have.lengthOf(2)
it('Should update video as internal and not see from remote server', async function () {
this.timeout(30000)
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].videos.update({ id: video3UUID, attributes: { name: 'internal', privacy: VideoPrivacy.INTERNAL } })
await waitJobs(servers)
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 { data } = await command.listVideos({ token: users[0].accessToken })
expect(data.find(v => v.name === 'internal')).to.not.exist
}
})
{
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 internal and not see from remote server', async function () {
this.timeout(30000)
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 === '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
}
{
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 () {