heater/pkg/device/device_test.go

185 lines
4.7 KiB
Go

package device
import (
"testing"
"time"
"fmt"
"reflect"
"github.com/rs/zerolog"
"io/ioutil"
)
// monday
var test_time = time.Date(2022, time.October, 24, 0, 0, 0, 0, time.Local)
var test_presets = []Preset{
{Label: "default", Value: 17, Color: "#012a36"},
{Label: "normal", Value: 19, Color: "#b6244f"},
}
var test_setpoints = []Setpoint{
{Start: 7*60, Preset_id: 1},
{Start: 8*60, Preset_id: 0},
{Start: 16*60, Preset_id: 1},
{Start: 22*60, Preset_id: 0},
}
var test_weekprogram = WeekProgram{
Monday: test_setpoints,
Thuesday: test_setpoints,
Wednesday: test_setpoints,
Thursday : test_setpoints,
Friday: test_setpoints,
Saturday: test_setpoints,
Sunday: test_setpoints,
}
var test_programs = Programs{
"default": test_weekprogram,
}
var test_device = Device {
Name: "valid",
Settings: DeviceSettings{
Programs: test_programs,
Presets: test_presets,
TVR: DefaultTVRSettings,
},
CurrentSetpoint: 0,
State: DeviceState{
Mode: "program",
Setpoint: 14,
Time: test_time,
Program_name: "default",
},
}
func TestStateTopic(t *testing.T) {
topic := test_device.StateTopic()
if topic != "heater/valid/state" {
t.Errorf("Got %s; want heater/valid/state", topic)
}
}
func TestProgram(t *testing.T) {
//case 1: no program set in state return default
case1_device := test_device
case1_device.State.Program_name = ""
//case 2: program set "confort" must return it
var test_confort_weekprogram = WeekProgram{
Monday: test_setpoints,
Thuesday: test_setpoints,
Wednesday: test_setpoints,
Thursday : test_setpoints,
Friday: test_setpoints,
Saturday: test_setpoints,
Sunday: test_setpoints,
}
case2_device := test_device
case2_device.Settings.Programs = Programs{
"default": test_weekprogram,
"confort": test_confort_weekprogram,
}
case2_device.State.Program_name = "confort"
//case 3: program set "confort" but not exist
case3_device := test_device
case3_device.State.Program_name = "confort"
var tests = []struct {
name string
device Device
result WeekProgram
err error
}{
{"case 1 no program set use default", case1_device, DefaultWeekProgram, nil},
{"case 2 program confort", case2_device, test_confort_weekprogram, nil},
{"case 3 program confort no defined", case3_device, WeekProgram{}, Error("device valid don't have confort program")},
}
for _, tt := range tests {
testname := fmt.Sprintf("%s", tt.name )
t.Run(testname, func(t *testing.T) {
prog, err := tt.device.Program()
if err != tt.err {
t.Errorf("got %s, want %s", err, tt.err)
}
if !reflect.DeepEqual(prog,tt.result) {
t.Errorf("got %v, want %v", prog, tt.result)
}
})
}
}
func TestCheckSetpoint(t *testing.T) {
timeNow = func() time.Time {
return test_time
}
device1 := test_device
device1.Name = "1"
device1.State = DeviceState{
Mode: "program",
Setpoint: 0,
Time: test_time,
Program_name: "",
}
device2 := test_device
device2.Name = "2"
device2.State.Program_name = "unknown"
var tests = []struct{
device Device
want []Message
err error
}{
{device1, []Message{Message{
Payload: []byte("{\"current_heating_setpoint\": 17}"),
Topic: "zigbee2mqtt/TVR/1/set",
Retain: false,
}}, nil} ,
{device2, []Message{}, Error("device 2 don't have unknown program")},
}
for _, tt := range tests {
testname := fmt.Sprintf("%s", tt.device.Name )
t.Run(testname, func(t *testing.T) {
result := []Message{}
rchan := make(chan Message, 10)
errchan := make(chan error, 1)
go func(result chan Message, errchan chan error) {
logger := zerolog.New(ioutil.Discard).With().Timestamp().Logger()
errchan <- tt.device.CheckSetpoint(&logger, result)
close(rchan)
close(errchan)
}(rchan, errchan)
for msg := range rchan {
result = append(result, msg)
}
err, ok := <- errchan
if !ok {
t.Fatal(err)
}
if err != tt.err {
t.Errorf("got %s, want %s", err, tt.err)
}
if !reflect.DeepEqual(result,tt.want) {
t.Errorf("got %v, want %v", result, tt.want)
}
})
}
}