evcc-io/tariff/helper_test.go
2025-10-03 16:45:56 +02:00

88 lines
2 KiB
Go

package tariff
import (
"errors"
"testing"
"time"
"github.com/benbjohnson/clock"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/util"
"github.com/jinzhu/now"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestMergeRatesAfter(t *testing.T) {
clock := clock.NewMock()
clock.Set(now.BeginningOfDay())
rate := func(start int, val float64) api.Rate {
return api.Rate{
Start: clock.Now().Add(time.Duration(start) * time.Hour),
End: clock.Now().Add(time.Duration(start+1) * time.Hour),
Value: val,
}
}
old := api.Rates{rate(1, 1), rate(2, 2)}
new := api.Rates{rate(2, 2), rate(3, 3)}
combined := api.Rates{rate(1, 1), rate(2, 2), rate(3, 3)}
data := util.NewMonitor[api.Rates](time.Hour)
data.WithClock(clock)
data.Set(old)
res, err := data.Get()
require.NoError(t, err)
assert.Equal(t, old, res)
for i, tc := range []struct {
new, expected api.Rates
ts time.Time
}{
{new, combined, clock.Now()},
{new, combined, clock.Now().Add(SlotDuration)},
{nil, combined, clock.Now()},
{nil, combined, clock.Now().Add(SlotDuration)},
{new, combined, clock.Now().Add(time.Hour)},
{new, combined, clock.Now().Add(time.Hour + SlotDuration)},
{new, combined, now.With(clock.Now().Add(time.Hour + 30*time.Minute)).BeginningOfHour()},
{new, combined, now.With(clock.Now().Add(time.Hour + 30*time.Minute)).BeginningOfHour().Add(SlotDuration)},
{new, new, clock.Now().Add(2 * time.Hour)},
{new, new, clock.Now().Add(2*time.Hour + SlotDuration)},
} {
t.Logf("%d. %+v", i+1, tc)
mergeRatesAfter(data, tc.new, tc.ts)
res, err := data.Get()
require.NoError(t, err)
assert.Equal(t, tc.expected, res)
}
}
type runner struct {
res error
}
func (r *runner) run(done chan error) {
if r.res == nil {
close(done)
} else {
done <- r.res
}
}
func TestRunOrQError(t *testing.T) {
{
res, err := runOrError(&runner{nil})
require.NoError(t, err)
require.NotNil(t, res)
}
{
res, err := runOrError(&runner{errors.New("foo")})
require.Error(t, err)
require.Nil(t, res)
}
}