diff --git a/services/users.js b/services/users.js index dea208c8e..13dddaf04 100644 --- a/services/users.js +++ b/services/users.js @@ -874,11 +874,24 @@ module.exports = class UsersService { * @return {Promise} */ static async editName(id, username) { + + // TODO: Revisit this when we revamped User status workflows. + const queryUsernameRejected = { + id, + username: {$ne: username}, + status: 'BANNED', + canEditName: true + }; + + const queryCreateUsername = { + id, + status: 'ACTIVE', + canEditName: true + }; + try { const result = await UserModel.findOneAndUpdate({ - id, - username: {$ne: username}, - canEditName: true + $or: [queryUsernameRejected, queryCreateUsername], }, { $set: { username: username, diff --git a/test/server/routes/api/account/index.js b/test/server/routes/api/account/index.js index 08b9c8b1d..8d4e0057a 100644 --- a/test/server/routes/api/account/index.js +++ b/test/server/routes/api/account/index.js @@ -54,23 +54,6 @@ describe('/api/v1/account/username', () => { }); }); - it('it should return an error when the user submits the same username', (done) => { - chai.request(app) - .post(`/api/v1/users/${mockUser.id}/username-enable`) - .set(passport.inject({id: '456', roles: ['ADMIN']})) - .then(() => chai.request(app) - .put('/api/v1/account/username') - .set(passport.inject({id: mockUser.id, roles: []})) - .send({username: 'Ana'})) - .then(() => { - done(new Error('Expected Error')); - }) - .catch((err) => { - expect(err).to.be.ok; - done(); - }); - }); - it('it should return an error when the user tries to edit their username if canEditName is disabled', (done) => { chai.request(app) .put('/api/v1/account/username') diff --git a/test/server/services/users.js b/test/server/services/users.js index 027ac524c..53f4bc018 100644 --- a/test/server/services/users.js +++ b/test/server/services/users.js @@ -238,6 +238,32 @@ describe('services.UsersService', () => { }); }); + it('should let the user submit the same username if user is not banned (create username)', () => { + return UsersService + .toggleNameEdit(mockUsers[0].id, true) + .then(() => UsersService.editName(mockUsers[0].id, mockUsers[0].username)) + .then(() => UsersService.findById(mockUsers[0].id)) + .then((user) => { + expect(user).to.have.property('username', mockUsers[0].username); + expect(user).to.have.property('canEditName', false); + }); + }); + + it('should return error when a banned user submits the same username (rejected username)', () => { + return UsersService + .toggleNameEdit(mockUsers[0].id, true) + .then(() => UsersService.setStatus(mockUsers[0].id, 'BANNED')) + .then(() => UsersService.editName(mockUsers[0].id, mockUsers[0].username)) + .then(() => UsersService.findById(mockUsers[0].id)) + .then(() => { + throw new Error('Error expected'); + }) + .catch((err) => { + expect(err.status).to.equal(400); + expect(err.translation_key).to.equal('SAME_USERNAME_PROVIDED'); + }); + }); + it('should return an error if canEditName is false', (done) => { UsersService .editName(mockUsers[0].id, 'Jojo')