Files
hms/apps/miniprogram/__tests__/services/ble/BLEManager.test.ts
iven 62c02e0f15
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
feat(miniprogram): BLE 增强层 — DataBuffer + GenericBleAdapter + DataSyncScheduler
- DataBuffer: 离线持久化缓冲(分桶存储 + 去重 + 容量管理)
- GenericBleAdapter: 基于 Bluetooth SIG 标准 Health Profile 的通用适配器
  (Heart Rate 0x180D / Health Thermometer 0x1809 / Blood Pressure 0x1810)
- DataSyncScheduler: 定时自动同步调度(基于时间间隔判断是否需要同步)
- BLEManager: 集成 DataBuffer 替换简单 Storage 缓存
- device-sync 页面: 注册 CustomBandAdapter + 自动同步 + 状态显示
- 新增 vitest 单元测试配置,30 个测试全部通过
2026-05-04 02:42:58 +08:00

70 lines
2.5 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
// 使用 vi.hoisted 确保 storage 在 mock 提升前可用
const { storage } = vi.hoisted(() => ({
storage: new Map<string, string>(),
}));
vi.mock('@tarojs/taro', () => ({
default: {
openBluetoothAdapter: vi.fn().mockResolvedValue({}),
closeBluetoothAdapter: vi.fn().mockResolvedValue({}),
startBluetoothDevicesDiscovery: vi.fn().mockResolvedValue({}),
stopBluetoothDevicesDiscovery: vi.fn().mockResolvedValue({}),
onBluetoothDeviceFound: vi.fn(),
offBluetoothDeviceFound: vi.fn(),
createBLEConnection: vi.fn().mockResolvedValue({}),
closeBLEConnection: vi.fn().mockResolvedValue({}),
getBLEDeviceServices: vi.fn().mockResolvedValue({ services: [] }),
getBLEDeviceCharacteristics: vi.fn().mockResolvedValue({ characteristics: [] }),
notifyBLECharacteristicValueChange: vi.fn().mockResolvedValue({}),
onBLECharacteristicValueChange: vi.fn(),
onBLEConnectionStateChange: vi.fn(),
getStorageSync: vi.fn((key: string) => storage.get(key) || ''),
setStorageSync: vi.fn((key: string, value: string) => { storage.set(key, value); }),
removeStorageSync: vi.fn((key: string) => { storage.delete(key); }),
},
}));
import { BLEManager } from '@/services/ble/BLEManager';
import { XiaomiBandAdapter } from '@/services/ble/adapters/XiaomiBandAdapter';
describe('BLEManager DataBuffer 集成', () => {
let manager: BLEManager;
beforeEach(() => {
storage.clear();
manager = new BLEManager();
manager.registerAdapter(XiaomiBandAdapter);
});
afterEach(async () => {
await manager.destroy();
});
it('registerAdapter 添加适配器', () => {
const count = (manager as any).adapters.length;
expect(count).toBeGreaterThanOrEqual(1);
});
it('getCachedReadings 返回空数组(未连接时)', () => {
const readings = manager.getCachedReadings();
expect(readings).toEqual([]);
});
it('flushPendingReadings 无缓存时返回 0', async () => {
const uploadFn = vi.fn().mockResolvedValue(0);
const count = await manager.flushPendingReadings(uploadFn);
expect(count).toBe(0);
expect(uploadFn).not.toHaveBeenCalled();
});
it('DataBuffer 实例已初始化', () => {
const buffer = (manager as any).dataBuffer;
expect(buffer).toBeDefined();
expect(typeof buffer.push).toBe('function');
expect(typeof buffer.flush).toBe('function');
expect(typeof buffer.restore).toBe('function');
});
});