84 lines
3.5 KiB
TypeScript
84 lines
3.5 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import app from './index.js';
|
|
import {
|
|
parseHydrogenCustomerKind,
|
|
parseElectricVehicleScope,
|
|
parseHydrogenCustomerName,
|
|
parseHydrogenStationId,
|
|
parseEnergyDate,
|
|
parseEtcLimit,
|
|
parseEtcPage,
|
|
parseEtcSearch,
|
|
} from './query.js';
|
|
|
|
test('parses only non-negative integer station ids', () => {
|
|
assert.equal(parseHydrogenStationId('0'), 0);
|
|
assert.equal(parseHydrogenStationId('18'), 18);
|
|
assert.equal(parseHydrogenStationId('-1'), null);
|
|
assert.equal(parseHydrogenStationId('1 OR 1=1'), null);
|
|
assert.equal(parseHydrogenStationId(undefined), null);
|
|
});
|
|
|
|
test('defaults unknown customer scopes to lingniu', () => {
|
|
assert.equal(parseHydrogenCustomerKind('external'), 'external');
|
|
assert.equal(parseHydrogenCustomerKind('all'), 'all');
|
|
assert.equal(parseHydrogenCustomerKind('invalid'), 'lingniu');
|
|
assert.equal(parseHydrogenCustomerKind(undefined), 'lingniu');
|
|
});
|
|
|
|
test('parses explicit electric vehicle scopes', () => {
|
|
assert.equal(parseElectricVehicleScope('all'), 'all');
|
|
assert.equal(parseElectricVehicleScope('lingniu'), 'lingniu');
|
|
assert.equal(parseElectricVehicleScope('external'), 'external');
|
|
assert.equal(parseElectricVehicleScope(undefined), 'lingniu');
|
|
assert.equal(parseElectricVehicleScope('unknown'), null);
|
|
});
|
|
|
|
test('normalizes bounded customer names for exact matching', () => {
|
|
assert.equal(parseHydrogenCustomerName(' 武汉客户 '), '武汉客户');
|
|
assert.equal(parseHydrogenCustomerName('未指定客户'), '未指定客户');
|
|
assert.equal(parseHydrogenCustomerName(' '), null);
|
|
assert.equal(parseHydrogenCustomerName('x'.repeat(129)), null);
|
|
assert.equal(parseHydrogenCustomerName(undefined), null);
|
|
});
|
|
|
|
test('rejects invalid entity filters before querying hydrogen data', async () => {
|
|
const invalidStation = await app.request('/hydrogen/daily?stationId=-1');
|
|
assert.equal(invalidStation.status, 400);
|
|
assert.deepEqual(await invalidStation.json(), { error: 'stationId 必须是非负整数' });
|
|
|
|
const invalidCustomer = await app.request(`/hydrogen/daily?customerName=${'x'.repeat(129)}`);
|
|
assert.equal(invalidCustomer.status, 400);
|
|
assert.deepEqual(await invalidCustomer.json(), { error: 'customerName 必须是 1-128 个字符' });
|
|
});
|
|
|
|
test('parses only valid energy calendar dates', () => {
|
|
assert.equal(parseEnergyDate('2026-07-24'), '2026-07-24');
|
|
assert.equal(parseEnergyDate('2026-02-31'), null);
|
|
assert.equal(parseEnergyDate('2026-7-24'), null);
|
|
assert.equal(parseEnergyDate(undefined), null);
|
|
});
|
|
|
|
test('bounds ETC list pagination and search input', () => {
|
|
assert.equal(parseEtcPage('3'), 3);
|
|
assert.equal(parseEtcPage('-1'), 1);
|
|
assert.equal(parseEtcLimit('5'), 10);
|
|
assert.equal(parseEtcLimit('500'), 100);
|
|
assert.equal(parseEtcSearch(' 粤A '), '粤A');
|
|
assert.equal(parseEtcSearch('x'.repeat(129)), null);
|
|
});
|
|
|
|
test('rejects invalid electric drill filters before querying data', async () => {
|
|
const invalidDate = await app.request('/electric/orders?date=2026-02-31&customer=lingniu');
|
|
assert.equal(invalidDate.status, 400);
|
|
assert.deepEqual(await invalidDate.json(), { error: 'date 必须是有效的 YYYY-MM-DD 日期' });
|
|
|
|
const invalidScope = await app.request('/electric/orders?date=2026-07-28&customer=unknown');
|
|
assert.equal(invalidScope.status, 400);
|
|
assert.deepEqual(await invalidScope.json(), { error: 'customer 必须是 all、lingniu 或 external' });
|
|
|
|
const invalidMonthlyScope = await app.request('/electric/monthly?customer=unknown');
|
|
assert.equal(invalidMonthlyScope.status, 400);
|
|
});
|