From 29c70e0107b7eace5ab3a8c6cc67a66268108c11 Mon Sep 17 00:00:00 2001 From: Ochenstarik Date: Thu, 24 Sep 2026 16:54:41 +0700 Subject: [PATCH] refactor(terminal): decouple scanner via IFingerprintScanner factory and fix test cancellation token --- apps/KronaStaffTerminal.Tests/ScannerRecoveryTests.cs | 4 ++-- apps/KronaStaffTerminal/MainPage.xaml.cs | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/KronaStaffTerminal.Tests/ScannerRecoveryTests.cs b/apps/KronaStaffTerminal.Tests/ScannerRecoveryTests.cs index 433ed23..735bb4c 100644 --- a/apps/KronaStaffTerminal.Tests/ScannerRecoveryTests.cs +++ b/apps/KronaStaffTerminal.Tests/ScannerRecoveryTests.cs @@ -88,7 +88,7 @@ public class ScannerRecoveryTests int retries = 0; while (retries < 5) { - await Task.Delay(10); + await Task.Delay(10, TestContext.Current.CancellationToken); try { scanner.Connect(0, Array.Empty<(int, string)>()); @@ -106,7 +106,7 @@ public class ScannerRecoveryTests scanner.SimulateDisconnect(); // Emulate the hardware coming back after a short delay - await Task.Delay(20); + await Task.Delay(20, TestContext.Current.CancellationToken); scanner.AddVirtualDevice(0, "SLK20R", "SERIAL"); // ensure device is discoverable if it was cleared await reconnectTcs.Task; diff --git a/apps/KronaStaffTerminal/MainPage.xaml.cs b/apps/KronaStaffTerminal/MainPage.xaml.cs index 99c4bde..1a4d976 100644 --- a/apps/KronaStaffTerminal/MainPage.xaml.cs +++ b/apps/KronaStaffTerminal/MainPage.xaml.cs @@ -17,8 +17,12 @@ public sealed partial class MainPage : Page private readonly AttendanceSyncService _attendanceSync = new(); private readonly AttendanceTracker _attendanceTracker = new(); private readonly TerminalIpcClient _ipcClient = new(); - private readonly FingerprintScanner _scanner = new(); + private readonly IFingerprintScanner _scanner; private readonly IUpdateSource _updateSource = new ForgejoUpdateSource(); + + /// Инъекция фабрики для тестирования. По умолчанию создаёт реальный FingerprintScanner. + public static Func? ScannerFactory { get; set; } + private TerminalState _state = new(); private bool _loaded; private TaskCompletionSource? _adminAuthCompletion; @@ -57,6 +61,8 @@ public sealed partial class MainPage : Page CrashLogService.Write(exception); throw; } + + _scanner = ScannerFactory?.Invoke() ?? new FingerprintScanner(); _scanner.StatusChanged += message => Enqueue(() => SetStatus(message)); _scanner.StateChanged += (state, message) => Enqueue(() => HandleScannerStateChanged(state, message)); _scanner.RegistrationProgress += count => Enqueue(() => SetStatus($"Мастер регистрации: принят скан {count}/3. Уберите палец и приложите снова."));