Files
biz_xfj_cloud/test/common/terminal_device_status_test.dart
T
2026-09-04 16:23:30 +08:00

225 lines
7.4 KiB
Dart

import 'dart:async';
import 'package:flutter_test/flutter_test.dart';
import 'package:pj_supermarket_cloud/common/index.dart';
void main() {
setUp(AppDeviceStatusTool.resetForTest);
test('设备状态快照支持 JSON 往返与缺失字段兼容', () {
final time = DateTime(2026, 7, 24, 12, 30);
final snapshot = TerminalDeviceStatusSnapshot(
printerAvailable: true,
steelyardAvailable: false,
cardReaderAvailable: true,
subScreenAvailable: true,
cameraAvailable: true,
updatedAt: time,
);
expect(
TerminalDeviceStatusSnapshot.tryParse(snapshot.toCacheString()),
snapshot,
);
final compatible = TerminalDeviceStatusSnapshot.fromJson(
const {'printerAvailable': true},
);
expect(compatible.printerAvailable, isTrue);
expect(compatible.steelyardAvailable, isFalse);
expect(compatible.cardReaderAvailable, isFalse);
expect(compatible.subScreenAvailable, isFalse);
expect(compatible.cameraAvailable, isFalse);
expect(compatible.updatedAt, isNull);
expect(TerminalDeviceStatusSnapshot.tryParse('invalid-json'), isNull);
});
test('单项状态更新保留其他设备结果', () {
AppDeviceStatusTool.updatePrinter(true, persist: false);
AppDeviceStatusTool.updateCardReader(true, persist: false);
final status = AppDeviceStatusTool.status.value;
expect(status.printerAvailable, isTrue);
expect(status.cardReaderAvailable, isTrue);
expect(status.steelyardAvailable, isFalse);
expect(status.subScreenAvailable, isFalse);
expect(status.cameraAvailable, isFalse);
expect(status.updatedAt, isNotNull);
});
test('设备离线时同步清除瞬时工作状态', () {
AppDeviceStatusTool.updatePrinter(true, persist: false);
AppDeviceStatusTool.updatePrinterWorking(true);
AppDeviceStatusTool.updatePrinter(false, persist: false);
expect(AppDeviceStatusTool.printerWorking.value, isFalse);
});
test('重复完整刷新复用同一执行任务', () async {
final printerCompleter = Completer<bool>();
var printerCalls = 0;
Future<bool> printerProbe() {
printerCalls++;
return printerCompleter.future;
}
final first = AppDeviceStatusTool.refreshAll(
printerProbe: printerProbe,
steelyardProbe: () async => true,
cardReaderProbe: () async => false,
subScreenProbe: () async => true,
cameraProbe: () async => true,
persist: false,
deviceMinimumDuration: Duration.zero,
);
final second = AppDeviceStatusTool.refreshAll(
printerProbe: () async => false,
steelyardProbe: () async => false,
cardReaderProbe: () async => false,
subScreenProbe: () async => false,
cameraProbe: () async => false,
persist: false,
deviceMinimumDuration: Duration.zero,
);
expect(identical(first, second), isTrue);
expect(printerCalls, 1);
printerCompleter.complete(true);
final result = await first;
expect(result.printerAvailable, isTrue);
expect(result.steelyardAvailable, isTrue);
expect(result.cardReaderAvailable, isFalse);
expect(result.subScreenAvailable, isTrue);
expect(result.cameraAvailable, isTrue);
});
testWidgets('单个设备探测超过10秒后继续检查下一项', (tester) async {
final printerCompleter = Completer<bool>();
final refresh = AppDeviceStatusTool.refreshAll(
printerProbe: () => printerCompleter.future,
steelyardProbe: () async => true,
cardReaderProbe: () async => true,
subScreenProbe: () async => true,
cameraProbe: () async => true,
persist: false,
deviceMinimumDuration: Duration.zero,
);
expect(
AppDeviceStatusTool.progress.value.currentDevice,
TerminalDeviceType.printer,
);
expect(
AppDeviceStatusTool.progress.value.message,
'正在检查打印机,剩余 10s,点击取消',
);
await tester.pump(const Duration(seconds: 1));
expect(AppDeviceStatusTool.progress.value.remainingSeconds, 9);
await tester.pump(const Duration(seconds: 9));
await tester.pump();
final result = await refresh;
expect(result.printerAvailable, isFalse);
expect(result.steelyardAvailable, isTrue);
expect(result.cardReaderAvailable, isTrue);
expect(result.subScreenAvailable, isTrue);
expect(result.cameraAvailable, isTrue);
});
testWidgets('探测秒回时每种设备仍至少展示2秒', (tester) async {
final refresh = AppDeviceStatusTool.refreshAll(
printerProbe: () async => false,
steelyardProbe: () async => false,
cardReaderProbe: () async => false,
subScreenProbe: () async => false,
cameraProbe: () async => false,
persist: false,
);
expect(
AppDeviceStatusTool.progress.value.currentDevice,
TerminalDeviceType.printer,
);
await tester.pump(const Duration(seconds: 1));
expect(
AppDeviceStatusTool.progress.value.currentDevice,
TerminalDeviceType.printer,
);
await tester.pump(const Duration(seconds: 1));
await tester.pump();
expect(
AppDeviceStatusTool.progress.value.currentDevice,
TerminalDeviceType.steelyard,
);
await tester.pump(const Duration(seconds: 2));
await tester.pump();
expect(
AppDeviceStatusTool.progress.value.currentDevice,
TerminalDeviceType.cardReader,
);
await tester.pump(const Duration(seconds: 2));
await tester.pump();
expect(
AppDeviceStatusTool.progress.value.currentDevice,
TerminalDeviceType.subScreen,
);
await tester.pump(const Duration(seconds: 2));
await tester.pump();
expect(
AppDeviceStatusTool.progress.value.currentDevice,
TerminalDeviceType.camera,
);
await tester.pump(const Duration(seconds: 2));
await tester.pump();
final result = await refresh;
expect(result.printerAvailable, isFalse);
expect(result.steelyardAvailable, isFalse);
expect(result.cardReaderAvailable, isFalse);
expect(result.subScreenAvailable, isFalse);
expect(result.cameraAvailable, isFalse);
expect(AppDeviceStatusTool.progress.value.running, isFalse);
});
test('设备检查支持用户取消', () async {
final printerCompleter = Completer<bool>();
var replacementProbeCalls = 0;
final refresh = AppDeviceStatusTool.refreshAll(
printerProbe: () async => true,
steelyardProbe: () => printerCompleter.future,
cardReaderProbe: () async => true,
subScreenProbe: () async => true,
cameraProbe: () async => true,
persist: false,
deviceMinimumDuration: Duration.zero,
);
await Future<void>.delayed(Duration.zero);
AppDeviceStatusTool.cancelRefresh();
final repeated = AppDeviceStatusTool.refreshAll(
printerProbe: () async {
replacementProbeCalls++;
return false;
},
steelyardProbe: () async => false,
cardReaderProbe: () async => false,
subScreenProbe: () async => false,
cameraProbe: () async => false,
persist: false,
deviceMinimumDuration: Duration.zero,
);
// Dart Future 无法强制中断已进入原生插件的调用,取消后仍需等当前探测返回,避免重复访问硬件。
expect(identical(refresh, repeated), isTrue);
expect(replacementProbeCalls, 0);
printerCompleter.complete(true);
await expectLater(repeated, throwsA(isA<TerminalDeviceCheckCancelled>()));
expect(AppDeviceStatusTool.progress.value.running, isFalse);
});
}