From b9d88251e6cd45da61f1e46ef43ed12a6d47000a Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Thu, 6 Sep 2018 15:22:58 +0000 Subject: [PATCH] External User Fix (#1846) * fix: return user if user was not initially found * fix: added tests, added wasUpserted boolean --- services/users.js | 14 ++++++++-- test/server/services/users.js | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/services/users.js b/services/users.js index 83873b3da..2ce0b7c15 100644 --- a/services/users.js +++ b/services/users.js @@ -68,6 +68,8 @@ async function upsertUser( }, }); if (user) { + user.wasUpserted = false; + user.$ignore('wasUpserted'); return user; } @@ -98,8 +100,16 @@ async function upsertUser( // Save the user in the database. await user.save(); - // Emit that the user was created. - ctx.pubsub.publish('userCreated', user); + if (ctx) { + // Emit that the user was created if the context is set. + ctx.pubsub.publish('userCreated', user); + } + + // Indicate that the user was upserted. + user.wasUpserted = true; + user.$ignore('wasUpserted'); + + return user; } // Users is the interface for the application to interact with the diff --git a/test/server/services/users.js b/test/server/services/users.js index 2b9210f83..95313fbec 100644 --- a/test/server/services/users.js +++ b/test/server/services/users.js @@ -363,6 +363,58 @@ describe('services.UsersService', () => { }); }); + describe('#upsertExternalUser', () => { + it('should return a user when the desired user is found', async () => { + const ctx = Context.forSystem(); + let user = await UsersService.upsertExternalUser( + ctx, + 'an-id', + 'a-provider', + 'a-display-name' + ); + + expect(user).to.be.defined; + expect(user.wasUpserted).to.be.true; + + user = await UsersService.upsertExternalUser( + ctx, + 'an-id', + 'a-provider', + 'a-display-name' + ); + + expect(user).to.be.defined; + expect(user.wasUpserted).to.be.false; + }); + + it('should return a user when the desired user is not found', async () => { + const ctx = Context.forSystem(); + let user = await UsersService.upsertExternalUser( + ctx, + 'an-id', + 'a-provider', + 'a-display-name' + ); + + expect(user).to.be.defined; + expect(user.wasUpserted).to.be.true; + expect(user).to.have.property('metadata'); + expect(user.metadata).to.have.property('displayName', 'a-display-name'); + }); + + it('should work if the context passed is null', async () => { + let user = await UsersService.upsertExternalUser( + null, + 'an-id', + 'a-provider', + 'a-display-name' + ); + + expect(user).to.be.defined; + expect(user.wasUpserted).to.be.true; + }); + }); + describe('#isValidUsername', () => { it('should not allow non-alphanumeric characters in usernames', () => { return UsersService.isValidUsername('hi🖕')