Updated unit tests
gitea/salix/pipeline/head This commit looks good Details

This commit is contained in:
Joan Sanchez 2022-02-14 08:44:22 +01:00
parent f4ff854a1f
commit 5518fac357
5 changed files with 153 additions and 49 deletions

View File

@ -23,7 +23,7 @@
<vn-button disabled="$ctrl.checked.length === 0"
icon="show_chart"
ng-click="filters.show($event)"
vn-tooltip="Client consumption">
vn-tooltip="Campaign consumption">
</vn-button>
</slot-actions>
<slot-table>
@ -87,7 +87,7 @@
<vn-popover vn-id="filters">
<div class="vn-pa-lg">
<form ng-submit="$ctrl.onSendClientConsumption()">
<vn-horizontal><h4>Client consumption</h4></vn-horizontal>
<vn-horizontal><h4 translate>Campaign consumption</h4></vn-horizontal>
<vn-horizontal>
<vn-autocomplete vn-one
url="Campaigns/latest"
@ -119,7 +119,7 @@
</vn-date-picker>
</vn-horizontal>
<vn-horizontal class="vn-mt-lg">
<vn-submit label="send"></vn-submit>
<vn-submit label="Send"></vn-submit>
</vn-horizontal>
</form>
</div>

View File

@ -35,7 +35,6 @@ export default class Controller extends Section {
to: null
};
// if (!this.dateParams)
this.getUpcomingCampaing();
}
@ -56,9 +55,8 @@ export default class Controller extends Section {
}
getUpcomingCampaing() {
this.$http.get('Campaigns/upcoming').then(res => {
this.campaign.id = res.data.id;
});
this.$http.get('Campaigns/upcoming')
.then(res => this.campaign.id = res.data.id);
}
get campaignSelection() {
@ -77,14 +75,6 @@ export default class Controller extends Section {
}
}
get clientConsumptionParams() {
const userParams = this.$.model.userParams;
return Object.assign({
recipient: this.client.email,
recipientId: this.client.id
}, userParams);
}
onSendClientConsumption() {
const clientIds = this.checked.map(client => client.id);
const params = Object.assign({
@ -93,7 +83,7 @@ export default class Controller extends Section {
this.$http.post('notify/consumption', params)
.then(() => this.$.filters.hide())
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
.then(() => this.vnApp.showSuccess(this.$t('Notifications sent!')));
}
exprBuilder(param, value) {

View File

@ -0,0 +1,99 @@
import './index';
import crudModel from 'core/mocks/crud-model';
describe('Client notification', () => {
describe('Component vnClientNotification', () => {
let controller;
let $httpBackend;
beforeEach(ngModule('client'));
beforeEach(inject(($componentController, _$httpBackend_) => {
$httpBackend = _$httpBackend_;
const $element = angular.element('<vn-client-notification></vn-client-notification>');
controller = $componentController('vnClientNotification', {$element});
controller.$.model = crudModel;
controller.$.model.data = [
{id: 1101},
{id: 1102},
{id: 1103}
];
$httpBackend.expect('GET', `Campaigns/upcoming`).respond(200, {id: 1});
}));
describe('checked() getter', () => {
it('should return the checked lines', () => {
const data = controller.$.model.data;
data[1].$checked = true;
data[2].$checked = true;
const checkedRows = controller.checked;
const firstCheckedRow = checkedRows[0];
const secondCheckedRow = checkedRows[1];
expect(firstCheckedRow.id).toEqual(1102);
expect(secondCheckedRow.id).toEqual(1103);
});
});
describe('campaignSelection() setter', () => {
it('should set the campaign from and to properties', () => {
const dated = new Date();
controller.campaignSelection = {
dated: dated,
scopeDays: 14
};
const expectedDateTo = new Date(dated);
expectedDateTo.setDate(expectedDateTo.getDate() - 14);
const campaign = controller.campaign;
expect(campaign.from).toEqual(expectedDateTo);
expect(campaign.to).toEqual(dated);
});
});
describe('onSendClientConsumption()', () => {
it('should return saved message', () => {
jest.spyOn(controller.vnApp, 'showSuccess');
controller.$.filters = {hide: () => {}};
controller.campaign = {
id: 1,
from: new Date(),
to: new Date()
};
const data = controller.$.model.data;
data[0].$checked = true;
data[1].$checked = true;
const params = Object.assign({
clientIds: [1101, 1102]
}, controller.campaign);
$httpBackend.expect('POST', `notify/consumption`, params).respond(200, params);
controller.onSendClientConsumption();
$httpBackend.flush();
expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Notifications sent!');
});
});
describe('exprBuilder()', () => {
it('should search by sales person', () => {
let expr = controller.exprBuilder('salesPersonFk', '5');
expect(expr).toEqual({'salesPersonFk': '5'});
});
it('should search by client social name', () => {
let expr = controller.exprBuilder('socialName', '1foo');
expect(expr).toEqual({'socialName': {like: '%1foo%'}});
});
});
});
});

View File

@ -0,0 +1,2 @@
Campaign consumption: Consumo campaña
Send: Enviar

View File

@ -2,44 +2,57 @@ const db = require('vn-print/core/database');
const Email = require('vn-print/core/email');
module.exports = async function(request, response, next) {
const reqArgs = request.body;
try {
const reqArgs = request.body;
if (!reqArgs.clientIds)
throw new Error('The argument clientIds is required');
if (!reqArgs.from)
throw new Error('The argument from is required');
if (!reqArgs.to)
throw new Error('The argument to is required');
if (!reqArgs.clientIds)
throw new Error('The argument clientIds is required');
if (!reqArgs.from)
throw new Error('The argument from is required');
if (!reqArgs.to)
throw new Error('The argument to is required');
response.status(200).json({
message: 'Success'
});
response.status(200).json({
message: 'Success'
});
for (const clientId of reqArgs.clientIds) {
const client = await db.findOne(`
SELECT
c.email,
eu.email salesPersonEmail
FROM client c
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
JOIN ticket t ON t.clientFk = c.id
JOIN sale s ON s.ticketFk = t.id
JOIN item i ON i.id = s.itemFk
JOIN itemType it ON it.id = i.typeFk
WHERE c.id = ?
AND it.isPackaging = FALSE
AND DATE(t.shipped) BETWEEN ? AND ?
GROUP BY c.id`, [clientId, reqArgs.from, reqArgs.to]);
const clientIds = reqArgs.clientIds;
if (client) {
const args = Object.assign({
recipientId: clientId,
recipient: client.email,
replyTo: client.salesPersonEmail
}, response.locals);
const clients = await db.rawSql(`
SELECT
c.id,
c.email,
eu.email salesPersonEmail
FROM client c
JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk
JOIN ticket t ON t.clientFk = c.id
JOIN sale s ON s.ticketFk = t.id
JOIN item i ON i.id = s.itemFk
JOIN itemType it ON it.id = i.typeFk
WHERE c.id IN(?)
AND it.isPackaging = FALSE
AND DATE(t.shipped) BETWEEN ? AND ?
GROUP BY c.id`, [clientIds, reqArgs.from, reqArgs.to]);
const email = new Email('campaign-metrics', args);
await email.send();
const clientData = new Map();
for (const client of clients)
clientData.set(client.id, client);
for (const clientId of reqArgs.clientIds) {
const client = clientData.get(clientId);
if (client) {
const args = Object.assign({
recipientId: clientId,
recipient: client.email,
replyTo: client.salesPersonEmail
}, response.locals);
const email = new Email('campaign-metrics', args);
await email.send();
}
}
} catch (error) {
next(error);
}
};