evcc-io/cmd/setup_circuits_test.go

140 lines
3.2 KiB
Go

package cmd
import (
"strings"
"testing"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core"
"github.com/evcc-io/evcc/meter"
"github.com/evcc-io/evcc/server/db"
"github.com/evcc-io/evcc/tariff"
"github.com/evcc-io/evcc/util/config"
"github.com/spf13/viper"
"github.com/stretchr/testify/suite"
"go.uber.org/mock/gomock"
)
func TestSetupCircuits(t *testing.T) {
suite.Run(t, new(circuitsTestSuite))
}
type circuitsTestSuite struct {
suite.Suite
}
func (suite *circuitsTestSuite) SetupSuite() {
db, err := db.New("sqlite", ":memory:")
if err != nil {
suite.T().Fatal(err)
}
config.Init(db)
}
func (suite *circuitsTestSuite) SetupTest() {
config.Reset()
}
func (suite *circuitsTestSuite) TestCircuitConf() {
var conf globalConfig
viper.SetConfigType("yaml")
suite.Require().NoError(viper.ReadConfig(strings.NewReader(`circuits:
- name: master
maxPower: 10000
- name: slave
parent: master
maxPower: 10000
loadpoints:
- charger: test
circuit: slave
`)))
suite.Require().NoError(viper.UnmarshalExact(&conf))
suite.Require().NoError(configureCircuits(conf.Circuits))
suite.Require().Len(config.Circuits().Devices(), 2)
suite.Require().False(config.Circuits().Devices()[0].Instance().HasMeter())
// empty charger
suite.Require().NoError(config.Chargers().Add(config.NewStaticDevice(config.Named{
Name: "test",
}, api.Charger(nil))))
lps, err := configureLoadpoints(conf)
suite.Require().NoError(err)
suite.Require().Len(lps, 1)
suite.Require().NotNil(lps[0].GetCircuit())
}
func (suite *circuitsTestSuite) TestLoadpointMissingCircuitError() {
var conf globalConfig
viper.SetConfigType("yaml")
suite.Require().NoError(viper.ReadConfig(strings.NewReader(`
loadpoints:
- charger: test
`)))
suite.Require().NoError(viper.UnmarshalExact(&conf))
ctrl := gomock.NewController(suite.T())
circuit := api.NewMockCircuit(ctrl)
// mock circuit
suite.Require().NoError(config.Circuits().Add(config.NewStaticDevice(config.Named{
Name: "test",
}, api.Circuit(circuit))))
// mock charger
suite.Require().NoError(config.Chargers().Add(config.NewStaticDevice(config.Named{
Name: "test",
}, api.Charger(nil))))
lps, err := configureLoadpoints(conf)
suite.Require().NoError(err)
site := core.NewSite()
circuit.EXPECT().HasMeter().Return(false)
suite.Require().Error(validateCircuits(site, lps))
}
func (suite *circuitsTestSuite) TestSiteMissingCircuitError() {
var conf globalConfig
viper.SetConfigType("yaml")
suite.Require().NoError(viper.ReadConfig(strings.NewReader(`
loadpoints:
- charger: test
site:
meters:
grid: grid
`)))
suite.Require().NoError(viper.UnmarshalExact(&conf))
lps := []*core.Loadpoint{
new(core.Loadpoint),
}
// mock circuit
suite.Require().NoError(config.Circuits().Add(config.NewStaticDevice(config.Named{
Name: "test",
}, api.Circuit(nil))))
// mock meter
m, _ := meter.NewConfigurable(func() (float64, error) {
return 0, nil
})
suite.Require().NoError(config.Meters().Add(config.NewStaticDevice(config.Named{
Name: "grid",
}, api.Meter(m))))
// mock charger
suite.Require().NoError(config.Chargers().Add(config.NewStaticDevice(config.Named{
Name: "test",
}, api.Charger(nil))))
_, err := configureSite(conf.Site, lps, new(tariff.Tariffs))
suite.Require().Error(err)
}