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); });