evcc-io/cmd/metrics_battery_test.go

68 lines
2.1 KiB
Go

package cmd
import (
"bytes"
"strings"
"testing"
"github.com/evcc-io/evcc/core/metrics"
"github.com/stretchr/testify/require"
)
func TestMetricsBatteryTotals(t *testing.T) {
series := []metrics.Series{
{Group: metrics.Battery, Title: "bat", Data: []metrics.Slot{
{Energy: 1.0, ReturnEnergy: 0.4},
{Energy: 2.0, ReturnEnergy: 1.6},
}},
// non-battery series must be ignored
{Group: metrics.Grid, Title: "grid", Data: []metrics.Slot{
{Energy: 5.0, ReturnEnergy: 3.0},
}},
}
totals := metricsBatteryTotals(series)
require.Len(t, totals, 1)
require.InDelta(t, 3.0, totals["bat"].charge, 0.001)
require.InDelta(t, 2.0, totals["bat"].discharge, 0.001)
}
func TestMetricsWriteBatteryTable(t *testing.T) {
selected := []metrics.EntityInfo{
{Group: metrics.Battery, Name: "db:1", Title: "Home"},
{Group: metrics.Battery, Name: "db:2", Title: "Hyper2000"}, // removed device: stored db title remains
{Group: metrics.Battery, Name: "db:3"},
}
totals := map[string]batteryTotals{
"Home": {charge: 10.0, discharge: 9.0},
"Hyper2000": {charge: 4.0, discharge: 3.0},
// db:3 deliberately absent: no data in the timeframe
}
var buf bytes.Buffer
metricsWriteBatteryTable(&buf, selected, totals)
lines := strings.Split(strings.TrimRight(buf.String(), "\n"), "\n")
require.Len(t, lines, 4) // header + 3 rows
require.Contains(t, lines[0], "efficiency")
// db:1: stored title, efficiency = discharge/charge
require.Contains(t, lines[1], "Home")
require.Contains(t, lines[1], "10.000")
require.Contains(t, lines[1], "9.000")
require.Contains(t, lines[1], "90.0%")
// db:2: removed device still joins via its stored title; label is that title
require.Contains(t, lines[2], "Hyper2000")
require.Contains(t, lines[2], "4.000")
require.Contains(t, lines[2], "3.000")
require.Contains(t, lines[2], "75.0%")
// db:3: no title anywhere -> label falls back to the name; no data -> blank efficiency
f := strings.Fields(lines[3])
require.Equal(t, "db:3", f[0]) // name column
require.Equal(t, "db:3", f[1]) // title column falls back to name
require.Contains(t, lines[3], "0.000")
require.NotContains(t, lines[3], "%")
}