# Home Assistant MQTT test harness tests This harness runs retained MQTT discovery messages through Mosquitto and a real Home Assistant container. It verifies the behavior that firmware unit tests cannot: Home Assistant's entity-registry identity, user-owned registry changes, and retained discovery after a Home Assistant restart. It has two ordered modes: 1. `migration` publishes single-component discovery, applies a user rename and disable, then sends `migrate_discovery` markers, a device bundle, and legacy retained-topic cleanup. 2. `retained-restart` runs after Home Assistant restarts and verifies the retained device bundle plus preserved registry customization. The migration case also rejects malformed retained JSON, checks that a direct single-to-device publication does not duplicate registry identity, exercises the device-component tombstone/omission sequence, and makes the current `def_ent_id`/no-`obj_id` schema expectation explicit. ## Run locally From the repository root: ```bash HA_VERSION=2024.11.3 docker compose -f tests/ha-test-harness/compose.yaml up -d mqtt homeassistant HA_VERSION=2024.11.3 docker compose -f tests/ha-test-harness/compose.yaml run --rm tests HA_VERSION=2024.11.3 docker compose -f tests/ha-test-harness/compose.yaml restart homeassistant TEST_HARNESS_MODE=retained-restart HA_VERSION=2024.11.3 docker compose -f tests/ha-test-harness/compose.yaml run --rm tests HA_VERSION=2024.11.3 docker compose -f tests/ha-test-harness/compose.yaml down -v ``` Use `HA_VERSION=stable` and `HA_VERSION=dev` for the current supported and development Home Assistant images. The checked-in GitHub workflow runs the baseline, stable, and development images as a compatibility audit. When it is on the repository's default branch, GitHub exposes it for manual dispatch and the weekly schedule. It is not a tag-release gate. For a local development-image test, add `TEST_HARNESS_EXPECT_DISABLED_CLEANUP=1` to both `docker compose run ... tests` commands. That lane checks that initially disabled device components are cleaned. The test uses only ephemeral named volumes; `down -v` removes its broker data, Home Assistant config, owner token, and registry state. ## Shared support The schema-neutral [HA/MQTT test harness testkit](../../test-support/ha-mqtt-test-harness/README.md) owns only Docker-side Home Assistant onboarding, MQTT transport, registry/service access, retries, and artifact helpers. It has no ArduinoHA discovery assertions. This suite owns ArduinoHA migration fixtures; DeviceFramework carries its own fixtures and hardware adapter while reusing the testkit. ## Scope The firmware's native Unity suite covers JSON escaping, invalid topic tokens, serializer preflight, migration ordering, component removal, and lifecycle behavior. This container suite covers Home Assistant's persistence test harness. It does not need a physical board: fixture discovery documents mirror retained payloads emitted by ArduinoHA and isolate Home Assistant/MQTT compatibility.