cangku/backend/test/dashboardRoutes.test.js

55 lines
2.2 KiB
JavaScript

const assert = require('node:assert/strict');
const test = require('node:test');
const Module = require('node:module');
const express = require('express');
function loadDashboardRouter() {
const originalLoad = Module._load;
Module._load = function load(id, parent, ...rest) {
if (parent?.filename.endsWith('/api/dashboard.js') && id.endsWith('/jianSunDatabase')) {
return {
query: async (sql) => {
if (sql.includes('SELECT DISTINCT shopName')) return [{ shopName: '测试店铺' }];
if (sql.includes('FROM dbo.pdd_DataGoods g')) {
return [{
statDate: '2026-09-12', latestDate: '2026-09-12', payAmount: 100,
buyerCount: 2, visitorCount: 10, goodsPv: 20, payGoodsQty: 3,
payOrderCount: 2, favoriteCount: 1, impressionCount: 30,
}];
}
if (sql.includes('FROM dbo.pdd_MallServiceScore')) return [{ shopCount: 1, cstmrServScore: 4.8 }];
if (sql.includes('FROM dbo.pdd_ShopStars')) return [{ shopCount: 1, mallStarTomms: 5 }];
return [];
},
};
}
return originalLoad.call(this, id, parent, ...rest);
};
try {
return require('../src/api/dashboard');
} finally {
Module._load = originalLoad;
}
}
test('dashboard keeps its read-only data endpoints after product analysis is retired', async () => {
const app = express();
app.use('/api/dashboard', loadDashboardRouter());
const server = await new Promise((resolve) => {
const listener = app.listen(0, '127.0.0.1', () => resolve(listener));
});
try {
const base = `http://127.0.0.1:${server.address().port}`;
const meta = await (await fetch(`${base}/api/dashboard/meta`)).json();
assert.deepEqual(meta.data.shops, ['测试店铺']);
const summary = await (await fetch(`${base}/api/dashboard/summary?period=day`)).json();
assert.equal(summary.success, true);
assert.equal(summary.data.latestDate, '2026-09-12');
assert.equal(summary.data.metrics.find((item) => item.key === 'payAmount').value, 100);
assert.equal((await fetch(`${base}/api/product-analysis/products`)).status, 404);
} finally {
await new Promise((resolve) => server.close(resolve));
}
});