{-# LANGUAGE OverloadedStrings #-} module KitchenSpec (spec) where import AFRP (Event (..), entities) import qualified Data.Set as S import qualified Data.Text as T import Data.Aeson (Value) import HomeAssistant.Controller import HomeAssistant.Controller.Kitchen import Support import Test.Hspec import Data.Default (def) import Data.Time (getCurrentTime, addUTCTime) -- Helper functions for creating test events testDinnerLightLevel :: Int -> Event Value testDinnerLightLevel level = Event (stateEvent "sensor.sijainti_keittio_light_level" (T.pack $ show level)) testDinnerPresence :: T.Text -> Event Value testDinnerPresence state = Event (stateEvent "binary_sensor.sijainti_keittio_occupancy" state) spec :: Spec spec = describe "Kitchen" $ do dinnerTableSpec dinnerTableSpec :: Spec dinnerTableSpec = describe "dinnerTableController" $ do it "subscribes to the light level sensor" $ do entities dinnerTableController `shouldBe` S.fromList ["sensor.sijainti_keittio_light_level", "binary_sensor.sijainti_keittio_occupancy"] it "subscribes to the presence sensor" $ do entities dinnerTableController `shouldBe` S.fromList ["sensor.sijainti_keittio_light_level", "binary_sensor.sijainti_keittio_occupancy"] it "turns lights on when presence is occupied and light level is low" $ do services (runHASS dinnerTableController [testDinnerLightLevel 10, testDinnerPresence "on"]) `shouldBe` [[switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] True], [switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] False, light [EntityId "light.kitchen_dining_large"] (On def)]] it "turns lights to sleep when presence is unoccupied" $ do now <- getCurrentTime services (runHASSTimed dinnerTableController [(now, testDinnerLightLevel 10), (now, testDinnerPresence "off")]) `shouldBe` [[switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] True], []] it "turns lights off when no presence for 300 seconds" $ do now <- getCurrentTime let later = 305 `addUTCTime` now services (runHASSTimed dinnerTableController [(now, testDinnerLightLevel 10), (now, testDinnerPresence "off"), (later, Tick)]) `shouldBe` [[switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] True], [], [switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] False, light [EntityId "light.kitchen_dining_large"] Off]] it "does nothing on Tick" $ do services (runHASS dinnerTableController [Tick]) `shouldBe` [[switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] True]]