using FluentAssertions; using Purrse.Core.Helpers; namespace Purrse.Tests.Helpers; public class TransactionFingerprintTests { [Fact] public void Generate_SameInputs_ReturnsSameHash() { var accountId = Guid.NewGuid(); var date = new DateTime(2024, 1, 15); var amount = -42.50m; var fitId = "FIT123"; var hash1 = TransactionFingerprint.Generate(accountId, date, amount, fitId); var hash2 = TransactionFingerprint.Generate(accountId, date, amount, fitId); hash1.Should().Be(hash2); } [Fact] public void Generate_DifferentAmounts_ReturnsDifferentHash() { var accountId = Guid.NewGuid(); var date = new DateTime(2024, 1, 15); var hash1 = TransactionFingerprint.Generate(accountId, date, -42.50m, "FIT123"); var hash2 = TransactionFingerprint.Generate(accountId, date, -42.51m, "FIT123"); hash1.Should().NotBe(hash2); } [Fact] public void Generate_NullFitId_StillWorks() { var accountId = Guid.NewGuid(); var date = new DateTime(2024, 1, 15); var hash = TransactionFingerprint.Generate(accountId, date, -42.50m, null); hash.Should().NotBeNullOrEmpty(); hash.Should().HaveLength(64); // SHA256 hex = 64 chars } [Fact] public void Generate_DifferentAccounts_ReturnsDifferentHash() { var date = new DateTime(2024, 1, 15); var hash1 = TransactionFingerprint.Generate(Guid.NewGuid(), date, -42.50m, null); var hash2 = TransactionFingerprint.Generate(Guid.NewGuid(), date, -42.50m, null); hash1.Should().NotBe(hash2); } }