bpicode/fritzctl

View on GitHub
manifest/applier_aha_http_test.go

Summary

Maintainability
F
3 days
Test Coverage
package manifest

import (
    "errors"
    "testing"

    "github.com/stretchr/testify/assert"
)

type fritzAlwaysSuccess struct {
}

// On always succeeds.
func (f *fritzAlwaysSuccess) On(names ...string) error {
    return nil
}

// Off always succeeds.
func (f *fritzAlwaysSuccess) Off(names ...string) error {
    return nil
}

// Temp always succeeds.
func (f *fritzAlwaysSuccess) Temp(value float64, names ...string) error {
    return nil
}

// TestApplyViaAha tests the http interface applier.
func TestApplyViaAha(t *testing.T) {
    applier := NewApplier(&fritzAlwaysSuccess{})
    err := applier.Apply(
        &Plan{
            Switches:    []Switch{{Name: "s", State: true}},
            Thermostats: []Thermostat{{Name: "t", Temperature: 17.5}},
        },
        &Plan{
            Switches:    []Switch{{Name: "s", State: false}},
            Thermostats: []Thermostat{{Name: "t", Temperature: 20.5}},
        })
    assert.NoError(t, err)
}

// TestApplyViaAhaLargeSystem tests the http interface applier.
func TestApplyViaAhaLargeSystem(t *testing.T) {
    applier := NewApplier(&fritzAlwaysSuccess{})
    err := applier.Apply(
        &Plan{
            Switches: []Switch{
                {Name: "s1", State: true},
                {Name: "s2", State: true},
                {Name: "s3", State: true},
                {Name: "s4", State: false},
                {Name: "s5", State: false},
                {Name: "s6", State: true},
                {Name: "s7", State: true},
                {Name: "s8", State: true},
                {Name: "s9", State: false},
                {Name: "s10", State: true},
                {Name: "s11", State: true},
                {Name: "s12", State: false},
                {Name: "s13", State: false},
            },
            Thermostats: []Thermostat{
                {Name: "t1", Temperature: 17.5},
                {Name: "t2", Temperature: 18.5},
                {Name: "t3", Temperature: 19.5},
                {Name: "t4", Temperature: 21.5},
                {Name: "t5", Temperature: 22.5},
                {Name: "t6", Temperature: 23.0},
                {Name: "t7", Temperature: 34.0},
                {Name: "t8", Temperature: 26.0},
                {Name: "t9", Temperature: 27.5},
            },
        },
        &Plan{
            Switches: []Switch{
                {Name: "s1", State: false},
                {Name: "s2", State: false},
                {Name: "s3", State: true},
                {Name: "s4", State: true},
                {Name: "s5", State: true},
                {Name: "s6", State: false},
                {Name: "s7", State: false},
                {Name: "s8", State: true},
                {Name: "s9", State: true},
                {Name: "s10", State: true},
                {Name: "s11", State: false},
                {Name: "s12", State: false},
                {Name: "s13", State: true},
            },
            Thermostats: []Thermostat{
                {Name: "t1", Temperature: 27.5},
                {Name: "t2", Temperature: 19.5},
                {Name: "t3", Temperature: 17.5},
                {Name: "t4", Temperature: 25.5},
                {Name: "t5", Temperature: 21.5},
                {Name: "t6", Temperature: 24.0},
                {Name: "t7", Temperature: 24.0},
                {Name: "t8", Temperature: 16.0},
                {Name: "t9", Temperature: 17.5},
            },
        })
    assert.NoError(t, err)
}

type fritzAlwaysError struct {
}

// On always returns an error.
func (f *fritzAlwaysError) On(names ...string) error {
    return errors.New("that didn't work")
}

// Off always returns an error.
func (f *fritzAlwaysError) Off(names ...string) error {
    return errors.New("that didn't work")
}

// Temp always returns an error.
func (f *fritzAlwaysError) Temp(value float64, names ...string) error {
    return errors.New("that didn't work")
}

// TestApplyViaAhaErrorByThermostat tests the http interface applier.
func TestApplyViaAhaErrorByThermostat(t *testing.T) {
    applier := NewApplier(&fritzAlwaysError{})
    err := applier.Apply(
        &Plan{
            Switches:    []Switch{{Name: "s", State: true}},
            Thermostats: []Thermostat{{Name: "t", Temperature: 17.5}},
        },
        &Plan{
            Switches:    []Switch{{Name: "s", State: true}},
            Thermostats: []Thermostat{{Name: "t", Temperature: 20.5}},
        })
    assert.Error(t, err)
}

// TestApplyViaAhaErrorBySwitch tests the http interface applier.
func TestApplyViaAhaErrorBySwitch(t *testing.T) {
    applier := NewApplier(&fritzAlwaysError{})
    err := applier.Apply(
        &Plan{
            Switches:    []Switch{{Name: "s", State: false}},
            Thermostats: []Thermostat{{Name: "t", Temperature: 20.5}},
        },
        &Plan{
            Switches:    []Switch{{Name: "s", State: true}},
            Thermostats: []Thermostat{{Name: "t", Temperature: 20.5}},
        })
    assert.Error(t, err)
}

// TestApplyViaAhaErrorBySwitch tests the http interface applier.
func TestApplyViaAhaErrorByMalformedPlan(t *testing.T) {
    applier := NewApplier(&fritzAlwaysError{})
    err := applier.Apply(
        &Plan{
            Switches:    []Switch{{Name: "s", State: false}},
            Thermostats: []Thermostat{{Name: "t", Temperature: 20.5}},
        },
        &Plan{
            Switches:    []Switch{{Name: "CCCCC", State: true}},
            Thermostats: []Thermostat{{Name: "YYYYYY", Temperature: 20.5}},
        })
    assert.Error(t, err)
}

// TestApplyViaAhaLargeSystemWithErrors tests the http interface applier.
func TestApplyViaAhaLargeSystemWithErrors(t *testing.T) {
    applier := NewApplier(&fritzAlwaysError{})
    err := applier.Apply(
        &Plan{
            Switches: []Switch{
                {Name: "s1", State: true},
                {Name: "s2", State: true},
                {Name: "s3", State: true},
                {Name: "s4", State: false},
                {Name: "s5", State: false},
                {Name: "s6", State: true},
                {Name: "s7", State: true},
                {Name: "s8", State: true},
                {Name: "s9", State: false},
                {Name: "s10", State: true},
                {Name: "s11", State: true},
                {Name: "s12", State: false},
                {Name: "s13", State: false},
            },
            Thermostats: []Thermostat{
                {Name: "t1", Temperature: 17.5},
                {Name: "t2", Temperature: 18.5},
                {Name: "t3", Temperature: 19.5},
                {Name: "t4", Temperature: 21.5},
                {Name: "t5", Temperature: 22.5},
                {Name: "t6", Temperature: 23.0},
                {Name: "t7", Temperature: 34.0},
                {Name: "t8", Temperature: 26.0},
                {Name: "t9", Temperature: 27.5},
            },
        },
        &Plan{
            Switches: []Switch{
                {Name: "s1", State: false},
                {Name: "s2", State: false},
                {Name: "s3", State: true},
                {Name: "s4", State: true},
                {Name: "s5", State: true},
                {Name: "s6", State: false},
                {Name: "s7", State: false},
                {Name: "s8", State: true},
                {Name: "s9", State: true},
                {Name: "s10", State: true},
                {Name: "s11", State: false},
                {Name: "s12", State: false},
                {Name: "s13", State: true},
            },
            Thermostats: []Thermostat{
                {Name: "t1", Temperature: 27.5},
                {Name: "t2", Temperature: 19.5},
                {Name: "t3", Temperature: 17.5},
                {Name: "t4", Temperature: 25.5},
                {Name: "t5", Temperature: 21.5},
                {Name: "t6", Temperature: 24.0},
                {Name: "t7", Temperature: 24.0},
                {Name: "t8", Temperature: 16.0},
                {Name: "t9", Temperature: 17.5},
            },
        })
    assert.Error(t, err)
}