Home Assistant Testing Playbook

SkillDev tools

Practical test/CI playbook for Home Assistant custom components (config flow, coordinator, entities, diagnostics)

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the Home Assistant Testing Playbook skill

What this skill tells your AI

The instructions your AI receives, as published by taurgis/has-marstek-local-api in .agents/skills/homeassistant-testing-playbook/SKILL.md and read by ahel’s review.

Use this skill to design and implement tests/CI for a custom integration targeting Bronze/Silver quality scale.

When to Use

  • Adding or improving tests (tests/ structure, fixtures, snapshots)
  • Ensuring config flow coverage and duplicate/reauth handling
  • Verifying coordinator error handling/unavailable states
  • Planning CI (hassfest, lint, pytest, coverage)

Test Layout

  • tests/
    • conftest.py: enable custom integrations; shared fixtures (MockConfigEntry, mock UDP/HTTP, snapshot extension)
    • test_config_flow.py: user/discovery/reauth/options flows
    • test_init.py: setup/unload/reload lifecycle
    • Platform tests (e.g., test_sensor.py) per platform
    • fixtures/: sanitized API/device payloads for mocks/snapshots

Fixtures & Tools

  • pytest-homeassistant-custom-component: hass fixture, MockConfigEntry, aiohttp client mock (if HTTP), time helpers.
  • Snapshot: syrupy + HomeAssistantSnapshotExtension for diagnostics/device registry/entity attributes; redact secrets before snapshotting.
  • Time travel: freezer + async_fire_time_changed to advance coordinator timers.
  • Coverage: pytest --cov=custom_components.marstek --cov-report=xml --cov-fail-under=95.
  • Examples: see references/EXAMPLES.md for skeleton tests (config flow, setup/unload, coordinator failures, diagnostics snapshots).
  • Repo scaffold: see tests/ and requirements_test.txt for pinned deps and starter tests.

Config Flow Test Matrix

  • Happy path: discovery list → select → creates entry; asserts unique_id set.
  • Errors: cannot_connect, invalid_auth, invalid_discovery_info, already_configured aborts.
  • DHCP/integration discovery: updates host when MAC matches; aborts duplicate.
  • Options flow: returns form and creates entry; ensure reload listener is in place.
  • Reauth (if applicable): asks only for changed credential; updates existing entry.

Coordinator & Entities

  • Mock transport/library to avoid real network.
  • Happy path: coordinator populates data; entities render expected state/attributes/units.
  • Failure path: transport error → UpdateFailed → entities become unavailable; last_update_success false.
  • Debounce/refresh: multiple async_request_refresh calls coalesce to one fetch (spy call count).
  • Entity gating: only create entities when data keys exist; ensure unique_id stable (MAC-based) and device_info shared.

Actions/Commands (if present)

  • Verify polling is paused during commands; retries/backoff executed; verification logic validates device state.
  • Failure surfaces as error (no silent success); no extra coordinator fetches are triggered concurrently.

Diagnostics & Snapshots (Gold path)

  • Add diagnostics view; snapshot output with syrupy; ensure secrets (tokens, IPs if needed) are redacted.
  • Device registry snapshot: manufacturer/model/identifiers/connections are correct and stable.

CI Pipeline

  • hassfest before tests; lint with ruff and mypy --strict (required, not optional).
  • Matrix on latest supported Python versions.
  • Pin test deps in requirements_test.txt to avoid drift.
  • Optional: upload coverage (e.g., Codecov) for PR diffs.

Live Home Assistant in Docker is not a substitute for pytest. For delete/re-add, discovery vs manual add, live coordinator updates, device actions, and automations against .devcontainer/docker-compose.yml, use skill homeassistant-chrome-ui-testing (ha_cdp.py, CDP only).

Verification After Changes (MANDATORY)

After every code modification, you MUST run verification:

# 1. Type checking (strict mode enforced)
python3 -m mypy --strict custom_components/<domain>/

# 2. Run all tests (add `-n "$(nproc)"` to use pytest-xdist; coverage is combined)
pytest tests/ -q

Do not consider work complete until both pass. This catches:

  • Type annotation errors (missing return types, wrong argument types)
  • Regressions in existing functionality
  • Integration issues between components

Fix failures immediately before moving on.

Quick Checklist

  • Config flow tests cover success + cannot_connect + invalid_auth + invalid_discovery_info + already_configured
  • Options flow tested; reload listener present
  • Coordinator tests cover success + UpdateFailed path → entities unavailable
  • Entities only created for available data keys; unique IDs MAC-based
  • Actions pause polling, retry, and verify outcomes
  • Snapshots for diagnostics/device registry (if diagnostics enabled)
  • CI runs hassfest, lint, pytest with coverage gate
  • mypy --strict passes (0 errors)
  • All tests pass (pytest tests/ -q)

Signals

GitHub stars
35
Forks
5
Last commit
Sep 2026
Advanced
Item type
skill
Key
homeassistant-testing-playbook
Source
github.com/taurgis/has-marstek-local-api