From f924c7a3855b7c7ac961c3df0d05cff5092263b0 Mon Sep 17 00:00:00 2001 From: helto4real Date: Mon, 11 Jan 2021 21:38:34 +0100 Subject: [PATCH] Fix Entities in RxMock --- src/Fakes/NetDaemon.Fakes/RxAppMock.cs | 33 +++++++++++++++--- .../FakesTests/FakeMockableApp.cs | 2 ++ .../FakesTests/RxMockTests.cs | 34 +++++++++++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/Fakes/NetDaemon.Fakes/RxAppMock.cs b/src/Fakes/NetDaemon.Fakes/RxAppMock.cs index a4b0751d9..433c61e4b 100644 --- a/src/Fakes/NetDaemon.Fakes/RxAppMock.cs +++ b/src/Fakes/NetDaemon.Fakes/RxAppMock.cs @@ -4,6 +4,9 @@ using NetDaemon.Common.Fluent; using NetDaemon.Common.Reactive; using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; namespace NetDaemon.Daemon.Fakes { @@ -13,10 +16,15 @@ namespace NetDaemon.Daemon.Fakes /// public class RxAppMock : Mock { + /// + /// Current entities and states + /// + public IList MockState { get; } = new List(); + /// /// Observable fake states /// - public ObservableBase<(EntityState, EntityState)> StateChangesObservable { get; } + public ObservableBase<(EntityState Old, EntityState New)> StateChangesObservable { get; } /// /// Observalbe fake events @@ -35,13 +43,30 @@ public RxAppMock() ReactiveEventMock r = new(this);//new EventObservable(loggerMock.Object, Object); Setup(n => n.EventChanges).Returns(r); - Setup(n => n.Entity(It.IsAny())).Returns(_ => + Setup(n => n.Entity(It.IsAny())).Returns(entityId => + { + var m = new Mock(); + m.Setup(n => n.StateChanges).Returns(StateChangesObservable.Where(f => f.New?.EntityId == entityId && f.New?.State != f.Old?.State)); + m.Setup(n => n.StateAllChanges).Returns(StateChangesObservable.Where(f => f.New?.EntityId == entityId)); + return m.Object; + }); + + Setup(n => n.Entities(It.IsAny())).Returns(entityIds => { var m = new Mock(); - m.Setup(n => n.StateChanges).Returns(StateChangesObservable); - m.Setup(n => n.StateAllChanges).Returns(StateChangesObservable); + m.Setup(n => n.StateChanges).Returns(StateChangesObservable.Where(f => entityIds.Contains(f.New.EntityId) && f.New?.State != f.Old?.State)); + m.Setup(n => n.StateAllChanges).Returns(StateChangesObservable.Where(f => entityIds.Contains(f.New.EntityId))); return m.Object; }); + + Setup(n => n.Entities(It.IsAny>())).Returns>(func => + { + var x = MockState.Where(func); + var y = x.Select(n => n.EntityId).ToArray(); + var m = new Mock(); + m.Setup(n => n.StateChanges).Returns(StateChangesObservable.Where(f => y.Contains(f.New.EntityId) && f.New?.State != f.Old?.State)); + m.Setup(n => n.StateAllChanges).Returns(StateChangesObservable.Where(f => y.Contains(f.New.EntityId))); return m.Object; + }); } /// diff --git a/tests/NetDaemon.Daemon.Tests/FakesTests/FakeMockableApp.cs b/tests/NetDaemon.Daemon.Tests/FakesTests/FakeMockableApp.cs index 6f2a84875..9b361a7e5 100644 --- a/tests/NetDaemon.Daemon.Tests/FakesTests/FakeMockableApp.cs +++ b/tests/NetDaemon.Daemon.Tests/FakesTests/FakeMockableApp.cs @@ -51,6 +51,8 @@ public void Initialize() .Where(e => e.New?.State == "on" && e.Old?.State == "off") .Subscribe(_ => _app.Entity("sensor.mysensor").SetState(20, new { battery_level = 90 })); + _app.Entities(n => n.EntityId!.EndsWith("entities", StringComparison.InvariantCultureIgnoreCase)).StateChanges.Subscribe(_ => _app.Entity("light.kitchen").TurnOn()); + _app.Entity("sensor.temperature") .StateAllChanges .Where(e => e.New?.Attribute?.battery_level < 15) diff --git a/tests/NetDaemon.Daemon.Tests/FakesTests/RxMockTests.cs b/tests/NetDaemon.Daemon.Tests/FakesTests/RxMockTests.cs index c16a7e7a4..e753dcd88 100644 --- a/tests/NetDaemon.Daemon.Tests/FakesTests/RxMockTests.cs +++ b/tests/NetDaemon.Daemon.Tests/FakesTests/RxMockTests.cs @@ -75,6 +75,40 @@ public void TestFakeMockableBinarySensorApp() VerifyEntityToggle("light.kitchen", new { brightness = 100 }); } + [Fact] + public void TestFakeMockableBinarySensorAppEntities() + { + // ARRANGE + FakeMockableAppImplementation app = new(Object); + // Have to add the entity before initialize to support lambda selections + MockState.Add(new() { EntityId = "binary_sensor.test_entities" }); + + app.Initialize(); + + // ACT + TriggerStateChange("binary_sensor.test_entities", "off", "on"); + + // ASSERT + VerifyEntityTurnOn("light.kitchen"); + } + + [Fact] + public void TestFakeMockableBinarySensorAppEntitiesFalse() + { + // ARRANGE + FakeMockableAppImplementation app = new(Object); + // Not end with entities + MockState.Add(new() { EntityId = "binary_sensor.test_entity" }); + + app.Initialize(); + + // ACT + TriggerStateChange("binary_sensor.test_entities", "off", "on"); + + // ASSERT + VerifyEntityTurnOn("light.kitchen", times: Times.Never()); + } + [Fact] public void TestFakeEventTurnsOnLight() {