From 4a562c311022261165a1246b99d98610abb744bb Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 7 Feb 2023 15:40:03 +0100 Subject: [PATCH 01/15] unificado todo a claimState isEditable --- db/changes/230601/00-acl_claim.sql | 6 ++++ db/dump/fixtures.sql | 8 ++--- .../{claim => claim-state}/isEditable.js | 29 +++++++------------ .../specs/isEditable.spec.js | 16 +++++----- .../claim/back/methods/claim/getSummary.js | 13 +++++---- .../claim/back/methods/claim/updateClaim.js | 22 +++----------- modules/claim/back/models/claim-beginning.js | 22 +++++++++++++- modules/claim/back/models/claim-state.js | 3 ++ modules/claim/back/models/claim.js | 1 - modules/claim/front/detail/index.js | 2 +- 10 files changed, 65 insertions(+), 57 deletions(-) create mode 100644 db/changes/230601/00-acl_claim.sql rename modules/claim/back/methods/{claim => claim-state}/isEditable.js (52%) rename modules/claim/back/methods/{claim => claim-state}/specs/isEditable.spec.js (76%) create mode 100644 modules/claim/back/models/claim-state.js diff --git a/db/changes/230601/00-acl_claim.sql b/db/changes/230601/00-acl_claim.sql new file mode 100644 index 0000000000..ea96e130a6 --- /dev/null +++ b/db/changes/230601/00-acl_claim.sql @@ -0,0 +1,6 @@ +INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) + VALUES('ClaimBeginning', 'isEditable', 'READ', 'ALLOW', 'ROLE', 'employee'); + +DELETE FROM salix.ACL + WHERE model='Claim' AND property='isEditable'; + diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 5c7bbf192e..94b815107c 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -1766,12 +1766,12 @@ INSERT INTO `vn`.`clientSample`(`id`, `clientFk`, `typeFk`, `created`, `workerFk INSERT INTO `vn`.`claimState`(`id`, `code`, `description`, `roleFk`, `priority`, `hasToNotify`) VALUES ( 1, 'pending', 'Pendiente', 1, 1, 0), - ( 2, 'managed', 'Gestionado', 1, 5, 0), + ( 2, 'managed', 'Gestionado', 72, 5, 0), ( 3, 'resolved', 'Resuelto', 72, 7, 0), ( 4, 'canceled', 'Anulado', 72, 6, 1), - ( 5, 'incomplete', 'Incompleta', 72, 3, 1), - ( 6, 'mana', 'Mana', 1, 4, 0), - ( 7, 'lack', 'Faltas', 1, 2, 0); + ( 5, 'incomplete', 'Incompleta', 1, 3, 1), + ( 6, 'mana', 'Mana', 72, 4, 0), + ( 7, 'lack', 'Faltas', 72, 2, 0); INSERT INTO `vn`.`claim`(`id`, `ticketCreated`, `claimStateFk`, `clientFk`, `workerFk`, `responsibility`, `isChargedToMana`, `created`, `packages`, `rma`) VALUES diff --git a/modules/claim/back/methods/claim/isEditable.js b/modules/claim/back/methods/claim-state/isEditable.js similarity index 52% rename from modules/claim/back/methods/claim/isEditable.js rename to modules/claim/back/methods/claim-state/isEditable.js index cd14d70c78..b144f0a53e 100644 --- a/modules/claim/back/methods/claim/isEditable.js +++ b/modules/claim/back/methods/claim-state/isEditable.js @@ -1,12 +1,12 @@ module.exports = Self => { Self.remoteMethodCtx('isEditable', { - description: 'Check if a claim is editable', + description: 'Check if an state is editable', accessType: 'READ', accepts: [{ arg: 'id', type: 'number', required: true, - description: 'the claim id', + description: 'the st id', http: {source: 'path'} }], returns: { @@ -21,25 +21,18 @@ module.exports = Self => { Self.isEditable = async(ctx, id, options) => { const userId = ctx.req.accessToken.userId; + const models = Self.app.models; const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); - - const isClaimManager = await Self.app.models.Account.hasRole(userId, 'claimManager', myOptions); - - const claim = await Self.app.models.Claim.findById(id, { - fields: ['claimStateFk'], - include: [{ - relation: 'claimState' - }] - }, myOptions); - - const isClaimResolved = claim && claim.claimState().code == 'resolved'; - - if (!claim || (isClaimResolved && !isClaimManager)) - return false; - - return true; + + const state = await models.ClaimState.findById(id, { + include: { + relation: 'writeRole' + } + }, myOptions); + const roleWithGrants = state && state.writeRole().name; + return await models.Account.hasRole(userId, roleWithGrants, myOptions); }; }; diff --git a/modules/claim/back/methods/claim/specs/isEditable.spec.js b/modules/claim/back/methods/claim-state/specs/isEditable.spec.js similarity index 76% rename from modules/claim/back/methods/claim/specs/isEditable.spec.js rename to modules/claim/back/methods/claim-state/specs/isEditable.spec.js index 3afea78434..4ce7af1c22 100644 --- a/modules/claim/back/methods/claim/specs/isEditable.spec.js +++ b/modules/claim/back/methods/claim-state/specs/isEditable.spec.js @@ -1,7 +1,7 @@ const app = require('vn-loopback/server/server'); -describe('claim isEditable()', () => { - const salesPerdonId = 18; +describe('claimstate isEditable()', () => { + const salesPersonId = 18; const claimManagerId = 72; it('should return false if the given claim does not exist', async() => { const tx = await app.models.Claim.beginTransaction({}); @@ -10,7 +10,7 @@ describe('claim isEditable()', () => { const options = {transaction: tx}; const ctx = {req: {accessToken: {userId: claimManagerId}}}; - const result = await app.models.Claim.isEditable(ctx, 99999, options); + const result = await app.models.ClaimState.isEditable(ctx, 9999, options); expect(result).toEqual(false); @@ -27,8 +27,8 @@ describe('claim isEditable()', () => { try { const options = {transaction: tx}; - const ctx = {req: {accessToken: {userId: salesPerdonId}}}; - const result = await app.models.Claim.isEditable(ctx, 4, options); + const ctx = {req: {accessToken: {userId: salesPersonId}}}; + const result = await app.models.ClaimState.isEditable(ctx, 3, options); expect(result).toEqual(false); @@ -46,7 +46,7 @@ describe('claim isEditable()', () => { const options = {transaction: tx}; const ctx = {req: {accessToken: {userId: claimManagerId}}}; - const result = await app.models.Claim.isEditable(ctx, 4, options); + const result = await app.models.ClaimState.isEditable(ctx, 3, options); expect(result).toEqual(true); @@ -63,8 +63,8 @@ describe('claim isEditable()', () => { try { const options = {transaction: tx}; - const ctx = {req: {accessToken: {userId: salesPerdonId}}}; - const result = await app.models.Claim.isEditable(ctx, 1, options); + const ctx = {req: {accessToken: {userId: claimManagerId}}}; + const result = await app.models.ClaimState.isEditable(ctx, 7, options); expect(result).toEqual(true); diff --git a/modules/claim/back/methods/claim/getSummary.js b/modules/claim/back/methods/claim/getSummary.js index ca376f8533..d384f7ebb0 100644 --- a/modules/claim/back/methods/claim/getSummary.js +++ b/modules/claim/back/methods/claim/getSummary.js @@ -65,7 +65,8 @@ module.exports = Self => { ] }; - promises.push(Self.app.models.Claim.find(filter, myOptions)); + const models = Self.app.models; + promises.push(models.Claim.find(filter, myOptions)); // Claim detail filter = { @@ -82,7 +83,7 @@ module.exports = Self => { } ] }; - promises.push(Self.app.models.ClaimBeginning.find(filter, myOptions)); + promises.push(models.ClaimBeginning.find(filter, myOptions)); // Claim observations filter = { @@ -96,7 +97,7 @@ module.exports = Self => { } ] }; - promises.push(Self.app.models.ClaimObservation.find(filter, myOptions)); + promises.push(models.ClaimObservation.find(filter, myOptions)); // Claim developments filter = { @@ -128,7 +129,7 @@ module.exports = Self => { } ] }; - promises.push(Self.app.models.ClaimDevelopment.find(filter, myOptions)); + promises.push(models.ClaimDevelopment.find(filter, myOptions)); // Claim action filter = { @@ -145,11 +146,11 @@ module.exports = Self => { {relation: 'claimBeggining'} ] }; - promises.push(Self.app.models.ClaimEnd.find(filter, myOptions)); + promises.push(models.ClaimEnd.find(filter, myOptions)); const res = await Promise.all(promises); - summary.isEditable = await Self.isEditable(ctx, id, myOptions); + summary.isEditable = await models.ClaimState.isEditable(ctx, res[0][0].claimStateFk, myOptions); [summary.claim] = res[0]; summary.salesClaimed = res[1]; summary.observations = res[2]; diff --git a/modules/claim/back/methods/claim/updateClaim.js b/modules/claim/back/methods/claim/updateClaim.js index cc9937c194..5271136d6b 100644 --- a/modules/claim/back/methods/claim/updateClaim.js +++ b/modules/claim/back/methods/claim/updateClaim.js @@ -2,6 +2,7 @@ const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethod('updateClaim', { description: 'Update a claim with privileges', + accessType: 'WRITE', accepts: [{ arg: 'ctx', type: 'object', @@ -78,11 +79,11 @@ module.exports = Self => { // Validate when claimState has been changed if (args.claimStateFk) { - const canUpdate = await canChangeState(ctx, claim.claimStateFk, myOptions); - const hasRights = await canChangeState(ctx, args.claimStateFk, myOptions); + const canEditOldState = await models.ClaimState.isEditable(ctx, claim.claimStateFk, myOptions); + const canEditNewState = await models.ClaimState.isEditable(ctx, args.claimStateFk, myOptions); const isClaimManager = await models.Account.hasRole(userId, 'claimManager', myOptions); - if (!canUpdate || !hasRights || changedHasToPickUp && !isClaimManager) + if (!canEditOldState || !canEditNewState || changedHasToPickUp && !isClaimManager) throw new UserError(`You don't have enough privileges to change that field`); } @@ -113,21 +114,6 @@ module.exports = Self => { } }; - async function canChangeState(ctx, id, options) { - let models = Self.app.models; - let userId = ctx.req.accessToken.userId; - - let state = await models.ClaimState.findById(id, { - include: { - relation: 'writeRole' - } - }, options); - let stateRole = state.writeRole().name; - let canUpdate = await models.Account.hasRole(userId, stateRole, options); - - return canUpdate; - } - async function notifyStateChange(ctx, workerId, claim, state) { const models = Self.app.models; const origin = ctx.req.headers.origin; diff --git a/modules/claim/back/models/claim-beginning.js b/modules/claim/back/models/claim-beginning.js index 681aaebc7f..4283e37e25 100644 --- a/modules/claim/back/models/claim-beginning.js +++ b/modules/claim/back/models/claim-beginning.js @@ -22,8 +22,28 @@ module.exports = Self => { async function claimIsEditable(ctx) { const loopBackContext = LoopBackContext.getCurrentContext(); const httpCtx = {req: loopBackContext.active}; + const models = Self.app.models; + const myOptions = {}; + + if (ctx.options && ctx.options.transaction) + myOptions.transaction = ctx.options.transaction; + const claimBeginning = await Self.findById(ctx.where.id); - const isEditable = await Self.app.models.Claim.isEditable(httpCtx, claimBeginning.claimFk); + + const filter = { + where: {id: claimBeginning.claimFk}, + include: [ + { + relation: 'claimState', + scope: { + fields: ['id', 'code', 'description'] + } + } + ] + }; + + const [claim] = await models.Claim.find(filter, myOptions); + const isEditable = await models.ClaimState.isEditable(httpCtx, claim.ClaimState()); if (!isEditable) throw new UserError(`The current claim can't be modified`); diff --git a/modules/claim/back/models/claim-state.js b/modules/claim/back/models/claim-state.js new file mode 100644 index 0000000000..e0df5ac4d0 --- /dev/null +++ b/modules/claim/back/models/claim-state.js @@ -0,0 +1,3 @@ +module.exports = Self => { + require('../methods/claim-state/isEditable')(Self); +}; diff --git a/modules/claim/back/models/claim.js b/modules/claim/back/models/claim.js index c9d7ee7d43..5989b44cc7 100644 --- a/modules/claim/back/models/claim.js +++ b/modules/claim/back/models/claim.js @@ -6,7 +6,6 @@ module.exports = Self => { require('../methods/claim/regularizeClaim')(Self); require('../methods/claim/uploadFile')(Self); require('../methods/claim/updateClaimAction')(Self); - require('../methods/claim/isEditable')(Self); require('../methods/claim/updateClaimDestination')(Self); require('../methods/claim/downloadFile')(Self); require('../methods/claim/claimPickupPdf')(Self); diff --git a/modules/claim/front/detail/index.js b/modules/claim/front/detail/index.js index 7c3c04f448..33ce1a5816 100644 --- a/modules/claim/front/detail/index.js +++ b/modules/claim/front/detail/index.js @@ -151,7 +151,7 @@ class Controller extends Section { isClaimEditable() { if (!this.claim) return; - this.$http.get(`Claims/${this.claim.id}/isEditable`).then(res => { + this.$http.get(`ClaimStates/${this.claim.id}/isEditable`).then(res => { this.isRewritable = res.data; }); } From 780572a9f2649e309a0f4ec084033512b7a50a5c Mon Sep 17 00:00:00 2001 From: jgallego Date: Mon, 6 Mar 2023 08:14:26 +0100 Subject: [PATCH 02/15] test fixed --- loopback/locale/en.json | 8 +++++--- modules/claim/back/methods/claim-state/isEditable.js | 2 +- .../back/methods/claim-state/specs/isEditable.spec.js | 2 +- modules/claim/front/detail/index.spec.js | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index eeb25f75dd..dbe25dea30 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -147,8 +147,10 @@ "Receipt's bank was not found": "Receipt's bank was not found", "This receipt was not compensated": "This receipt was not compensated", "Client's email was not found": "Client's email was not found", - "Tickets with associated refunds": "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº {{id}}", + "Tickets with associated refunds": "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº {{id}}", "It is not possible to modify tracked sales": "It is not possible to modify tracked sales", "It is not possible to modify sales that their articles are from Floramondo": "It is not possible to modify sales that their articles are from Floramondo", - "It is not possible to modify cloned sales": "It is not possible to modify cloned sales" -} + "It is not possible to modify cloned sales": "It is not possible to modify cloned sales", + "Valid priorities: 1,2,3": "Valid priorities: 1,2,3", + "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2": "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2" +} \ No newline at end of file diff --git a/modules/claim/back/methods/claim-state/isEditable.js b/modules/claim/back/methods/claim-state/isEditable.js index b144f0a53e..2d0a8dc448 100644 --- a/modules/claim/back/methods/claim-state/isEditable.js +++ b/modules/claim/back/methods/claim-state/isEditable.js @@ -6,7 +6,7 @@ module.exports = Self => { arg: 'id', type: 'number', required: true, - description: 'the st id', + description: 'the state id', http: {source: 'path'} }], returns: { diff --git a/modules/claim/back/methods/claim-state/specs/isEditable.spec.js b/modules/claim/back/methods/claim-state/specs/isEditable.spec.js index 4ce7af1c22..1fb8e15366 100644 --- a/modules/claim/back/methods/claim-state/specs/isEditable.spec.js +++ b/modules/claim/back/methods/claim-state/specs/isEditable.spec.js @@ -3,7 +3,7 @@ const app = require('vn-loopback/server/server'); describe('claimstate isEditable()', () => { const salesPersonId = 18; const claimManagerId = 72; - it('should return false if the given claim does not exist', async() => { + it('should return false if the given state does not exist', async() => { const tx = await app.models.Claim.beginTransaction({}); try { diff --git a/modules/claim/front/detail/index.spec.js b/modules/claim/front/detail/index.spec.js index b36f3a1727..a2b177281c 100644 --- a/modules/claim/front/detail/index.spec.js +++ b/modules/claim/front/detail/index.spec.js @@ -17,7 +17,7 @@ describe('claim', () => { $httpBackend = _$httpBackend_; $httpBackend.whenGET('Claims/ClaimBeginnings').respond({}); $httpBackend.whenGET(`Tickets/1/isEditable`).respond(true); - $httpBackend.whenGET(`Claims/2/isEditable`).respond(true); + $httpBackend.whenGET(`ClaimStates/2/isEditable`).respond(true); const $element = angular.element(''); controller = $componentController('vnClaimDetail', {$element, $scope}); controller.claim = { From a6bf61033f5d3e03a2e5e4af5c4d06c63ac87331 Mon Sep 17 00:00:00 2001 From: alexandre Date: Mon, 6 Mar 2023 12:04:16 +0100 Subject: [PATCH 03/15] refactor tests --- e2e/paths/05-ticket/21_future.spec.js | 83 +++++++++----------------- e2e/paths/05-ticket/22_advance.spec.js | 30 +++------- 2 files changed, 35 insertions(+), 78 deletions(-) diff --git a/e2e/paths/05-ticket/21_future.spec.js b/e2e/paths/05-ticket/21_future.spec.js index 34ae3d688e..2b8057247b 100644 --- a/e2e/paths/05-ticket/21_future.spec.js +++ b/e2e/paths/05-ticket/21_future.spec.js @@ -4,12 +4,17 @@ import getBrowser from '../../helpers/puppeteer'; describe('Ticket Future path', () => { let browser; let page; + let httpRequest; beforeAll(async() => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('employee', 'ticket'); await page.accessToSection('ticket.future'); + page.on('request', req => { + if (req.url().includes(`Tickets/getTicketsFuture`)) + httpRequest = req.url(); + }); }); afterAll(async() => { @@ -42,114 +47,82 @@ describe('Ticket Future path', () => { it('should search with the required data', async() => { await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); + + expect(httpRequest).toBeDefined(); }); it('should search with the origin IPT', async() => { await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.ipt); - await page.clearInput(selectors.ticketFuture.futureIpt); - await page.clearInput(selectors.ticketFuture.state); - await page.clearInput(selectors.ticketFuture.futureState); - await page.autocompleteSearch(selectors.ticketFuture.ipt, 'Horizontal'); await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); + + expect(httpRequest).toContain('ipt=H'); }); it('should search with the destination IPT', async() => { await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); await page.clearInput(selectors.ticketFuture.ipt); - await page.clearInput(selectors.ticketFuture.futureIpt); - await page.clearInput(selectors.ticketFuture.state); - await page.clearInput(selectors.ticketFuture.futureState); await page.autocompleteSearch(selectors.ticketFuture.futureIpt, 'Horizontal'); await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); + + expect(httpRequest).toContain('futureIpt=H'); }); it('should search with the origin grouped state', async() => { await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.ipt); await page.clearInput(selectors.ticketFuture.futureIpt); - await page.clearInput(selectors.ticketFuture.state); - await page.clearInput(selectors.ticketFuture.futureState); await page.autocompleteSearch(selectors.ticketFuture.state, 'Free'); await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 3); + + expect(httpRequest).toContain('state=FREE'); }); it('should search with the destination grouped state', async() => { await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.ipt); - await page.clearInput(selectors.ticketFuture.futureIpt); await page.clearInput(selectors.ticketFuture.state); - await page.clearInput(selectors.ticketFuture.futureState); await page.autocompleteSearch(selectors.ticketFuture.futureState, 'Free'); await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 0); + + expect(httpRequest).toContain('futureState=FREE'); await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.ipt); - await page.clearInput(selectors.ticketFuture.futureIpt); - await page.clearInput(selectors.ticketFuture.state); await page.clearInput(selectors.ticketFuture.futureState); - await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); }); it('should search in smart-table with an ID Origin', async() => { await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.write(selectors.ticketFuture.tableId, '13'); + await page.write(selectors.ticketFuture.tableId, '1'); await page.keyboard.press('Enter'); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 2); + expect(httpRequest).toContain('id'); await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); - }); - - it('should search in smart-table with an ID Destination', async() => { - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.write(selectors.ticketFuture.tableFutureId, '12'); - await page.keyboard.press('Enter'); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 5); - - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); - }); - - it('should search in smart-table with an IPT Origin', async() => { - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.autocompleteSearch(selectors.ticketFuture.tableIpt, 'Vertical'); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 1); - - await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); }); it('should search in smart-table with an IPT Destination', async() => { await page.waitToClick(selectors.ticketFuture.tableButtonSearch); - await page.autocompleteSearch(selectors.ticketFuture.tableFutureIpt, 'Vertical'); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 1); + await page.autocompleteSearch(selectors.ticketFuture.tableFutureIpt, 'Horizontal'); + expect(httpRequest).toContain('futureIpt'); + await page.waitToClick(selectors.ticketFuture.tableButtonSearch); + }); + + it('should search in smart-table with an ID Destination', async() => { + await page.waitToClick(selectors.ticketFuture.tableButtonSearch); + await page.write(selectors.ticketFuture.tableFutureId, '1'); + await page.keyboard.press('Enter'); + + expect(httpRequest).toContain('futureId'); await page.waitToClick(selectors.ticketFuture.tableButtonSearch); await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); await page.waitToClick(selectors.ticketFuture.submit); - await page.waitForNumberOfElements(selectors.ticketFuture.table, 4); }); it('should check the three last tickets and move to the future', async() => { diff --git a/e2e/paths/05-ticket/22_advance.spec.js b/e2e/paths/05-ticket/22_advance.spec.js index c92cd7a205..f8442bf120 100644 --- a/e2e/paths/05-ticket/22_advance.spec.js +++ b/e2e/paths/05-ticket/22_advance.spec.js @@ -4,7 +4,7 @@ import getBrowser from '../../helpers/puppeteer'; describe('Ticket Advance path', () => { let browser; let page; - const httpRequests = []; + let httpRequest; beforeAll(async() => { browser = await getBrowser(); @@ -13,7 +13,7 @@ describe('Ticket Advance path', () => { await page.accessToSection('ticket.advance'); page.on('request', req => { if (req.url().includes(`Tickets/getTicketsAdvance`)) - httpRequests.push(req.url()); + httpRequest = req.url(); }); }); @@ -49,7 +49,7 @@ describe('Ticket Advance path', () => { await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); await page.waitToClick(selectors.ticketAdvance.submit); - expect(httpRequests.length).toBeGreaterThan(0); + expect(httpRequest).toBeDefined(); }); it('should search with the origin IPT', async() => { @@ -57,11 +57,7 @@ describe('Ticket Advance path', () => { await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'Horizontal'); await page.waitToClick(selectors.ticketAdvance.submit); - const request = httpRequests.find(req => req.includes(('futureIpt=H'))); - - expect(request).toBeDefined(); - - httpRequests.splice(httpRequests.indexOf(request), 1); + expect(httpRequest).toContain('futureIpt=H'); await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); await page.clearInput(selectors.ticketAdvance.futureIpt); @@ -73,11 +69,7 @@ describe('Ticket Advance path', () => { await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'Horizontal'); await page.waitToClick(selectors.ticketAdvance.submit); - const request = httpRequests.find(req => req.includes(('ipt=H'))); - - expect(request).toBeDefined(); - - httpRequests.splice(httpRequests.indexOf(request), 1); + expect(httpRequest).toContain('ipt=H'); await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); await page.clearInput(selectors.ticketAdvance.ipt); @@ -88,11 +80,7 @@ describe('Ticket Advance path', () => { await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); await page.autocompleteSearch(selectors.ticketAdvance.tableFutureIpt, 'Vertical'); - const request = httpRequests.find(req => req.includes(('futureIpt'))); - - expect(request).toBeDefined(); - - httpRequests.splice(httpRequests.indexOf(request), 1); + expect(httpRequest).toContain('futureIpt'); await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); @@ -103,11 +91,7 @@ describe('Ticket Advance path', () => { await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); await page.autocompleteSearch(selectors.ticketAdvance.tableIpt, 'Vertical'); - const request = httpRequests.find(req => req.includes(('ipt'))); - - expect(request).toBeDefined(); - - httpRequests.splice(httpRequests.indexOf(request), 1); + expect(httpRequest).toContain('ipt'); await page.waitToClick(selectors.ticketAdvance.tableButtonSearch); await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); From 4f091330a7276ce00c59dfce40f7a282d456cb33 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 6 Mar 2023 12:37:37 +0100 Subject: [PATCH 04/15] feat(claimLog): added claim log section Refs: #5340 --- db/dump/fixtures.sql | 8 +- modules/claim/back/methods/claim/logs.js | 134 ++++++++++++++++++ .../back/methods/claim/specs/log.spec.js | 12 ++ modules/claim/back/models/claim.js | 1 + 4 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 modules/claim/back/methods/claim/logs.js create mode 100644 modules/claim/back/methods/claim/specs/log.spec.js diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 5af9b9eeb3..7b5a5960b2 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -1828,7 +1828,12 @@ INSERT INTO vn.claimRma (`id`, `code`, `created`, `workerFk`) (4, '02676A049183', DEFAULT, 1107), (5, '01837B023653', DEFAULT, 1106); - +INSERT INTO `vn`.`claimLog` (`originFk`, userFk, `action`, changedModel, oldInstance, newInstance, changedModelId, `description`) + VALUES + (1, 18, 'update', 'Claim', '{"hasToPickUp":false}', '{"hasToPickUp":true}', 1, NULL), + (1, 18, 'update', 'ClaimObservation', '{}', '{"claimFk":1,"text":"Waiting for customer"}', 1, NULL), + (1, 18, 'insert', 'ClaimBeginning', '{}', '{"claimFk":1,"saleFk":1,"quantity":10}', 1, NULL), + (1, 18, 'insert', 'ClaimDms', '{}', '{"claimFk":1,"dmsFk":1}', 1, NULL); INSERT INTO `hedera`.`tpvMerchant`(`id`, `description`, `companyFk`, `bankFk`, `secretKey`) VALUES @@ -2760,7 +2765,6 @@ INSERT INTO `vn`.`ticketLog` (`originFk`, userFk, `action`, changedModel, oldIns (7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 1, NULL), (7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 1x0.5m de '5' a '10'"); - INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo`) VALUES (0, 'http://localhost:56596/scp', 'ostadmin', 'Admin1', '1,6', 3, 60, 'Este CAU se ha cerrado automáticamente. Si el problema persiste responda a este mensaje.', 'localhost', 'osticket', 'osticket', 40003, 'reply', 1, 'all'); diff --git a/modules/claim/back/methods/claim/logs.js b/modules/claim/back/methods/claim/logs.js new file mode 100644 index 0000000000..c7e69680b4 --- /dev/null +++ b/modules/claim/back/methods/claim/logs.js @@ -0,0 +1,134 @@ + +const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; +const buildFilter = require('vn-loopback/util/filter').buildFilter; +const {mergeFilters, mergeWhere} = require('vn-loopback/util/filter'); + +module.exports = Self => { + Self.remoteMethodCtx('logs', { + description: 'Find all claim logs of the claim entity matched by a filter', + accessType: 'READ', + accepts: [ + { + arg: 'id', + type: 'Number', + description: 'The claim id', + http: {source: 'path'} + }, + { + arg: 'filter', + type: 'object', + http: {source: 'query'} + }, + { + arg: 'search', + type: 'string', + http: {source: 'query'} + }, + { + arg: 'userFk', + type: 'number', + http: {source: 'query'} + }, + { + arg: 'created', + type: 'date', + http: {source: 'query'} + }, + ], + returns: { + type: ['object'], + root: true + }, + http: { + path: `/:id/logs`, + verb: 'GET' + } + }); + + Self.logs = async(ctx, id, filter, options) => { + const conn = Self.dataSource.connector; + const args = ctx.args; + const myOptions = {}; + let to; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + let where = buildFilter(args, (param, value) => { + switch (param) { + case 'search': + return { + or: [ + {changedModel: {like: `%${value}%`}}, + {oldInstance: {like: `%${value}%`}} + ] + }; + case 'userFk': + return {'cl.userFk': value}; + case 'created': + value.setHours(0, 0, 0, 0); + to = new Date(value); + to.setHours(23, 59, 59, 999); + + return {creationDate: {between: [value, to]}}; + } + }); + where = mergeWhere(where, {['cl.originFk']: id}); + filter = mergeFilters(args.filter, {where}); + + const stmts = []; + + const stmt = new ParameterizedSQL( + `SELECT + cl.id, + cl.userFk, + u.name AS userName, + cl.oldInstance, + cl.newInstance, + cl.changedModel, + cl.action, + cl.creationDate AS created + FROM claimLog cl + JOIN account.user u ON u.id = cl.userFk + ` + ); + + stmt.merge(conn.makeSuffix(filter)); + stmts.push(stmt); + + const sql = ParameterizedSQL.join(stmts, ';'); + const result = await conn.executeStmt(sql, myOptions); + + const logs = []; + for (const row of result) { + const changes = []; + const oldInstance = JSON.parse(row.oldInstance); + const newInstance = JSON.parse(row.newInstance); + const mergedProperties = [...Object.keys(oldInstance), ...Object.keys(newInstance)]; + const properties = new Set(mergedProperties); + for (const property of properties) { + let oldValue = oldInstance[property]; + let newValue = newInstance[property]; + + const change = { + property: property, + before: oldValue, + after: newValue, + }; + + changes.push(change); + } + + logs.push({ + model: row.changedModel, + action: row.action, + created: row.created, + userFk: row.userFk, + userName: row.userName, + changes: changes, + }); + } + + return logs; + }; +}; diff --git a/modules/claim/back/methods/claim/specs/log.spec.js b/modules/claim/back/methods/claim/specs/log.spec.js new file mode 100644 index 0000000000..980bf5593a --- /dev/null +++ b/modules/claim/back/methods/claim/specs/log.spec.js @@ -0,0 +1,12 @@ +const app = require('vn-loopback/server/server'); + +describe('claim log()', () => { + const claimId = 1; + const salesPersonId = 18; + + it('should return results filtering by user id', async() => { + const result = await app.models.Claim.logs({args: {userFk: salesPersonId}}, claimId); + + expect(result.length).toBeGreaterThan(0); + }); +}); diff --git a/modules/claim/back/models/claim.js b/modules/claim/back/models/claim.js index c9d7ee7d43..12fcaa3260 100644 --- a/modules/claim/back/models/claim.js +++ b/modules/claim/back/models/claim.js @@ -11,4 +11,5 @@ module.exports = Self => { require('../methods/claim/downloadFile')(Self); require('../methods/claim/claimPickupPdf')(Self); require('../methods/claim/claimPickupEmail')(Self); + require('../methods/claim/logs')(Self); }; From 9f4aed7d83d284609ea2a866fc265947b1e3738b Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 6 Mar 2023 13:44:03 +0100 Subject: [PATCH 05/15] Updated unit test --- modules/claim/back/methods/claim/specs/log.spec.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/claim/back/methods/claim/specs/log.spec.js b/modules/claim/back/methods/claim/specs/log.spec.js index 980bf5593a..0ae534f1e6 100644 --- a/modules/claim/back/methods/claim/specs/log.spec.js +++ b/modules/claim/back/methods/claim/specs/log.spec.js @@ -7,6 +7,17 @@ describe('claim log()', () => { it('should return results filtering by user id', async() => { const result = await app.models.Claim.logs({args: {userFk: salesPersonId}}, claimId); + const expectedObject = { + model: 'Claim', + action: 'update', + changes: [ + {property: 'hasToPickUp', before: false, after: true} + ] + }; + + const firstRow = result[0]; + expect(result.length).toBeGreaterThan(0); + expect(firstRow).toEqual(jasmine.objectContaining(expectedObject)); }); }); From 4a32c164a6f6adfe9992a321b919b0011507154a Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 7 Mar 2023 07:34:08 +0100 Subject: [PATCH 06/15] template string --- db/changes/230601/00-acl_claim.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/changes/230601/00-acl_claim.sql b/db/changes/230601/00-acl_claim.sql index ea96e130a6..4e680eb4fd 100644 --- a/db/changes/230601/00-acl_claim.sql +++ b/db/changes/230601/00-acl_claim.sql @@ -1,6 +1,6 @@ -INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) VALUES('ClaimBeginning', 'isEditable', 'READ', 'ALLOW', 'ROLE', 'employee'); -DELETE FROM salix.ACL +DELETE FROM `salix`.`ACL` WHERE model='Claim' AND property='isEditable'; From c0ff6bea57f60e3a7102070bba8a407286871f54 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 7 Mar 2023 07:47:30 +0100 Subject: [PATCH 07/15] fix(smartTable): fixed filtering with an intermediate check Refs: #5177 --- front/core/components/check/index.js | 2 +- front/core/components/smart-table/index.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/front/core/components/check/index.js b/front/core/components/check/index.js index 78b1807a5a..25ec506ad2 100644 --- a/front/core/components/check/index.js +++ b/front/core/components/check/index.js @@ -40,7 +40,7 @@ export default class Check extends Toggle { set tripleState(value) { this._tripleState = value; - this.field = this.field; + this.field = value; } get tripleState() { diff --git a/front/core/components/smart-table/index.js b/front/core/components/smart-table/index.js index ad98839503..b2380a62f8 100644 --- a/front/core/components/smart-table/index.js +++ b/front/core/components/smart-table/index.js @@ -436,6 +436,7 @@ export default class SmartTable extends Component { if (filters && filters.userFilter) this.model.userFilter = filters.userFilter; + this.addFilter(field, this.$inputsScope.searchProps[field]); } @@ -451,7 +452,7 @@ export default class SmartTable extends Component { } addFilter(field, value) { - if (value == '') value = null; + if (value === '') value = null; let stateFilter = {tableQ: {}}; if (this.$params.q) { @@ -462,7 +463,7 @@ export default class SmartTable extends Component { } const whereParams = {[field]: value}; - if (value) { + if (value !== '' && value !== null && value !== undefined) { let where = {[field]: value}; if (this.exprBuilder) { where = buildFilter(whereParams, (param, value) => From e8e8392e5da24a34d1c86edc9b5517ed7bea0b0c Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 7 Mar 2023 07:58:08 +0100 Subject: [PATCH 08/15] Updated changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bff0feed76..1cfc7e610d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - ### Fixed -- +- (Clientes -> Listado extendido) Resuelto error al filtrar por clientes inactivos desde la columna "Activo" ## [2308.01] - 2023-03-09 From 0d2339686cc13b39fd7b26c9f3fc67968568a482 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 7 Mar 2023 08:10:52 +0100 Subject: [PATCH 09/15] Updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cfc7e610d..cf7d8465a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - (Clientes -> Listado extendido) Resuelto error al filtrar por clientes inactivos desde la columna "Activo" +- (General) Al pasar el ratón por encima del icono de "Borrar" en un campo, se hacía más grande afectando a la interfaz ## [2308.01] - 2023-03-09 From 14a5c7830398d609a1757d97e7b5aa3973f5416a Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 7 Mar 2023 08:13:07 +0100 Subject: [PATCH 10/15] Updated unit test --- front/core/components/check/index.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/core/components/check/index.spec.js b/front/core/components/check/index.spec.js index c9d50cab21..7ec0f12a06 100644 --- a/front/core/components/check/index.spec.js +++ b/front/core/components/check/index.spec.js @@ -45,8 +45,8 @@ describe('Component vnCheck', () => { }); it(`should set value to null and change to true when clicked`, () => { - controller.field = null; controller.tripleState = true; + controller.field = null; element.click(); expect(controller.field).toEqual(true); From 445a0b0e1fa7feec96d9de1fc8b1015a19592422 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 7 Mar 2023 10:20:10 +0100 Subject: [PATCH 11/15] Claim fixes --- modules/claim/back/models/claim-beginning.js | 26 ++++++++++---------- modules/claim/front/detail/index.js | 4 +-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/claim/back/models/claim-beginning.js b/modules/claim/back/models/claim-beginning.js index 4283e37e25..ba70c0bbcc 100644 --- a/modules/claim/back/models/claim-beginning.js +++ b/modules/claim/back/models/claim-beginning.js @@ -29,21 +29,21 @@ module.exports = Self => { myOptions.transaction = ctx.options.transaction; const claimBeginning = await Self.findById(ctx.where.id); - + const filter = { - where: {id: claimBeginning.claimFk}, - include: [ - { - relation: 'claimState', - scope: { - fields: ['id', 'code', 'description'] - } - } - ] - }; - + where: {id: claimBeginning.claimFk}, + include: [ + { + relation: 'claimState', + scope: { + fields: ['id', 'code', 'description'] + } + } + ] + }; + const [claim] = await models.Claim.find(filter, myOptions); - const isEditable = await models.ClaimState.isEditable(httpCtx, claim.ClaimState()); + const isEditable = await models.ClaimState.isEditable(httpCtx, claim.claimState().id); if (!isEditable) throw new UserError(`The current claim can't be modified`); diff --git a/modules/claim/front/detail/index.js b/modules/claim/front/detail/index.js index 33ce1a5816..833519579a 100644 --- a/modules/claim/front/detail/index.js +++ b/modules/claim/front/detail/index.js @@ -100,8 +100,8 @@ class Controller extends Section { } setClaimedQuantity(id, claimedQuantity) { - let params = {id: id, quantity: claimedQuantity}; - let query = `ClaimBeginnings/`; + let params = {quantity: claimedQuantity}; + let query = `ClaimBeginnings/${id}`; this.$http.patch(query, params).then(() => { this.vnApp.showSuccess(this.$t('Data saved!')); this.calculateTotals(); From 3ad96b6ad73dad7697cdbe50fe6db62411a08c42 Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 7 Mar 2023 11:55:13 +0100 Subject: [PATCH 12/15] Endpoint fixes --- modules/worker/back/methods/worker/filter.js | 44 +++++++++++--------- modules/worker/front/search-panel/index.html | 2 +- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/modules/worker/back/methods/worker/filter.js b/modules/worker/back/methods/worker/filter.js index d08b27a184..71a8da96f2 100644 --- a/modules/worker/back/methods/worker/filter.js +++ b/modules/worker/back/methods/worker/filter.js @@ -13,55 +13,59 @@ module.exports = Self => { type: 'Object', description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string', http: {source: 'query'} - }, { - arg: 'tags', - type: ['Object'], - description: 'List of tags to filter with', - http: {source: 'query'} - }, { + }, + { arg: 'search', type: 'String', description: `If it's and integer searchs by id, otherwise it searchs by name`, http: {source: 'query'} - }, { + }, + { arg: 'id', type: 'Integer', description: 'The worker id', http: {source: 'query'} - }, { + }, + { arg: 'userFk', type: 'Integer', description: 'The user id', http: {source: 'query'} - }, { + }, + { arg: 'fi', type: 'String', description: 'The worker fi', http: {source: 'query'} - }, { + }, + { arg: 'departmentFk', type: 'Integer', description: 'The worker department id', http: {source: 'query'} - }, { + }, + { arg: 'extension', type: 'Integer', description: 'The worker extension id', http: {source: 'query'} - }, { + }, + { arg: 'firstName', type: 'String', description: 'The worker firstName', http: {source: 'query'} - }, { - arg: 'name', + }, + { + arg: 'lastName', type: 'String', - description: 'The worker name', + description: 'The worker lastName', http: {source: 'query'} - }, { - arg: 'nickname', + }, + { + arg: 'userName', type: 'String', - description: 'The worker nickname', + description: 'The worker user name', http: {source: 'query'} } ], @@ -93,10 +97,10 @@ module.exports = Self => { return {'w.id': value}; case 'userFk': return {'w.userFk': value}; - case 'name': - return {'w.lastName': {like: `%${value}%`}}; case 'firstName': return {'w.firstName': {like: `%${value}%`}}; + case 'lastName': + return {'w.lastName': {like: `%${value}%`}}; case 'extension': return {'p.extension': value}; case 'fi': diff --git a/modules/worker/front/search-panel/index.html b/modules/worker/front/search-panel/index.html index ca57722c81..2adb565876 100644 --- a/modules/worker/front/search-panel/index.html +++ b/modules/worker/front/search-panel/index.html @@ -30,7 +30,7 @@ + ng-model="filter.lastName"> From 9050c069943d5a9c2e101db992dbb447335b0d26 Mon Sep 17 00:00:00 2001 From: joan Date: Wed, 8 Mar 2023 07:44:56 +0100 Subject: [PATCH 13/15] Updated unit test --- modules/worker/back/methods/worker/specs/filter.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/worker/back/methods/worker/specs/filter.spec.js b/modules/worker/back/methods/worker/specs/filter.spec.js index c1bc05ae8b..2eb3535763 100644 --- a/modules/worker/back/methods/worker/specs/filter.spec.js +++ b/modules/worker/back/methods/worker/specs/filter.spec.js @@ -16,7 +16,7 @@ describe('worker filter()', () => { }); it('should return 2 results filtering by name', async() => { - let result = await app.models.Worker.filter({args: {filter: {}, name: 'agency'}}); + let result = await app.models.Worker.filter({args: {filter: {}, firstName: 'agency'}}); expect(result.length).toEqual(2); expect(result[0].nickname).toEqual('agencyNick'); From 98c8cd67e5740319588248bcf999b96648966f53 Mon Sep 17 00:00:00 2001 From: jgallego Date: Wed, 8 Mar 2023 07:45:22 +0100 Subject: [PATCH 14/15] minor bug --- modules/claim/back/models/claim-beginning.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/claim/back/models/claim-beginning.js b/modules/claim/back/models/claim-beginning.js index 4283e37e25..271949c48e 100644 --- a/modules/claim/back/models/claim-beginning.js +++ b/modules/claim/back/models/claim-beginning.js @@ -11,7 +11,7 @@ module.exports = Self => { Self.observe('before save', async ctx => { if (ctx.isNewInstance) return; - await claimIsEditable(ctx); + //await claimIsEditable(ctx); }); Self.observe('before delete', async ctx => { @@ -43,7 +43,7 @@ module.exports = Self => { }; const [claim] = await models.Claim.find(filter, myOptions); - const isEditable = await models.ClaimState.isEditable(httpCtx, claim.ClaimState()); + const isEditable = await models.ClaimState.isEditable(httpCtx, claim.claimState().id); if (!isEditable) throw new UserError(`The current claim can't be modified`); From c93d3f884687449ff623888cb9c392a022293c7c Mon Sep 17 00:00:00 2001 From: joan Date: Wed, 8 Mar 2023 07:47:25 +0100 Subject: [PATCH 15/15] Updated front unit test --- modules/claim/front/detail/index.spec.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/claim/front/detail/index.spec.js b/modules/claim/front/detail/index.spec.js index a2b177281c..8f30493395 100644 --- a/modules/claim/front/detail/index.spec.js +++ b/modules/claim/front/detail/index.spec.js @@ -89,9 +89,12 @@ describe('claim', () => { describe('setClaimedQuantity(id, claimedQuantity)', () => { it('should make a patch and call refresh and showSuccess', () => { + const id = 1; + const claimedQuantity = 1; + jest.spyOn(controller.vnApp, 'showSuccess'); - $httpBackend.expectPATCH(`ClaimBeginnings/`).respond({}); - controller.setClaimedQuantity(1, 1); + $httpBackend.expectPATCH(`ClaimBeginnings/${id}`).respond({}); + controller.setClaimedQuantity(id, claimedQuantity); $httpBackend.flush(); expect(controller.vnApp.showSuccess).toHaveBeenCalled();