diff --git a/src/rpc/users/index.js b/src/rpc/users/index.js index 82db84c..f8e98a2 100644 --- a/src/rpc/users/index.js +++ b/src/rpc/users/index.js @@ -37,7 +37,8 @@ class UserRPC { return await this.getAll(rpcData) case 'getUser': - return await this.getUser(rpcData) + user = await this.validators.ensureUser(rpcData) + return await this.getUser(rpcData, user) case 'deleteUser': user = await this.validators.ensureTargetUserOrAdmin(rpcData) @@ -56,12 +57,24 @@ class UserRPC { const retObj = await this.userLib.createUser(rpcData.payload.params) + // Add generic JSON RPC properties that every entry gets. retObj.endpoint = 'createUser' + retObj.success = true + retObj.status = 200 + retObj.message = '' return retObj } catch (err) { - console.error('Error in createUser()') - throw err + // console.error('Error in createUser()') + // throw err + + // Return an error response + return { + success: false, + status: 422, + message: err.message, + endpoint: 'createUser' + } } } @@ -71,12 +84,54 @@ class UserRPC { const users = await this.userLib.getAllUsers() return { + users, endpoint: 'getAllUsers', - users + success: true, + status: 200, + message: '' } } catch (err) { - console.error('Error in getAll()') - throw err + // console.error('Error in getAll()') + // throw err + + // Return an error response + return { + success: false, + status: 422, + message: err.message, + endpoint: 'getAllUsers' + } + } + } + + // Get a specific user. + async getUser (rpcData, userModel) { + try { + // console.log('getUser rpcData: ', rpcData) + + // Throw error if rpcData does not include 'userId' property for target user. + const userId = rpcData.payload.params.userId + + const user = await this.userLib.getUser({ id: userId }) + + return { + user, + endpoint: 'getUser', + success: true, + status: 200, + message: '' + } + } catch (err) { + // console.error('Error in getUser()') + // throw err + + // Return an error response + return { + success: false, + status: 422, + message: err.message, + endpoint: 'getUser' + } } } diff --git a/test/unit/json-rpc/a13-users.unit.js b/test/unit/json-rpc/a13-users.unit.js index fca2a32..b07281c 100644 --- a/test/unit/json-rpc/a13-users.unit.js +++ b/test/unit/json-rpc/a13-users.unit.js @@ -65,16 +65,48 @@ describe('#UserRPC', () => { const result = await uut.createUser(rpcData) // console.log('result: ', result) - assert.equal(result.endpoint, 'createUser') + // CreateUser() specific return values. assert.equal(result.userData.type, 'user') assert.equal(result.userData.email, 'test973@test.com') assert.equal(result.userData.name, 'test973') assert.property(result.userData, '_id') assert.property(result, 'token') + // Generic JSON RPC return values + assert.equal(result.endpoint, 'createUser') + assert.equal(result.success, true) + assert.equal(result.status, 200) + assert.equal(result.message, '') + // Save the user ID for future tests. testUser = result }) + + it('should return error data if biz logic throws an error', async () => { + // Force an error + sandbox.stub(uut.userLib, 'createUser').rejects(new Error('test error')) + + // Generate the parsed data that the main router would pass to this + // endpoint. + const id = uid() + const userCall = jsonrpc.request(id, 'users', { + endpoint: 'createUser', + email: 'test973@test.com', + name: 'test973', + password: 'password' + }) + const jsonStr = JSON.stringify(userCall, null, 2) + const rpcData = jsonrpc.parse(jsonStr) + + const result = await uut.createUser(rpcData) + // console.log('result: ', result) + + // Generic JSON RPC return values + assert.equal(result.endpoint, 'createUser') + assert.equal(result.success, false) + assert.equal(result.status, 422) + assert.equal(result.message, 'test error') + }) }) describe('#userRouter', () => { @@ -140,8 +172,71 @@ describe('#UserRPC', () => { const result = await uut.getAll() // console.log('result: ', result) - assert.equal(result.endpoint, 'getAllUsers') + // Endpoint specific properties assert.property(result, 'users') + assert.isArray(result.users) + + // Generic JSON RPC return values + assert.equal(result.endpoint, 'getAllUsers') + assert.equal(result.success, true) + assert.equal(result.status, 200) + assert.equal(result.message, '') + }) + + it('should return error data if biz logic throws an error', async () => { + // Force an error + sandbox.stub(uut.userLib, 'getAllUsers').rejects(new Error('test error')) + + const result = await uut.getAll() + // console.log('result: ', result) + + // Generic JSON RPC return values + assert.equal(result.endpoint, 'getAllUsers') + assert.equal(result.success, false) + assert.equal(result.status, 422) + assert.equal(result.message, 'test error') + }) + }) + + describe('#getUser', () => { + it('should return a specific user', async () => { + // Generate the parsed data that the main router would pass to this + // endpoint. + const id = uid() + const userCall = jsonrpc.request(id, 'users', { + endpoint: 'getUser', + userId: testUser.userData._id.toString() + }) + const jsonStr = JSON.stringify(userCall, null, 2) + const rpcData = jsonrpc.parse(jsonStr) + + const result = await uut.getUser(rpcData) + // console.log('result: ', result) + + // Endpoint specific properties + assert.property(result, 'user') + assert.property(result.user, 'type') + assert.property(result.user, '_id') + assert.property(result.user, 'email') + assert.property(result.user, 'name') + + // Generic JSON RPC return values + assert.equal(result.endpoint, 'getUser') + assert.equal(result.success, true) + assert.equal(result.status, 200) + assert.equal(result.message, '') + }) + + it('should return error data if biz logic throws an error', async () => { + // Force an error by not specifying an user ID. + const result = await uut.getUser() + // console.log('result: ', result) + + // Generic JSON RPC return values + assert.equal(result.endpoint, 'getUser') + assert.equal(result.success, false) + assert.equal(result.status, 422) + assert.include(result.message, 'Cannot read property') }) })