using FluentAssertions; using foodmarket.Application.Common; using Xunit; namespace foodmarket.UnitTests; public class PinHasherTests { [Fact] public void Hash_then_verify_roundtrips() { var hash = PinHasher.Hash("1234"); PinHasher.Verify("1234", hash).Should().BeTrue(); PinHasher.Verify("1235", hash).Should().BeFalse(); } [Fact] public void Hash_is_salted_different_each_time() { PinHasher.Hash("4321").Should().NotBe(PinHasher.Hash("4321")); } [Fact] public void Verify_handles_null_and_garbage() { PinHasher.Verify("1234", null).Should().BeFalse(); PinHasher.Verify("1234", "").Should().BeFalse(); PinHasher.Verify("1234", "not-a-hash").Should().BeFalse(); } [Theory] [InlineData("1234", true)] [InlineData("123456", true)] [InlineData("123", false)] [InlineData("1234567", false)] [InlineData("12a4", false)] [InlineData(null, false)] public void IsValidPin_rules(string? pin, bool expected) => PinHasher.IsValidPin(pin).Should().Be(expected); }