using KronaStaffTerminal.Models; using KronaStaffTerminal.Tests.Mocks; using Xunit; namespace KronaStaffTerminal.Tests; public class EmployeeFingerprintTests { [Fact] public void Employee_CanHaveMultipleFingerprintsWithDistinctLabels() { var emp = new EmployeeRecord { Id = Guid.NewGuid().ToString(), LastName = "Иванов", FirstName = "Иван", Patronymic = "Иванович", Fingerprints = new List() }; var fp1 = new FingerprintRecord { Id = 1, Template = Convert.ToBase64String(new byte[] { 1, 2, 3, 4 }), Label = "right_index", EnrolledAtUtc = DateTimeOffset.UtcNow }; var fp2 = new FingerprintRecord { Id = 2, Template = Convert.ToBase64String(new byte[] { 5, 6, 7, 8 }), Label = "left_thumb", EnrolledAtUtc = DateTimeOffset.UtcNow }; emp.Fingerprints.Add(fp1); emp.Fingerprints.Add(fp2); Assert.Equal(2, emp.Fingerprints.Count); Assert.Contains(emp.Fingerprints, f => f.Label == "right_index"); Assert.Contains(emp.Fingerprints, f => f.Label == "left_thumb"); } [Fact] public void Employee_CanReplaceSpecificFingerprint() { var emp = new EmployeeRecord { Id = Guid.NewGuid().ToString(), DisplayName = "Петров Петр Петрович", Fingerprints = new List { new() { Id = 10, Label = "right_index", Template = "OLD_TEMPLATE" } } }; // Replace right_index var existing = emp.Fingerprints.FirstOrDefault(f => f.Label == "right_index"); Assert.NotNull(existing); existing.Template = "NEW_UPDATED_TEMPLATE"; existing.EnrolledAtUtc = DateTimeOffset.UtcNow; Assert.Single(emp.Fingerprints); Assert.Equal("NEW_UPDATED_TEMPLATE", emp.Fingerprints[0].Template); } [Fact] public void Employee_CanDeleteSingleFingerprintWithoutAffectingOthers() { var emp = new EmployeeRecord { Id = Guid.NewGuid().ToString(), DisplayName = "Сидоров Сидор", Fingerprints = new List { new() { Id = 1, Label = "right_thumb", Template = "T1" }, new() { Id = 2, Label = "right_index", Template = "T2" } } }; // Remove right_thumb emp.Fingerprints.RemoveAll(f => f.Label == "right_thumb"); Assert.Single(emp.Fingerprints); Assert.Equal("right_index", emp.Fingerprints[0].Label); } [Fact] public void DuplicateFingerprint_ProhibitedAcrossDifferentEmployees() { var employees = new List { new() { Id = "emp-1", DisplayName = "Алексеев Алексей", Fingerprints = new List { new() { Id = 100, Label = "right_index", Template = "UNIQUE_TEMPLATE_HASH_A" } } }, new() { Id = "emp-2", DisplayName = "Борисов Борис", Fingerprints = new List() } }; // Attempting to enroll the same template to emp-2 var candidateTemplate = "UNIQUE_TEMPLATE_HASH_A"; var candidateEmployeeId = "emp-2"; // Validation logic used by terminal var conflict = employees.FirstOrDefault(e => e.Id != candidateEmployeeId && e.Fingerprints.Any(f => f.Template == candidateTemplate)); Assert.NotNull(conflict); Assert.Equal("emp-1", conflict.Id); Assert.Equal("Алексеев Алексей", conflict.DisplayName); } [Fact] public void MockScanner_SimulatesMultiFingerEnrollmentAndMatching() { using var scanner = new MockFingerprintScanner(); var recognizedId = -1; var recognizedScore = 0; scanner.FingerRecognized += (id, score) => { recognizedId = id; recognizedScore = score; }; scanner.Connect(0, new[] { (42, "TEMPLATE_42"), (99, "TEMPLATE_99") }); Assert.True(scanner.IsConnected); scanner.SimulateFingerScan(42, 95); Assert.Equal(42, recognizedId); Assert.Equal(95, recognizedScore); scanner.SimulateFingerScan(99, 88); Assert.Equal(99, recognizedId); Assert.Equal(88, recognizedScore); } }