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  }