225 lines
7.4 KiB
Dart
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);
|
|
});
|
|
}
|