chenyc
2026-05-20 c8ba0f92b3f84273a78f06de25359db20c1b2a4d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const assert = require('assert');
const { formatReceivedTimestamp, normalizeIp, TcpService } = require('../tcp-service');
const { buildFrame, buildBloodPressurePayload } = require('../tcp-simulator');
 
describe('tcp-service', () => {
  it('normalizes IPv4 mapped addresses', () => {
    assert.strictEqual(normalizeIp('::ffff:192.168.1.10'), '192.168.1.10');
    assert.strictEqual(normalizeIp('127.0.0.1'), '127.0.0.1');
  });
 
  it('formats receive timestamp', () => {
    assert.strictEqual(formatReceivedTimestamp(new Date('2026-05-12T10:20:30')), '2026-05-12 10:20:30');
  });
 
  it('adds M when blood pressure frame is handled', async () => {
    let receivedMetric = null;
    const service = new TcpService({
      tcpConfig: { maxBufferBytes: 8192 },
      devices: [],
      alModelPath: './alModel.json',
      logger: { info() {}, warn() {}, error() {}, debug() {} },
      onMetric(_device, metric) {
        receivedMetric = metric;
      },
    });
    const fakeSocket = {};
 
    service.sessions.set(fakeSocket, {
      device: { deviceId: 'JH-001', ip: '127.0.0.1' },
      decoder: {
        push() {
          return [{
            ok: true,
            publish: true,
            messageType: 'blood-pressure',
            metric: { N: 120, O: 80, P: 76 },
          }];
        },
      },
    });
 
    service.handleData(fakeSocket, buildFrame(1, 0x01, 0x01, buildBloodPressurePayload()));
 
    assert.strictEqual(receivedMetric.N, 120);
    assert.strictEqual(receivedMetric.O, 80);
    assert.strictEqual(receivedMetric.P, 76);
    assert.match(receivedMetric.M, /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/);
  });
});