package core import ( "testing" "time" "github.com/benbjohnson/clock" "github.com/evcc-io/evcc/api" "github.com/evcc-io/evcc/core/session" "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 := session.NewStore("foo", serverdb.Instance) 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, sessionEnergy: NewEnergyMetrics(), } // create session me.EXPECT().TotalEnergy().Return(1.0, nil) lp.createSession() assert.NotNil(t, lp.session) // start charging lp.updateSession(func(session *session.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.sessionEnergy.Update(1.23) me.EXPECT().TotalEnergy().Return(1.0+lp.getChargedEnergy()/1e3, nil) // match chargedEnergy lp.stopSession() assert.NotNil(t, lp.session) assert.Equal(t, lp.getChargedEnergy()/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.Logf("session: %+v", s) // stop charging - 2nd leg clock.Add(time.Hour) lp.sessionEnergy.Update(lp.getChargedEnergy() * 2) me.EXPECT().TotalEnergy().Return(3.0, nil) // doesn't match chargedEnergy lp.stopSession() assert.NotNil(t, lp.session) assert.Equal(t, clock.Now(), lp.session.Finished) s, err = db.Sessions() assert.NoError(t, err) assert.Len(t, s, 1) t.Logf("session: %+v", s) }