github.com/tommi2day/gomodules@v1.13.2-0.20240423190010-b7d55d252a27/hmlib/state_test.go (about) 1 package hmlib 2 3 import ( 4 "net/url" 5 "testing" 6 7 "github.com/jarcoal/httpmock" 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 "github.com/tommi2day/gomodules/test" 11 ) 12 13 func TestState(t *testing.T) { 14 test.Testinit(t) 15 httpmock.ActivateNonDefault(httpClient.GetClient()) 16 hmURL = MockURL 17 hmToken = MockToken 18 defer httpmock.DeactivateAndReset() 19 stateListURL := hmURL + StateListEndpoint 20 httpmock.RegisterResponder("GET", stateListURL, httpmock.NewStringResponder(200, StateListTest)) 21 22 stateURL := hmURL + StateEndpoint 23 changeURL := hmURL + StateChangeEndpoint 24 httpmock.RegisterResponder("GET", stateURL, httpmock.NewStringResponder(200, StateTest)) 25 // mock the response for state 26 var stateList StateListResponse 27 var err error 28 t.Run("statelist", func(t *testing.T) { 29 stateList, err = GetStateList() 30 require.NoErrorf(t, err, "GetStateList should not return an error:%s", err) 31 sl := len(stateList.StateDevices) 32 assert.Equal(t, len(StateList.StateDevices), sl, "global StateList should equal GetStateList devices") 33 assert.Equal(t, 2, sl, "GetStateList should return 2 devices") 34 l := len(AllIDs) 35 assert.Equal(t, 44, l, "AllIDs should return 44 entries") 36 e, ok := AllIDs["4740"] 37 assert.True(t, ok, "AllIDs should contain 4740") 38 if ok { 39 assert.Equal(t, "Bewegungsmelder Garage", e.Name, "AllIDs should contain Bewegungsmelder Garage") 40 assert.Equal(t, "Device", e.EntryType, "ID 4740 should be a device") 41 assert.IsType(t, StateDevice{}, e.Entry, "ID 4740 should be a device") 42 c := e.Entry.(StateDevice).Channels 43 assert.Equal(t, 4, len(c), "ID 4740 should contain 4 channels") 44 if len(c) > 0 { 45 assert.Contains(t, c[0].Name, "Bewegungsmelder Garage:0", "ID 4740 should contain channel Bewegungsmelder Garage:0") 46 } 47 } 48 }) 49 t.Run("single device state", func(t *testing.T) { 50 var s StateDeviceResponse 51 s, err = GetStateByDeviceID("4740") 52 require.NoErrorf(t, err, "GetStateBy should not return an error:%s", err) 53 assert.Equal(t, 1, len(s.StateDevices), "GetStateByDeviceID should return 1 device") 54 if len(s.StateDevices) > 0 { 55 assert.Containsf(t, s.StateDevices[0].Name, "Bewegungsmelder Garage", "GetStateByDeviceID should return Bewegungsmelder Garage") 56 assert.Equal(t, 4, len(s.StateDevices[0].Channels), "GetStateByDeviceID should return 1 channel") 57 } 58 t.Logf(s.String()) 59 }) 60 t.Run("single channel state", func(t *testing.T) { 61 var s StateDeviceResponse 62 s, err = GetStateByChannelID("4741") 63 require.NoErrorf(t, err, "GetStateBy should not return an error:%s", err) 64 assert.Equal(t, 1, len(s.StateDevices), "GetStateByDeviceID should return 1 device") 65 if len(s.StateDevices) > 0 { 66 c := s.StateDevices[0].Channels 67 assert.Equal(t, 4, len(c), "GetStateByChannelID should return 1 channel") 68 assert.Containsf(t, c[0].Name, "Bewegungsmelder Garage:0", "GetStateByChannelID should return Bewegungsmelder Garage:0") 69 assert.Equal(t, 10, len(c[0].Datapoints), "GetStateByChannelID should return 1 Datapoints") 70 } 71 t.Logf(s.String()) 72 }) 73 t.Run("single datapoint state", func(t *testing.T) { 74 var s StateDatapointResponse 75 queryDP := url.Values{ 76 "datapoint_id": []string{"4748"}, 77 "sid": []string{hmToken}, 78 } 79 httpmock.RegisterResponderWithQuery( 80 "GET", stateURL, queryDP, 81 httpmock.NewStringResponder(200, StateDP4748)) 82 s, err := GetStateByDataPointID("4748") 83 require.NoErrorf(t, err, "GetStateBy should not return an error:%s", err) 84 assert.Equal(t, 1, len(s.StateDatapoints), "GetStateByDatapointID should return 1 datapoint") 85 if len(s.StateDatapoints) > 0 { 86 assert.Equal(t, s.StateDatapoints[0].IseID, "4748", "GetStateByDatapointID should return ID 4748") 87 assert.Equal(t, s.StateDatapoints[0].Value, "false", "GetStateByDatapointID should return value false") 88 } 89 t.Logf(s.String()) 90 }) 91 t.Run("State Empty", func(t *testing.T) { 92 var s StateDatapointResponse 93 queryStateEmpty := url.Values{ 94 "datapoint_id": []string{"9999"}, 95 "sid": []string{hmToken}, 96 } 97 httpmock.RegisterResponderWithQuery( 98 "GET", stateURL, queryStateEmpty, 99 httpmock.NewStringResponder(200, StateEmptyTest)) 100 101 s, err = GetStateByDataPointID("9999") 102 require.NoErrorf(t, err, "GetStateBy should not return an error:%s", err) 103 assert.Equal(t, 0, len(s.StateDatapoints), "GetStateByDatapointID should return 0 datapoint") 104 t.Logf(s.String()) 105 }) 106 t.Run("state change", func(t *testing.T) { 107 var r StateChangeResponse 108 109 queryChange := url.Values{ 110 "ise_id": []string{"4740"}, 111 "new_value": []string{"11"}, 112 "sid": []string{hmToken}, 113 } 114 httpmock.RegisterResponderWithQuery( 115 "GET", changeURL, queryChange, 116 httpmock.NewStringResponder(200, StateChangeTest)) 117 r, err = ChangeState("4740", "11") 118 require.NoErrorf(t, err, "ChangeState should not return an error") 119 l := len(r.Changes) 120 assert.Equal(t, 1, l, "GetMasterValues should return 1 devices") 121 if l == 1 { 122 assert.True(t, r.Changes[0].Success, "ChangeState should return the new value") 123 } else { 124 t.Errorf("ChangeState should return the changed entry") 125 } 126 t.Log(r.String()) 127 }) 128 t.Run("one state change not found, space in list", func(t *testing.T) { 129 var r StateChangeResponse 130 queryChange := url.Values{ 131 "ise_id": []string{"474,4740"}, 132 "new_value": []string{"11"}, 133 "sid": []string{hmToken}, 134 } 135 httpmock.RegisterResponderWithQuery( 136 "GET", changeURL, queryChange, 137 httpmock.NewStringResponder(200, StateChangeNotFoundTest)) 138 r, err = ChangeState("474, 4740", "11") 139 require.Errorf(t, err, "ChangeState should return an error") 140 l := len(r.NotFound) 141 assert.Equal(t, 1, l, "ChangeState should return 1 id not found") 142 l = len(r.Changes) 143 assert.Equal(t, 1, l, "ChangeState should return 1 id success ") 144 if l == 1 { 145 assert.Equal(t, "4740", r.Changes[0].IseID, "ChangeState should return ID 4740") 146 assert.True(t, r.Changes[0].Success, "ChangeState should return true for ID 4740") 147 } 148 t.Log(r.String()) 149 }) 150 t.Run("state change empty", func(t *testing.T) { 151 var r StateChangeResponse 152 queryChange := url.Values{ 153 "device_id": []string{"4740"}, 154 "new_value": []string{"11"}, 155 "sid": []string{hmToken}, 156 } 157 p := map[string]string{ 158 "device_id": "4740", 159 "new_value": "11", 160 "sid": hmToken, 161 } 162 httpmock.RegisterResponderWithQuery( 163 "GET", changeURL, queryChange, 164 httpmock.NewStringResponder(200, StateChangeEmptyTest)) 165 err = QueryAPI(changeURL, &r, p) 166 require.Errorf(t, err, "ChangeState should return an error") 167 t.Log(r.String()) 168 }) 169 t.Run("GetChannelOfDatapoint", func(t *testing.T) { 170 var channelID string 171 channelID, err = GetChannelOfDatapoint("4748") 172 require.NoErrorf(t, err, "GetChannelOfDatapoint should not return an error:%s", err) 173 assert.Equal(t, "4741", channelID, "GetChannelOfDatapoint should return channel 4741") 174 }) 175 t.Run("GetChannelOfDatapoint not found", func(t *testing.T) { 176 var channelID string 177 channelID, err = GetChannelOfDatapoint("9999") 178 require.Errorf(t, err, "GetChannelOfDatapoint should return an error") 179 assert.Equal(t, "", channelID, "GetChannelOfDatapoint should return empty channel") 180 }) 181 t.Run("GetChannelOfDatapoint not a datapoint", func(t *testing.T) { 182 var channelID string 183 channelID, err = GetChannelOfDatapoint("4740") 184 require.Errorf(t, err, "GetChannelOfDatapoint should return an error") 185 assert.Equal(t, "", channelID, "GetChannelOfDatapoint should return empty channel") 186 }) 187 t.Run("GetChannelOfDatapoint empty", func(t *testing.T) { 188 var channelID string 189 channelID, err = GetChannelOfDatapoint("") 190 require.Errorf(t, err, "GetChannelOfDatapoint should return an error") 191 assert.Equal(t, "", channelID, "GetChannelOfDatapoint should return empty channel") 192 }) 193 t.Run("GetDeviceOfChannel", func(t *testing.T) { 194 var deviceID string 195 deviceID, err = GetDeviceOfChannel("4741") 196 require.NoErrorf(t, err, "GetDeviceOfChannel should not return an error:%s", err) 197 assert.Equal(t, "4740", deviceID, "GetDeviceOfChannel should return device 4740") 198 }) 199 t.Run("GetDeviceOfChannel not found", func(t *testing.T) { 200 var deviceID string 201 deviceID, err = GetDeviceOfChannel("9999") 202 require.Errorf(t, err, "GetDeviceOfChannel should return an error") 203 assert.Equal(t, "", deviceID, "GetDeviceOfChannel should return empty device") 204 }) 205 t.Run("GetDeviceOfChannel not a channel", func(t *testing.T) { 206 var deviceID string 207 deviceID, err = GetDeviceOfChannel("4740") 208 require.Errorf(t, err, "GetDeviceOfChannel should return an error") 209 assert.Equal(t, "", deviceID, "GetDeviceOfChannel should return empty device") 210 }) 211 t.Run("GetDeviceOfChannel empty", func(t *testing.T) { 212 var deviceID string 213 deviceID, err = GetDeviceOfChannel("") 214 require.Errorf(t, err, "GetDeviceOfChannel should return an error") 215 assert.Equal(t, "", deviceID, "GetDeviceOfChannel should return empty device") 216 }) 217 }