150 lines
4.6 KiB
C#
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);
|
|
}
|
|
}
|