89 lines
2 KiB
Go
89 lines
2 KiB
Go
package core
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/benbjohnson/clock"
|
|
"github.com/evcc-io/evcc/api"
|
|
coredb "github.com/evcc-io/evcc/core/db"
|
|
"github.com/evcc-io/evcc/mock"
|
|
serverdb "github.com/evcc-io/evcc/server/db"
|
|
"github.com/evcc-io/evcc/util"
|
|
"github.com/golang/mock/gomock"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestSession(t *testing.T) {
|
|
var err error
|
|
serverdb.Instance, err = serverdb.New("sqlite", ":memory:")
|
|
assert.NoError(t, err)
|
|
|
|
db, err := coredb.New("foo")
|
|
assert.NoError(t, err)
|
|
|
|
clock := clock.NewMock()
|
|
|
|
ctrl := gomock.NewController(t)
|
|
defer ctrl.Finish()
|
|
|
|
mm := mock.NewMockMeter(ctrl)
|
|
me := mock.NewMockMeterEnergy(ctrl)
|
|
|
|
type EnergyDecorator struct {
|
|
api.Meter
|
|
api.MeterEnergy
|
|
}
|
|
|
|
cm := &EnergyDecorator{Meter: mm, MeterEnergy: me}
|
|
|
|
lp := &Loadpoint{
|
|
log: util.NewLogger("foo"),
|
|
clock: clock,
|
|
db: db,
|
|
chargeMeter: cm,
|
|
}
|
|
|
|
// create session
|
|
me.EXPECT().TotalEnergy().Return(1.0, nil)
|
|
lp.createSession()
|
|
assert.NotNil(t, lp.session)
|
|
|
|
// start charging
|
|
lp.updateSession(func(session *coredb.Session) {
|
|
if session.Created.IsZero() {
|
|
session.Created = lp.clock.Now()
|
|
}
|
|
})
|
|
assert.Equal(t, clock.Now(), lp.session.Created)
|
|
|
|
// stop charging
|
|
clock.Add(time.Hour)
|
|
lp.chargedEnergy = 1.23 * 1e3 // Wh
|
|
me.EXPECT().TotalEnergy().Return(1.0+lp.chargedEnergy/1e3, nil) // match chargedEnergy
|
|
|
|
lp.stopSession()
|
|
assert.NotNil(t, lp.session)
|
|
assert.Equal(t, lp.chargedEnergy/1e3, lp.session.ChargedEnergy)
|
|
assert.Equal(t, clock.Now(), lp.session.Finished)
|
|
|
|
s, err := db.Sessions()
|
|
assert.NoError(t, err)
|
|
assert.Len(t, s, 1)
|
|
t.Log(s)
|
|
|
|
// stop charging - 2nd leg
|
|
clock.Add(time.Hour)
|
|
lp.chargedEnergy *= 2
|
|
me.EXPECT().TotalEnergy().Return(3.0, nil) // doesn't match chargedEnergy
|
|
|
|
lp.stopSession()
|
|
assert.NotNil(t, lp.session)
|
|
assert.Equal(t, 3.0-1.0, lp.session.ChargedEnergy) // expect actual meter energy delta
|
|
assert.Equal(t, clock.Now(), lp.session.Finished)
|
|
|
|
s, err = db.Sessions()
|
|
assert.NoError(t, err)
|
|
assert.Len(t, s, 1)
|
|
t.Log(s)
|
|
}
|