Add top campaign clients endpoint
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m39s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m39s
This commit is contained in:
93
backend/test/campaignService.test.js
Normal file
93
backend/test/campaignService.test.js
Normal file
@@ -0,0 +1,93 @@
|
||||
const assert = require('node:assert/strict');
|
||||
const test = require('node:test');
|
||||
|
||||
const withCampaignService = async (queryHandler, callback) => {
|
||||
const dbPath = require.resolve('../db');
|
||||
const servicePath = require.resolve('../services/campaignService');
|
||||
const originalDbCache = require.cache[dbPath];
|
||||
const originalServiceCache = require.cache[servicePath];
|
||||
const queries = [];
|
||||
|
||||
delete require.cache[servicePath];
|
||||
require.cache[dbPath] = {
|
||||
id: dbPath,
|
||||
filename: dbPath,
|
||||
loaded: true,
|
||||
exports: {
|
||||
pool: {
|
||||
query: async (sql, params = []) => {
|
||||
queries.push({ sql, params });
|
||||
return queryHandler(sql, params);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
try {
|
||||
const service = require('../services/campaignService');
|
||||
return await callback(service, queries);
|
||||
} finally {
|
||||
delete require.cache[servicePath];
|
||||
if (originalServiceCache) {
|
||||
require.cache[servicePath] = originalServiceCache;
|
||||
}
|
||||
if (originalDbCache) {
|
||||
require.cache[dbPath] = originalDbCache;
|
||||
} else {
|
||||
delete require.cache[dbPath];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
test('getTopClientsForCampaign returns top clients for an explicit date range', async () => {
|
||||
await withCampaignService(async () => ({
|
||||
rows: [
|
||||
{
|
||||
nome: 'Cliente A',
|
||||
fone: '5516999999901',
|
||||
total_gasto: '1234.50',
|
||||
total_comprado: '18',
|
||||
total_pedidos: 4,
|
||||
ultima_compra: '2026-07-27'
|
||||
}
|
||||
]
|
||||
}), async ({ getTopClientsForCampaign }, queries) => {
|
||||
const result = await getTopClientsForCampaign({
|
||||
start: '2026-06-28',
|
||||
end: '2026-07-27',
|
||||
limit: '1000'
|
||||
});
|
||||
|
||||
assert.equal(result.start, '2026-06-28');
|
||||
assert.equal(result.end, '2026-07-27');
|
||||
assert.equal(result.limit, 1000);
|
||||
assert.equal(result.count, 1);
|
||||
assert.deepEqual(result.customers[0], {
|
||||
nome: 'Cliente A',
|
||||
fone: '5516999999901',
|
||||
total_gasto: 1234.5,
|
||||
total_comprado: 18,
|
||||
total_pedidos: 4,
|
||||
ultima_compra: '2026-07-27'
|
||||
});
|
||||
|
||||
assert.equal(queries.length, 1);
|
||||
assert.deepEqual(queries[0].params, ['2026-06-28', '2026-07-27', 1000]);
|
||||
assert.match(queries[0].sql, /customer_key NOT LIKE 'name:%'/);
|
||||
assert.match(queries[0].sql, /ORDER BY total_gasto DESC/);
|
||||
});
|
||||
});
|
||||
|
||||
test('getTopClientsForCampaign derives an inclusive 30 day range from the end date', async () => {
|
||||
await withCampaignService(async () => ({ rows: [] }), async ({ getTopClientsForCampaign }, queries) => {
|
||||
const result = await getTopClientsForCampaign({
|
||||
days: '30',
|
||||
end: '2026-07-27'
|
||||
});
|
||||
|
||||
assert.equal(result.start, '2026-06-28');
|
||||
assert.equal(result.end, '2026-07-27');
|
||||
assert.equal(result.limit, 1000);
|
||||
assert.deepEqual(queries[0].params, ['2026-06-28', '2026-07-27', 1000]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user