using FluentAssertions; using foodmarket.Pos.Core.Hardware; using foodmarket.Pos.Core.Models; using Xunit; namespace foodmarket.UnitTests; public class ScaleMonitorTests { [Fact] public async Task No_reader_returns_null_and_disconnected() { var m = new ScaleMonitor(); (await m.TryReadWeightAsync()).Should().BeNull(); m.IsConnected.Should().BeFalse(); m.HasReader.Should().BeFalse(); m.StatusText.Should().Be("Весы не подключены"); } [Fact] public async Task Reader_weight_is_returned_and_connected() { var m = new ScaleMonitor(); m.SetReader(_ => Task.FromResult(1.234m)); (await m.TryReadWeightAsync()).Should().Be(1.234m); m.IsConnected.Should().BeTrue(); m.StatusText.Should().Be("Весы на связи"); } [Fact] public async Task Loss_of_connection_is_logged_exactly_once() { var log = new List(); var m = new ScaleMonitor(log.Add); m.SetReader(_ => throw new InvalidOperationException("Порт не выбран")); // Сто опросов подряд при оборванной связи — одна запись о потере (не сотни). for (int i = 0; i < 100; i++) (await m.TryReadWeightAsync()).Should().BeNull(); log.Count(l => l.Contains("нет связи")).Should().Be(1, "потеря связи логируется один раз"); m.IsConnected.Should().BeFalse(); } [Fact] public async Task Recovery_after_loss_is_logged_once() { var log = new List(); var m = new ScaleMonitor(log.Add); var fail = true; m.SetReader(_ => fail ? throw new TimeoutException() : Task.FromResult(0.5m)); await m.TryReadWeightAsync(); // потеря await m.TryReadWeightAsync(); // ещё раз — не логируем повторно fail = false; (await m.TryReadWeightAsync()).Should().Be(0.5m); // восстановление log.Count(l => l.Contains("нет связи")).Should().Be(1); log.Count(l => l.Contains("восстановлена")).Should().Be(1); m.IsConnected.Should().BeTrue(); } [Fact] public void Weighed_line_text_shows_kg_times_price_per_kg() { var line = new CartLine { ProductId = Guid.NewGuid(), Name = "Яблоки", UnitCode = "166", UnitShort = "кг", IsWeighed = true, UnitPrice = 690m, Quantity = 1.235m, }; line.WeighedQtyText.Should().Be("1,235 кг × 690 ₸/кг"); line.LineTotal.Should().Be(852.15m); } }