overleaf/services/web/test/acceptance/src/ProjectOwnershipTransferTests.js
Eric Mc Sween 3ec74ac6f2 Merge pull request #2164 from overleaf/em-ownership-transfer
Project ownership transfer backend endpoint

GitOrigin-RevId: b7d267f2c105e8f51d5013289ac4afeb077c1e21
2019-09-30 15:01:03 +00:00

87 lines
2.8 KiB
JavaScript

const { expect } = require('chai')
const User = require('./helpers/User').promises
describe('Project ownership transfer', function() {
beforeEach(async function() {
this.ownerSession = new User()
this.collaboratorSession = new User()
this.strangerSession = new User()
this.adminSession = new User()
await this.adminSession.ensureUserExists()
await this.adminSession.ensureAdmin()
await this.ownerSession.login()
await this.collaboratorSession.login()
await this.strangerSession.login()
await this.adminSession.login()
this.owner = await this.ownerSession.get()
this.collaborator = await this.collaboratorSession.get()
this.stranger = await this.strangerSession.get()
this.admin = await this.adminSession.get()
this.projectId = await this.ownerSession.createProject('Test project')
await this.ownerSession.addUserToProject(
this.projectId,
this.collaborator,
'readAndWrite'
)
})
describe('happy path', function() {
beforeEach(async function() {
await this.ownerSession.transferProjectOwnership(
this.projectId,
this.collaborator._id
)
})
it('changes the project owner', async function() {
const project = await this.collaboratorSession.getProject(this.projectId)
expect(project.owner_ref.toString()).to.equal(
this.collaborator._id.toString()
)
})
it('adds the previous owner as a read/write collaborator', async function() {
const project = await this.collaboratorSession.getProject(this.projectId)
expect(project.collaberator_refs.map(x => x.toString())).to.have.members([
this.owner._id.toString()
])
})
it('lets the new owner open the project', async function() {
await this.collaboratorSession.openProject(this.projectId)
})
it('lets the previous owner open the project', async function() {
await this.ownerSession.openProject(this.projectId)
})
})
describe('validation', function() {
it('lets only the project owner transfer ownership', async function() {
await expect(
this.collaboratorSession.transferProjectOwnership(
this.projectId,
this.collaborator._id
)
).to.be.rejectedWith('Unexpected status code: 403')
})
it('prevents transfers to a non-collaborator', async function() {
await expect(
this.ownerSession.transferProjectOwnership(
this.projectId,
this.stranger._id
)
).to.be.rejectedWith('Unexpected status code: 403')
})
it('allows an admin to transfer to any project to a non-collaborator', async function() {
await expect(
this.adminSession.transferProjectOwnership(
this.projectId,
this.stranger._id
)
).to.be.fulfilled
})
})
})