evcc-io/core/metrics/tariffs_test.go
Michael Geers 661af417a1
Some checks failed
Release / call-build-workflow (push) Has been cancelled
Release / Publish Docker :release (push) Has been cancelled
Release / Github & APT (push) Has been cancelled
Release / Demo (push) Has been cancelled
Release / Hassio Addon (push) Has been cancelled
Tariffs: persist tariff values in 15min intervals (#31845)
2026-07-17 13:00:23 +00:00

55 lines
1.7 KiB
Go

package metrics
import (
"testing"
"time"
"github.com/evcc-io/evcc/server/db"
"github.com/stretchr/testify/require"
)
func TestPersistTariffs(t *testing.T) {
require.NoError(t, db.NewInstance("sqlite", ":memory:"))
require.NoError(t, db.Instance.AutoMigrate(new(tariffValue)))
slot := time.Date(2026, 4, 15, 16, 15, 0, 0, time.UTC)
grid, co2 := 0.3, 250.0
// nil values omitted
require.NoError(t, PersistTariffs(slot, &grid, nil, &co2, nil))
var res tariffValue
require.NoError(t, db.Instance.First(&res).Error)
require.Equal(t, slot.Unix(), res.Timestamp)
require.InDelta(t, 0.3, *res.Grid, 0.001)
require.Nil(t, res.FeedIn)
require.InDelta(t, 250, *res.Co2, 0.001)
require.Nil(t, res.Temperature)
// duplicate slot ignored, first values kept
other := 0.4
require.NoError(t, PersistTariffs(slot, &other, nil, nil, nil))
var count int64
require.NoError(t, db.Instance.Model(new(tariffValue)).Count(&count).Error)
require.Equal(t, int64(1), count)
require.NoError(t, db.Instance.First(&res).Error)
require.InDelta(t, 0.3, *res.Grid, 0.001)
// all nil: no row
require.NoError(t, PersistTariffs(slot.Add(15*time.Minute), nil, nil, nil, nil))
require.NoError(t, db.Instance.Model(new(tariffValue)).Count(&count).Error)
require.Equal(t, int64(1), count)
// all values set: each column mapped independently
next := slot.Add(30 * time.Minute)
feedin, temp := 0.08, 21.5
require.NoError(t, PersistTariffs(next, &grid, &feedin, &co2, &temp))
require.NoError(t, db.Instance.Where("ts = ?", next.Unix()).First(&res).Error)
require.InDelta(t, 0.3, *res.Grid, 0.001)
require.InDelta(t, 0.08, *res.FeedIn, 0.001)
require.InDelta(t, 250, *res.Co2, 0.001)
require.InDelta(t, 21.5, *res.Temperature, 0.001)
}