From 596024ce2573759f45f619a66ac43c5c9a6719c6 Mon Sep 17 00:00:00 2001 From: Jiri Luzny Date: Mon, 4 Dec 2023 21:56:27 +0100 Subject: [PATCH] Added check of entity state change callback. --- example/config.yaml | 8 ++-- example/example_live_test.go | 74 ++++++++++++++++++++++++------------ 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/example/config.yaml b/example/config.yaml index 9e42dee..5c72f02 100644 --- a/example/config.yaml +++ b/example/config.yaml @@ -1,7 +1,7 @@ -app: - ip_address: 192.168.0.204 +hass: + address: 192.168.0.204 port: 8123 - home_zone_entity_id: zone.home + zone: zone.home entities: - light_entity_id: light.office_bed_lamp + light_entity_id: light.office_desk_lamp diff --git a/example/example_live_test.go b/example/example_live_test.go index 92d6e0e..85fe40d 100644 --- a/example/example_live_test.go +++ b/example/example_live_test.go @@ -15,16 +15,17 @@ import ( type ( MySuite struct { suite.Suite - app *ga.App - config *Config + app *ga.App + config *Config + suiteCtx map[string]any } Config struct { - App struct { - HAAuthToken string `yaml:"ha_auth_token"` - IpAddress string `yaml:"ip_address"` + Hass struct { + HAAuthToken string `yaml:"token"` + IpAddress string `yaml:"address"` Port string `yaml:"port"` - HomeZoneEntityId string `yaml:"home_zone_entity_id"` + HomeZoneEntityId string `yaml:"zone"` } Entities struct { LightEntityId string `yaml:"light_entity_id"` @@ -32,55 +33,78 @@ type ( } ) -func (s *MySuite) SetupTest() { +func (s *MySuite) SetupSuite() { + s.suiteCtx = make(map[string]any) + configFile, err := os.ReadFile("./config.yaml") if err != nil { slog.Error("Error reading config file", err) } s.config = &Config{} // either env var or config file can be used to set HA auth. token - s.config.App.HAAuthToken = os.Getenv("HA_AUTH_TOKEN") + s.config.Hass.HAAuthToken = os.Getenv("HA_AUTH_TOKEN") if err := yaml.Unmarshal(configFile, s.config); err != nil { slog.Error("Error unmarshalling config file:", err) } s.app, err = ga.NewApp(ga.NewAppRequest{ - HAAuthToken: s.config.App.HAAuthToken, - IpAddress: s.config.App.IpAddress, - HomeZoneEntityId: s.config.App.HomeZoneEntityId, + HAAuthToken: s.config.Hass.HAAuthToken, + IpAddress: s.config.Hass.IpAddress, + HomeZoneEntityId: s.config.Hass.HomeZoneEntityId, }) if err != nil { slog.Error("Failed to createw new app:", err) s.T().FailNow() } + + entityId := s.config.Entities.LightEntityId + if entityId != "" { + s.suiteCtx["entityCallbackInvoked"] = false + etl := ga.NewEntityListener().EntityIds(entityId).Call(s.entityCallback).Build() + s.app.RegisterEntityListeners(etl) + go s.app.Start() + } } func (s *MySuite) TearDownSuite() { if s.app != nil { s.app.Cleanup() + s.app = nil } } -// Basic test of ga app creation and light toggle service +// Basic test of light toggle service and entity listener func (s *MySuite) TestLightService() { entityId := s.config.Entities.LightEntityId - initialState, err := s.app.GetState().Get(entityId) + if entityId != "" { + initState := getEntityState(s, entityId) + s.app.GetService().Light.Toggle(entityId) + + assert.EventuallyWithT(s.T(), func(c *assert.CollectT) { + newState := getEntityState(s, entityId) + assert.NotEqual(c, initState, newState) + assert.True(c, s.suiteCtx["entityCallbackInvoked"].(bool)) + }, 10*time.Second, 1*time.Second, "State of light entity did not change or callback was invoked") + } else { + s.T().Skip("No light entity id provided") + } +} + +// Test if event has been captured after light entity state changed +func (s *MySuite) entityCallback(se *ga.Service, st ga.State, e ga.EntityData) { + slog.Info("Entity callback called.", "entity id:", e.TriggerEntityId, "from state:", e.FromState, "to state:", e.ToState) + s.suiteCtx["entityCallbackInvoked"] = true +} + +func getEntityState(s *MySuite, entityId string) string { + state, err := s.app.GetState().Get(entityId) if err != nil { slog.Error("Error getting entity state:", err) + s.T().FailNow() } - slog.Info("Initial state of entity:", "state", initialState.State) - - s.app.GetService().Light.Toggle(entityId) - - time.Sleep(1 * time.Second) // wait for state to update - - newState, err := s.app.GetState().Get(entityId) - if err != nil { - slog.Error("Error getting entity state:", err) - } - slog.Info("New state of entity:", "state", newState.State) - assert.NotEqual(s.T(), initialState.State, newState.State) + slog.Info("State of entity:", "state", state.State) + return state.State } // Run the test suite