From 3ff1fb7d2d5250ad63ea59a6173bf62c3f24f72a Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Mon, 20 Jan 2020 11:59:15 +0100 Subject: [PATCH] Added back unit tests --- back/methods/chat/sendCheckingPresence.js | 27 ++++---- back/methods/chat/spec/send.spec.js | 6 +- .../chat/spec/sendCheckingPresence.spec.js | 65 +++++++++++++++++++ db/changes/10140-kings/00-department.sql | 2 +- .../10140-kings/00-worker_isWorking.sql | 32 +++++++++ loopback/common/models/vn-model.js | 4 +- .../ticket/back/methods/ticket/setDeleted.js | 2 +- modules/worker/back/models/department.json | 3 + 8 files changed, 121 insertions(+), 20 deletions(-) create mode 100644 back/methods/chat/spec/sendCheckingPresence.spec.js create mode 100644 db/changes/10140-kings/00-worker_isWorking.sql diff --git a/back/methods/chat/sendCheckingPresence.js b/back/methods/chat/sendCheckingPresence.js index a91faa0d8f..ac5836af3a 100644 --- a/back/methods/chat/sendCheckingPresence.js +++ b/back/methods/chat/sendCheckingPresence.js @@ -1,7 +1,6 @@ -const request = require('request-promise-native'); module.exports = Self => { Self.remoteMethodCtx('sendCheckingPresence', { - description: 'Send a RocketChat message', + description: 'Sends a RocketChat message to a working worker or department channel', accessType: 'WRITE', accepts: [{ arg: 'workerId', @@ -29,24 +28,26 @@ module.exports = Self => { const account = await models.Account.findById(workerId); const query = `SELECT worker_isWorking(?) isWorking`; - const result = await Self.rawSql(query, [workerId]); + const [result] = await Self.rawSql(query, [workerId]); - if (result.isWorking) { - const username = `@${account.name}`; - - return await Self.send(ctx, username, message); - } else { + let room; + if (result.isWorking) + room = `@${account.name}`; + else { const workerDepartment = await models.WorkerDepartment.findById(workerId, { include: { relation: 'department' } }); - const department = workerDepartment.department; - const channelName = department.chatChannelName; - const room = `#${channelName}`; + const department = workerDepartment.department(); + const channelName = department.chatName; + room = `#${channelName}`; - - return await Self.send(ctx, room, message); + if (channelName) + room = `#${channelName}`; + else room = `@${account.name}`; } + + return Self.send(ctx, room, message); }; }; diff --git a/back/methods/chat/spec/send.spec.js b/back/methods/chat/spec/send.spec.js index ebb62a0c8b..b2585a9a15 100644 --- a/back/methods/chat/spec/send.spec.js +++ b/back/methods/chat/spec/send.spec.js @@ -1,9 +1,9 @@ const app = require('vn-loopback/server/server'); -describe('chat sendMessage()', () => { +describe('chat send()', () => { it('should return a "Fake notification sent" as response', async() => { let ctx = {req: {accessToken: {userId: 1}}}; - let response = await app.models.Chat.sendMessage(ctx, '@salesPerson', 'I changed something'); + let response = await app.models.Chat.send(ctx, '@salesPerson', 'I changed something'); expect(response.statusCode).toEqual(200); expect(response.message).toEqual('Fake notification sent'); @@ -11,7 +11,7 @@ describe('chat sendMessage()', () => { it('should not return a response', async() => { let ctx = {req: {accessToken: {userId: 18}}}; - let response = await app.models.Chat.sendMessage(ctx, '@salesPerson', 'I changed something'); + let response = await app.models.Chat.send(ctx, '@salesPerson', 'I changed something'); expect(response).toBeUndefined(); }); diff --git a/back/methods/chat/spec/sendCheckingPresence.spec.js b/back/methods/chat/spec/sendCheckingPresence.spec.js new file mode 100644 index 0000000000..12a1639621 --- /dev/null +++ b/back/methods/chat/spec/sendCheckingPresence.spec.js @@ -0,0 +1,65 @@ +const app = require('vn-loopback/server/server'); + +describe('chat sendCheckingPresence()', () => { + const departmentId = 23; + const workerId = 107; + let timeEntry; + + afterAll(async done => { + const department = await app.models.Department.findById(departmentId); + await department.updateAttribute('chatName', null); + await app.models.WorkerTimeControl.destroyById(timeEntry.id); + done(); + }); + + it(`should call to send() method with the worker username when no department channel is specified + and then return a "Fake notification sent" as response`, async() => { + const ctx = {req: {accessToken: {userId: 1}}}; + const chatModel = app.models.Chat; + spyOn(chatModel, 'send').and.callThrough(); + + const response = await chatModel.sendCheckingPresence(ctx, workerId, 'I changed something'); + + expect(response.statusCode).toEqual(200); + expect(response.message).toEqual('Fake notification sent'); + expect(chatModel.send).toHaveBeenCalledWith(ctx, '@HankPym', 'I changed something'); + }); + + it(`should call to send() method with the worker department channel if is specified + and then return a "Fake notification sent" as response`, async() => { + const ctx = {req: {accessToken: {userId: 1}}}; + const chatModel = app.models.Chat; + spyOn(chatModel, 'send').and.callThrough(); + + const department = await app.models.Department.findById(departmentId); + await department.updateAttribute('chatName', 'cooler'); + + const response = await chatModel.sendCheckingPresence(ctx, workerId, 'I changed something'); + + expect(response.statusCode).toEqual(200); + expect(response.message).toEqual('Fake notification sent'); + expect(chatModel.send).toHaveBeenCalledWith(ctx, '#cooler', 'I changed something'); + }); + + it(`should call to send() method with the worker username when the worker is working`, async() => { + const ctx = {req: {accessToken: {userId: 1}}}; + const chatModel = app.models.Chat; + spyOn(chatModel, 'send').and.callThrough(); + + const today = new Date(); + today.setHours(6, 0); + + timeEntry = await app.models.WorkerTimeControl.create({ + userFk: workerId, + timed: today, + manual: false, + direction: 'in' + }); + + const response = await chatModel.sendCheckingPresence(ctx, workerId, 'I changed something'); + + expect(response.statusCode).toEqual(200); + expect(response.message).toEqual('Fake notification sent'); + expect(chatModel.send).toHaveBeenCalledWith(ctx, '@HankPym', 'I changed something'); + }); +}); diff --git a/db/changes/10140-kings/00-department.sql b/db/changes/10140-kings/00-department.sql index 90135b91e6..29008d753e 100644 --- a/db/changes/10140-kings/00-department.sql +++ b/db/changes/10140-kings/00-department.sql @@ -1,2 +1,2 @@ ALTER TABLE `vn`.`department` -ADD COLUMN `chatChannelName` VARCHAR(45) NULL AFTER `path`; +ADD COLUMN `chatName` VARCHAR(45) NULL AFTER `path`; diff --git a/db/changes/10140-kings/00-worker_isWorking.sql b/db/changes/10140-kings/00-worker_isWorking.sql new file mode 100644 index 0000000000..b80d287e0a --- /dev/null +++ b/db/changes/10140-kings/00-worker_isWorking.sql @@ -0,0 +1,32 @@ +USE `vn`; +DROP function IF EXISTS `worker_isWorking`; + +DELIMITER $$ +USE `vn`$$ +CREATE DEFINER=`root`@`%` FUNCTION `worker_isWorking`(vWorkerFk INT) RETURNS tinyint(1) + READS SQL DATA +BEGIN +/** + * Comprueba si el trabajador está trabajando en el momento de la consulta + * @return Devuelve TRUE en caso de que este trabajando. Si se encuentra en un descanso devolverá FALSE + */ + DECLARE vLastIn DATETIME ; + + SELECT MAX(timed) INTO vLastIn + FROM vn.workerTimeControl + WHERE userFk = vWorkerFk AND + direction = 'in'; + + IF (SELECT MOD(COUNT(*),2) + FROM vn.workerTimeControl + WHERE userFk = vWorkerFk AND + timed >= vLastIn + ) THEN + RETURN TRUE; + ELSE + RETURN FALSE; + END IF; +END$$ + +DELIMITER ; + diff --git a/loopback/common/models/vn-model.js b/loopback/common/models/vn-model.js index 0191967b1d..c6f535b7ab 100644 --- a/loopback/common/models/vn-model.js +++ b/loopback/common/models/vn-model.js @@ -155,10 +155,10 @@ module.exports = function(Self) { const result = await realMethod.call(this, data, options); if (cb) cb(null, result); + else return result; } catch (err) { let myErr = replaceErr(err, replaceErrFunc); - if (cb) - cb(myErr); + if (cb) cb(myErr); else throw myErr; } diff --git a/modules/ticket/back/methods/ticket/setDeleted.js b/modules/ticket/back/methods/ticket/setDeleted.js index fb72c7dbc6..6daad7c39f 100644 --- a/modules/ticket/back/methods/ticket/setDeleted.js +++ b/modules/ticket/back/methods/ticket/setDeleted.js @@ -94,7 +94,7 @@ module.exports = Self => { id: id, url: `${origin}/#!/ticket/${id}/summary` }); - await models.Chat.sendMessage(ctx, `@${salesPersonUser}`, message); + await models.Chat.send(ctx, `@${salesPersonUser}`, message); } return ticket.updateAttribute('isDeleted', true); diff --git a/modules/worker/back/models/department.json b/modules/worker/back/models/department.json index 7de76e0395..d8ec7313a5 100644 --- a/modules/worker/back/models/department.json +++ b/modules/worker/back/models/department.json @@ -25,6 +25,9 @@ }, "sons": { "type": "Number" + }, + "chatName": { + "type": "String" } } }