44using NetDaemon . Client . Internal . HomeAssistant . Commands ;
55using NetDaemon . HassModel . Tests . TestHelpers ;
66using Microsoft . Extensions . DependencyInjection ;
7+ using NetDaemon . Client . Internal . Extensions ;
78using NetDaemon . HassModel . Internal ;
89
910namespace NetDaemon . HassModel . Tests . Internal ;
@@ -17,36 +18,26 @@ public async Task StateChangeEventIsFirstStoredInCacheThanForwarded()
1718
1819 // Arrange
1920 using var testSubject = new Subject < HassEvent > ( ) ;
20- var _hassConnectionMock = new Mock < IHomeAssistantConnection > ( ) ;
21+ var hassConnectionMock = new Mock < IHomeAssistantConnection > ( ) ;
2122 var haRunnerMock = new Mock < IHomeAssistantRunner > ( ) ;
2223
23- haRunnerMock . SetupGet ( n => n . CurrentConnection ) . Returns ( _hassConnectionMock . Object ) ;
24+ haRunnerMock . SetupGet ( n => n . CurrentConnection ) . Returns ( hassConnectionMock . Object ) ;
2425
25- _hassConnectionMock . Setup (
26- m => m . SendCommandAndReturnResponseAsync < SimpleCommand , IReadOnlyCollection < HassState > >
27- (
28- It . IsAny < SimpleCommand > ( ) , It . IsAny < CancellationToken > ( )
29- ) )
30- . ReturnsAsync ( new List < HassState >
31- {
32- new ( ) { EntityId = entityId , State = "InitialState" }
33- } ) ;
34-
35- _hassConnectionMock . Setup ( n =>
36- n . SubscribeToHomeAssistantEventsAsync ( It . IsAny < string > ( ) , It . IsAny < CancellationToken > ( ) ) )
37- . ReturnsAsync ( testSubject
38- ) ;
26+ hassConnectionMock
27+ . Setup ( m => m . SendCommandAndReturnResponseAsync < SimpleCommand , IReadOnlyCollection < HassState > >
28+ ( It . IsAny < SimpleCommand > ( ) , It . IsAny < CancellationToken > ( ) ) )
29+ . ReturnsAsync ( [ new HassState { EntityId = entityId , State = "InitialState" } ] ) ;
3930
40- var serviceColletion = new ServiceCollection ( ) ;
41- _ = serviceColletion . AddTransient < IObservable < HassEvent > > ( _ => testSubject ) ;
42- var sp = serviceColletion . BuildServiceProvider ( ) ;
31+ hassConnectionMock
32+ . Setup ( n => n . SubscribeToHomeAssistantEventsAsync ( It . IsAny < string > ( ) , It . IsAny < CancellationToken > ( ) ) )
33+ . ReturnsAsync ( testSubject ) ;
4334
44- using var cache = new EntityStateCache ( haRunnerMock . Object , sp ) ;
35+ using var cache = new EntityStateCache ( haRunnerMock . Object ) ;
4536
4637 var eventObserverMock = new Mock < IObserver < HassEvent > > ( ) ;
4738 cache . AllEvents . Subscribe ( eventObserverMock . Object ) ;
4839
49- // ACT 1: after initialization of the cache it should show the values retieved from Hass
40+ // ACT 1: after initialization of the cache it should show the values retrieved from Hass
5041 await cache . InitializeAsync ( CancellationToken . None ) ;
5142
5243 cache . GetState ( entityId ) ! . State . Should ( ) . Be ( "InitialState" , "The initial value should be available" ) ;
@@ -66,7 +57,7 @@ public async Task StateChangeEventIsFirstStoredInCacheThanForwarded()
6657 . Callback ( ( ) =>
6758 {
6859#pragma warning disable 8602
69- cache . GetState ( entityId ) . State . Should ( ) . Be ( "newState" ) ;
60+ cache . GetState ( entityId ) . State . Should ( ) . Be ( "newState" , because : "The cache should already have the new value when the event handler runs" ) ;
7061#pragma warning restore 8602
7162 } ) ;
7263
@@ -87,57 +78,70 @@ public async Task AllEntityIds_returnsInitialPlusChangedEntities()
8778 {
8879 // Arrange
8980 using var testSubject = new Subject < HassEvent > ( ) ;
90- var _hassConnectionMock = new Mock < IHomeAssistantConnection > ( ) ;
81+ var hassConnectionMock = new Mock < IHomeAssistantConnection > ( ) ;
9182 var haRunnerMock = new Mock < IHomeAssistantRunner > ( ) ;
9283
93- haRunnerMock . SetupGet ( n => n . CurrentConnection ) . Returns ( _hassConnectionMock . Object ) ;
94-
95- _hassConnectionMock . Setup (
96- m => m . SendCommandAndReturnResponseAsync < SimpleCommand , IReadOnlyCollection < HassState > >
97- (
98- It . IsAny < SimpleCommand > ( ) , It . IsAny < CancellationToken > ( )
99- ) )
100- . ReturnsAsync ( new List < HassState >
101- {
102- new ( ) { EntityId = "sensor.sensor1" , State = "InitialState" }
103- } ) ;
84+ haRunnerMock . SetupGet ( n => n . CurrentConnection ) . Returns ( hassConnectionMock . Object ) ;
10485
105- var serviceColletion = new ServiceCollection ( ) ;
86+ hassConnectionMock
87+ . Setup ( m => m . SendCommandAndReturnResponseAsync < SimpleCommand , IReadOnlyCollection < HassState > >
88+ ( It . IsAny < SimpleCommand > ( ) , It . IsAny < CancellationToken > ( ) ) )
89+ . ReturnsAsync ( [ new ( )
90+ {
91+ EntityId = "sensor.sensor1" ,
92+ State = "InitialState" ,
93+ AttributesJson = new { brightness = 100 } . ToJsonElement ( ) ,
94+ } ] ) ;
10695
107- _hassConnectionMock . Setup ( n =>
96+ hassConnectionMock . Setup ( n =>
10897 n . SubscribeToHomeAssistantEventsAsync ( It . IsAny < string > ( ) , It . IsAny < CancellationToken > ( ) ) )
109- . ReturnsAsync ( testSubject
110- ) ;
111-
112- var sp = serviceColletion . BuildServiceProvider ( ) ;
98+ . ReturnsAsync ( testSubject ) ;
11399
114- using var cache = new EntityStateCache ( haRunnerMock . Object , sp ) ;
100+ using var cache = new EntityStateCache ( haRunnerMock . Object ) ;
115101
116102 var stateChangeObserverMock = new Mock < IObserver < HassEvent > > ( ) ;
117103 cache . AllEvents . Subscribe ( stateChangeObserverMock . Object ) ;
118104
119105 // ACT 1: after initialization of the cache it should show the values retieved from Hass
120106 await cache . InitializeAsync ( CancellationToken . None ) ;
121107
122- // Act 2: now fire a state change event
123- var changedEventData = new HassStateChangedEventData
108+ // initial value for sensor.sensor1 shoul be visible right away
109+ cache . GetState ( "sensor.sensor1" ) ! . AttributesJson . GetValueOrDefault ( ) . GetProperty ( "brightness" ) . GetInt32 ( ) . Should ( ) . Be ( 100 ) ;
110+
111+ // Act 2: now fire 2 state change events
112+ testSubject . OnNext ( new HassEvent
124113 {
125- EntityId = "sensor.sensor2" ,
126- OldState = new HassState ( ) ,
127- NewState = new HassState
114+ EventType = "state_changed" ,
115+ DataElement = new HassStateChangedEventData
128116 {
129- State = "newState"
130- }
131- } ;
117+ EntityId = "sensor.sensor1" ,
118+ OldState = new HassState ( ) ,
119+ NewState = new HassState
120+ {
121+ State = "newState" ,
122+ AttributesJson = new { brightness = 200 } . ToJsonElement ( )
123+ }
124+ } . AsJsonElement ( )
125+ } ) ;
132126
133- // Act
134127 testSubject . OnNext ( new HassEvent
135128 {
136129 EventType = "state_changed" ,
137- DataElement = changedEventData . AsJsonElement ( )
130+ DataElement = new HassStateChangedEventData
131+ {
132+ EntityId = "sensor.sensor2" ,
133+ OldState = new HassState ( ) ,
134+ NewState = new HassState
135+ {
136+ State = "newState" ,
137+ AttributesJson = new { brightness = 300 } . ToJsonElement ( )
138+ }
139+ } . AsJsonElement ( )
138140 } ) ;
139141
140142 // Assert
141143 cache . AllEntityIds . Should ( ) . BeEquivalentTo ( "sensor.sensor1" , "sensor.sensor2" ) ;
144+ cache . GetState ( "sensor.sensor1" ) ! . AttributesJson . GetValueOrDefault ( ) . GetProperty ( "brightness" ) . GetInt32 ( ) . Should ( ) . Be ( 200 ) ;
145+ cache . GetState ( "sensor.sensor2" ) ! . AttributesJson . GetValueOrDefault ( ) . GetProperty ( "brightness" ) . GetInt32 ( ) . Should ( ) . Be ( 300 ) ;
142146 }
143147}
0 commit comments