adaptive-lighting/tests
Bas Nijholt b7ad2cdd35 Fix light groups not adapting when child lights turned on (#1378)
## Summary

When a parent light group is turned off and then child lights are turned
on by an automation (e.g., motion sensor), Home Assistant may reuse the
old turn_off context ID for the parent group's state change. This caused
`just_turned_off()` to incorrectly treat the group's turn-on as a "false
positive" polling artifact, blocking adaptation.

## Root Cause

The `just_turned_off()` function checked if the off→on context ID matched
the on→off context ID. If they matched, it assumed this was a polling
artifact (HA briefly seeing the light as ON during a turn_off transition)
and cancelled adaptation.

However, for light groups, HA reuses the context ID when the parent group
turns on as a side effect of child lights turning on. This is a valid
turn-on that should be adapted.

## Fix

Use causality-based detection instead of just context ID matching:

1. Enhanced `_off_to_on_state_event_is_from_turn_on()` to check if any
   member light of a group has a `turn_on_event` that happened after the
   group's on→off event. If so, the member's turn_on explains why the
   group turned on.

2. Restructured `just_turned_off()` to check for turn_on events BEFORE
   checking for matching context IDs. Only treat matching context IDs
   as a false positive if no turn_on event explains the state change.

## Why This is Robust

| Old Approach | New Approach |
|--------------|--------------|
| Magic 1-second threshold | Actual causal relationship |
| Fails with different timing | Works regardless of timing |
| No explanation in logs | Clear log: "group turned on because member X was turned on" |

## Test Plan

- [x] Added test for light group context reuse scenario
- [x] Added test to verify polling artifacts are still detected
2026-01-13 00:34:10 -08:00
..
__init__.py Copy tests from https://github.com/home-assistant/core/pull/40626 2022-08-28 12:05:31 -07:00
conftest.py Bump to 1.27.0 for fixes in 2025.12 (#1293) 2025-11-27 09:06:41 -08:00
README.md docs: clarify Docker test setup requirements (#1383) 2026-01-11 21:57:52 +01:00
test_adaptation_utils.py Individual manual control of brightness and color (#1356) 2025-12-22 22:55:16 -08:00
test_color_and_brightness.py Code cleanup (#1348) 2025-12-12 13:37:42 -08:00
test_config_flow.py feat: add option to duplicate existing lighting instance (#1329) 2025-12-05 04:15:24 -08:00
test_hass_utils.py Test HA core v2023.6 until v2024.2 (#942) 2024-04-06 10:14:54 +02:00
test_init.py Test HA core v2023.6 until v2024.2 (#942) 2024-04-06 10:14:54 +02:00
test_switch.py Fix light groups not adapting when child lights turned on (#1378) 2026-01-13 00:34:10 -08:00

Developer notes for the tests directory

To run the tests, check out the CI configuration to see how they are executed in the CI pipeline. Alternatively, you can use the provided Docker image to run the tests locally or run them with VS Code directly in the dev container.

Prerequisites

Before running tests with Docker, you need a local Home Assistant core checkout with symlinks:

# Clone HA core (one-time setup)
git clone --depth 1 https://github.com/home-assistant/core.git core

# Setup symlinks (one-time setup)
./scripts/setup-symlinks

Running tests with Docker

Navigate to the adaptive-lighting repo folder and execute the following command.

Important: Mount the entire repo (-v $(pwd):/app), not individual directories, or the symlinks will break.

Linux / MacOS / Windows PowerShell:

docker run -v ${PWD}:/app basnijholt/adaptive-lighting:latest
  • In windows command prompt, the command is:
    docker run -v %cd%:/app basnijholt/adaptive-lighting:latest
    

This command will download the Docker image from the adaptive-lighting Docker Hub repo and run the tests.

If you prefer to build the image yourself, use the following command:

docker build -t basnijholt/adaptive-lighting:latest --no-cache --progress=plain .

This might be necessary if the image on Docker Hub is outdated or if the test_dependencies.py file is updated.

Passing arguments to pytest

You can pass arguments to pytest by appending them to the command:

For example, to run the tests with a custom log format, use the following command (this also gets rid of the captured stderr output):

docker run -v $(pwd):/app basnijholt/adaptive-lighting:latest --show-capture=log --log-format="%(asctime)s %(levelname)-8s %(name)s:%(filename)s:%(lineno)s %(message)s" --log-date-format="%H:%M:%S" tests/components/adaptive_lighting/