207 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package fibaro
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net/http"
 | |
| 	"net/http/httptest"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf/testutil"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| const sectionsJSON = `
 | |
|     [
 | |
|         {
 | |
|             "id": 1,
 | |
|             "name": "Section 1",
 | |
|             "sortOrder": 1
 | |
|         },
 | |
|         {
 | |
|             "id": 2,
 | |
|             "name": "Section 2",
 | |
|             "sortOrder": 2
 | |
|         },
 | |
|         {
 | |
|             "id": 3,
 | |
|             "name": "Section 3",
 | |
|             "sortOrder": 3
 | |
|         }
 | |
|     ]`
 | |
| 
 | |
| const roomsJSON = `
 | |
|     [
 | |
|         {
 | |
|             "id": 1,
 | |
|             "name": "Room 1",
 | |
|             "sectionID": 1,
 | |
|             "icon": "room_1",
 | |
|             "sortOrder": 1
 | |
|         },
 | |
|         {
 | |
|             "id": 2,
 | |
|             "name": "Room 2",
 | |
|             "sectionID": 2,
 | |
|             "icon": "room_2",
 | |
|             "sortOrder": 2
 | |
|         },
 | |
|         {
 | |
|             "id": 3,
 | |
|             "name": "Room 3",
 | |
|             "sectionID": 3,
 | |
|             "icon": "room_3",
 | |
|             "sortOrder": 3
 | |
|         },
 | |
|         {
 | |
|             "id": 4,
 | |
|             "name": "Room 4",
 | |
|             "sectionID": 3,
 | |
|             "icon": "room_4",
 | |
|             "sortOrder": 4
 | |
|         }
 | |
|     ]`
 | |
| 
 | |
| const devicesJSON = `
 | |
|     [
 | |
|         {
 | |
|             "id": 1,
 | |
|             "name": "Device 1",
 | |
|             "roomID": 1,
 | |
|             "type": "com.fibaro.binarySwitch",
 | |
|             "enabled": true,
 | |
|             "properties": {
 | |
|                 "dead": "false",
 | |
|                 "value": "false"
 | |
|             },
 | |
|             "sortOrder": 1
 | |
|         },
 | |
|         {
 | |
|             "id": 2,
 | |
|             "name": "Device 2",
 | |
|             "roomID": 2,
 | |
|             "type": "com.fibaro.binarySwitch",
 | |
|             "enabled": true,
 | |
|             "properties": {
 | |
|                 "dead": "false",
 | |
|                 "value": "true"
 | |
|             },
 | |
|             "sortOrder": 2
 | |
|         },
 | |
|         {
 | |
|             "id": 3,
 | |
|             "name": "Device 3",
 | |
|             "roomID": 3,
 | |
|             "type": "com.fibaro.multilevelSwitch",
 | |
|             "enabled": true,
 | |
|             "properties": {
 | |
|                 "dead": "false",
 | |
|                 "value": "67"
 | |
|             },
 | |
|             "sortOrder": 3
 | |
|         },
 | |
|         {
 | |
|             "id": 4,
 | |
|             "name": "Device 4",
 | |
|             "roomID": 4,
 | |
|             "type": "com.fibaro.temperatureSensor",
 | |
|             "enabled": true,
 | |
|             "properties": {
 | |
|                 "dead": "false",
 | |
|                 "value": "22.80"
 | |
|             },
 | |
|             "sortOrder": 4
 | |
|         },
 | |
|         {
 | |
|             "id": 5,
 | |
|             "name": "Device 5",
 | |
|             "roomID": 4,
 | |
|             "type": "com.fibaro.FGRM222",
 | |
|             "enabled": true,
 | |
|             "properties": {
 | |
|                 "energy": "4.33",
 | |
|                 "power": "0.7",
 | |
|                 "dead": "false",
 | |
|                 "value": "50",
 | |
|                 "value2": "75"
 | |
|             },
 | |
|             "sortOrder": 5
 | |
|         }
 | |
|     ]`
 | |
| 
 | |
| // TestUnauthorized validates that 401 (wrong credentials) is managed properly
 | |
| func TestUnauthorized(t *testing.T) {
 | |
| 	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | |
| 		w.WriteHeader(http.StatusUnauthorized)
 | |
| 	}))
 | |
| 	defer ts.Close()
 | |
| 
 | |
| 	a := Fibaro{
 | |
| 		URL:      ts.URL,
 | |
| 		Username: "user",
 | |
| 		Password: "pass",
 | |
| 		client:   &http.Client{},
 | |
| 	}
 | |
| 
 | |
| 	var acc testutil.Accumulator
 | |
| 	err := acc.GatherError(a.Gather)
 | |
| 	require.Error(t, err)
 | |
| }
 | |
| 
 | |
| // TestJSONSuccess validates that module works OK with valid JSON payloads
 | |
| func TestJSONSuccess(t *testing.T) {
 | |
| 	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | |
| 		payload := ""
 | |
| 		switch r.URL.Path {
 | |
| 		case "/api/sections":
 | |
| 			payload = sectionsJSON
 | |
| 		case "/api/rooms":
 | |
| 			payload = roomsJSON
 | |
| 		case "/api/devices":
 | |
| 			payload = devicesJSON
 | |
| 		}
 | |
| 		w.WriteHeader(http.StatusOK)
 | |
| 		fmt.Fprintln(w, payload)
 | |
| 	}))
 | |
| 	defer ts.Close()
 | |
| 
 | |
| 	a := Fibaro{
 | |
| 		URL:      ts.URL,
 | |
| 		Username: "user",
 | |
| 		Password: "pass",
 | |
| 		client:   &http.Client{},
 | |
| 	}
 | |
| 
 | |
| 	var acc testutil.Accumulator
 | |
| 	err := acc.GatherError(a.Gather)
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	// Gather should add 5 metrics
 | |
| 	assert.Equal(t, uint64(5), acc.NMetrics())
 | |
| 
 | |
| 	// Ensure fields / values are correct - Device 1
 | |
| 	tags := map[string]string{"deviceId": "1", "section": "Section 1", "room": "Room 1", "name": "Device 1", "type": "com.fibaro.binarySwitch"}
 | |
| 	fields := map[string]interface{}{"value": float64(0)}
 | |
| 	acc.AssertContainsTaggedFields(t, "fibaro", fields, tags)
 | |
| 
 | |
| 	// Ensure fields / values are correct - Device 2
 | |
| 	tags = map[string]string{"deviceId": "2", "section": "Section 2", "room": "Room 2", "name": "Device 2", "type": "com.fibaro.binarySwitch"}
 | |
| 	fields = map[string]interface{}{"value": float64(1)}
 | |
| 	acc.AssertContainsTaggedFields(t, "fibaro", fields, tags)
 | |
| 
 | |
| 	// Ensure fields / values are correct - Device 3
 | |
| 	tags = map[string]string{"deviceId": "3", "section": "Section 3", "room": "Room 3", "name": "Device 3", "type": "com.fibaro.multilevelSwitch"}
 | |
| 	fields = map[string]interface{}{"value": float64(67)}
 | |
| 	acc.AssertContainsTaggedFields(t, "fibaro", fields, tags)
 | |
| 
 | |
| 	// Ensure fields / values are correct - Device 4
 | |
| 	tags = map[string]string{"deviceId": "4", "section": "Section 3", "room": "Room 4", "name": "Device 4", "type": "com.fibaro.temperatureSensor"}
 | |
| 	fields = map[string]interface{}{"value": float64(22.8)}
 | |
| 	acc.AssertContainsTaggedFields(t, "fibaro", fields, tags)
 | |
| 
 | |
| 	// Ensure fields / values are correct - Device 5
 | |
| 	tags = map[string]string{"deviceId": "5", "section": "Section 3", "room": "Room 4", "name": "Device 5", "type": "com.fibaro.FGRM222"}
 | |
| 	fields = map[string]interface{}{"energy": float64(4.33), "power": float64(0.7), "value": float64(50), "value2": float64(75)}
 | |
| 	acc.AssertContainsTaggedFields(t, "fibaro", fields, tags)
 | |
| }
 |