using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Client.Shared.Models; using ZB.MOM.WW.LmxOpcUa.Client.UI.Services; using ZB.MOM.WW.LmxOpcUa.Client.UI.Tests.Fakes; using ZB.MOM.WW.LmxOpcUa.Client.UI.ViewModels; namespace ZB.MOM.WW.LmxOpcUa.Client.UI.Tests; public class AlarmsViewModelTests { private readonly FakeOpcUaClientService _service; private readonly AlarmsViewModel _vm; public AlarmsViewModelTests() { _service = new FakeOpcUaClientService(); var dispatcher = new SynchronousUiDispatcher(); _vm = new AlarmsViewModel(_service, dispatcher); } [Fact] public void SubscribeCommand_CannotExecute_WhenDisconnected() { _vm.IsConnected = false; _vm.SubscribeCommand.CanExecute(null).ShouldBeFalse(); } [Fact] public void SubscribeCommand_CannotExecute_WhenAlreadySubscribed() { _vm.IsConnected = true; _vm.IsSubscribed = true; _vm.SubscribeCommand.CanExecute(null).ShouldBeFalse(); } [Fact] public void SubscribeCommand_CanExecute_WhenConnectedAndNotSubscribed() { _vm.IsConnected = true; _vm.IsSubscribed = false; _vm.SubscribeCommand.CanExecute(null).ShouldBeTrue(); } [Fact] public async Task SubscribeCommand_SetsIsSubscribed() { _vm.IsConnected = true; await _vm.SubscribeCommand.ExecuteAsync(null); _vm.IsSubscribed.ShouldBeTrue(); _service.SubscribeAlarmsCallCount.ShouldBe(1); } [Fact] public void UnsubscribeCommand_CannotExecute_WhenNotSubscribed() { _vm.IsConnected = true; _vm.IsSubscribed = false; _vm.UnsubscribeCommand.CanExecute(null).ShouldBeFalse(); } [Fact] public async Task UnsubscribeCommand_ClearsIsSubscribed() { _vm.IsConnected = true; await _vm.SubscribeCommand.ExecuteAsync(null); await _vm.UnsubscribeCommand.ExecuteAsync(null); _vm.IsSubscribed.ShouldBeFalse(); _service.UnsubscribeAlarmsCallCount.ShouldBe(1); } [Fact] public async Task RefreshCommand_CallsService() { _vm.IsConnected = true; _vm.IsSubscribed = true; await _vm.RefreshCommand.ExecuteAsync(null); _service.RequestConditionRefreshCallCount.ShouldBe(1); } [Fact] public void RefreshCommand_CannotExecute_WhenNotSubscribed() { _vm.IsConnected = true; _vm.IsSubscribed = false; _vm.RefreshCommand.CanExecute(null).ShouldBeFalse(); } [Fact] public void AlarmEvent_AddsToCollection() { var alarm = new AlarmEventArgs( "Source1", "HighAlarm", 500, "Temperature high", true, true, false, DateTime.UtcNow); _service.RaiseAlarmEvent(alarm); _vm.AlarmEvents.Count.ShouldBe(1); _vm.AlarmEvents[0].SourceName.ShouldBe("Source1"); _vm.AlarmEvents[0].ConditionName.ShouldBe("HighAlarm"); _vm.AlarmEvents[0].Severity.ShouldBe((ushort)500); _vm.AlarmEvents[0].Message.ShouldBe("Temperature high"); } [Fact] public void Clear_ResetsState() { _vm.IsSubscribed = true; _vm.AlarmEvents.Add(new AlarmEventViewModel("Src", "Cond", 100, "Msg", true, true, false, DateTime.UtcNow)); _vm.Clear(); _vm.AlarmEvents.ShouldBeEmpty(); _vm.IsSubscribed.ShouldBeFalse(); } [Fact] public void Teardown_UnhooksEventHandler() { _vm.Teardown(); var alarm = new AlarmEventArgs( "Source1", "HighAlarm", 500, "Test", true, true, false, DateTime.UtcNow); _service.RaiseAlarmEvent(alarm); _vm.AlarmEvents.ShouldBeEmpty(); } [Fact] public void DefaultInterval_Is1000() { _vm.Interval.ShouldBe(1000); } }