68 lines
2.1 KiB
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], "%")
|
|
}
|