krona-staff/apps/KronaStaffTerminal.Tests/EmployeeFingerprintTests.cs

150 lines
4.6 KiB
C#

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<FingerprintRecord>()
};
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<FingerprintRecord>
{
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<FingerprintRecord>
{
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<EmployeeRecord>
{
new()
{
Id = "emp-1",
DisplayName = "Алексеев Алексей",
Fingerprints = new List<FingerprintRecord>
{
new() { Id = 100, Label = "right_index", Template = "UNIQUE_TEMPLATE_HASH_A" }
}
},
new()
{
Id = "emp-2",
DisplayName = "Борисов Борис",
Fingerprints = new List<FingerprintRecord>()
}
};
// 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);
}
}