1
0
Fork 0
telegraf/plugins/inputs/fibaro/fibaro_test.go
Daniel Baumann 4978089aab
Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-24 07:26:29 +02:00

306 lines
6.8 KiB
Go

package fibaro
import (
"fmt"
"net/http"
"net/http/httptest"
"os"
"path"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/testutil"
)
// TestUnauthorized validates that 401 (wrong credentials) is managed properly
func TestUnauthorized(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusUnauthorized)
}))
defer ts.Close()
a := Fibaro{
URL: ts.URL,
Username: "user",
Password: "pass",
client: &http.Client{},
}
require.NoError(t, a.Init())
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":
content, err := os.ReadFile(path.Join("testdata", "sections.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
payload = string(content)
case "/api/rooms":
content, err := os.ReadFile(path.Join("testdata", "rooms.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
payload = string(content)
case "/api/devices":
content, err := os.ReadFile(path.Join("testdata", "device_hc2.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
payload = string(content)
}
w.WriteHeader(http.StatusOK)
if _, err := fmt.Fprintln(w, payload); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
}))
defer ts.Close()
a := Fibaro{
URL: ts.URL,
Username: "user",
Password: "pass",
client: &http.Client{},
}
require.NoError(t, a.Init())
var acc testutil.Accumulator
err := acc.GatherError(a.Gather)
require.NoError(t, err)
require.Equal(t, uint64(5), acc.NMetrics())
expected := []telegraf.Metric{
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "1",
"section": "Section 1",
"room": "Room 1",
"name": "Device 1",
"type": "com.fibaro.binarySwitch",
},
map[string]interface{}{
"value": float64(0),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "2",
"section": "Section 2",
"room": "Room 2",
"name": "Device 2",
"type": "com.fibaro.binarySwitch",
},
map[string]interface{}{
"value": float64(1),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "3",
"section": "Section 3",
"room": "Room 3",
"name": "Device 3",
"type": "com.fibaro.multilevelSwitch",
},
map[string]interface{}{
"value": float64(67),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "4",
"section": "Section 3",
"room": "Room 4",
"name": "Device 4",
"type": "com.fibaro.temperatureSensor",
},
map[string]interface{}{
"batteryLevel": float64(100),
"value": float64(22.8),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "5",
"section": "Section 3",
"room": "Room 4",
"name": "Device 5",
"type": "com.fibaro.FGRM222",
},
map[string]interface{}{
"energy": float64(4.33),
"power": float64(0.7),
"value": float64(50),
"value2": float64(75),
},
time.Unix(0, 0),
),
}
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(), testutil.IgnoreTime())
}
func TestHC3JSON(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
payload := ""
switch r.URL.Path {
case "/api/sections":
content, err := os.ReadFile(path.Join("testdata", "sections.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
payload = string(content)
case "/api/rooms":
content, err := os.ReadFile(path.Join("testdata", "rooms.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
payload = string(content)
case "/api/devices":
content, err := os.ReadFile(path.Join("testdata", "device_hc3.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
payload = string(content)
}
w.WriteHeader(http.StatusOK)
if _, err := fmt.Fprintln(w, payload); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
}))
defer ts.Close()
a := Fibaro{
URL: ts.URL,
Username: "user",
Password: "pass",
DeviceType: "HC3",
client: &http.Client{},
}
require.NoError(t, a.Init())
var acc testutil.Accumulator
err := acc.GatherError(a.Gather)
require.NoError(t, err)
require.Equal(t, uint64(5), acc.NMetrics())
expected := []telegraf.Metric{
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "1",
"section": "Section 1",
"room": "Room 1",
"name": "Device 1",
"type": "com.fibaro.binarySwitch",
},
map[string]interface{}{
"value": float64(0),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "2",
"section": "Section 2",
"room": "Room 2",
"name": "Device 2",
"type": "com.fibaro.binarySwitch",
},
map[string]interface{}{
"value": float64(1),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "3",
"section": "Section 3",
"room": "Room 3",
"name": "Device 3",
"type": "com.fibaro.multilevelSwitch",
},
map[string]interface{}{
"value": float64(67),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "4",
"section": "Section 3",
"room": "Room 4",
"name": "Device 4",
"type": "com.fibaro.temperatureSensor",
},
map[string]interface{}{
"batteryLevel": float64(100),
"value": float64(22.8),
},
time.Unix(0, 0),
),
testutil.MustMetric(
"fibaro",
map[string]string{
"deviceId": "5",
"section": "Section 3",
"room": "Room 4",
"name": "Device 5",
"type": "com.fibaro.FGRM222",
},
map[string]interface{}{
"energy": float64(4.33),
"power": float64(0.7),
"value": float64(34),
},
time.Unix(0, 0),
),
}
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(), testutil.IgnoreTime())
}
func TestInvalidDeviceType(t *testing.T) {
a := Fibaro{
DeviceType: "foobar",
}
require.Error(t, a.Init())
}