mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-06 14:39:22 +00:00
test: put the package stub in one place, under an honest condition
Чистые тесты подменяли custom_components и custom_components.houseplan пустышками и не убирали их никогда. В CI это не стреляло только потому, что настоящий пакет успевал импортироваться из файла, который идёт раньше по алфавиту: условие «если ещё не импортирован» оказывалось ложным. То есть корректность HA-харнесса держалась на именах файлов в каталоге, и хватило бы переименования, чтобы получить #389 заново. Подмена переехала в conftest и стала условной по единственному честному признаку: есть Home Assistant — работаем с настоящим пакетом и не подменяем ничего; нет — HA-тесты и так пропущены, ломать нечего. Первым заходом я делал подмену обратимой прямо в тестах, контекстным менеджером. Замер показал, что так теряется работоспособность test_wall_segment_model в песочнице: он импортирует пакет обычным способом и жил как раз за счёт чужой пустышки. Развилка в conftest сохраняет оба окружения и убирает зависимость от порядка файлов. Проверено в обе стороны: в песочнице 240 passed, а в эмуляции «HA есть» объект пакета после прогона тот же, что был до. Issue: #394 User-Visible: no
This commit is contained in:
@@ -6,38 +6,29 @@ fixtures to the TypeScript checks and to this module and demands the same
|
||||
verdict, because two implementations of one rule are worth nothing if they can
|
||||
disagree.
|
||||
"""
|
||||
import importlib.util
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import types
|
||||
|
||||
import pytest
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from pure_imports import load_pure
|
||||
|
||||
_ROOT = os.path.dirname(os.path.dirname(__file__))
|
||||
_PACKAGE_ROOT = os.path.join(_ROOT, "custom_components")
|
||||
_HOUSEPLAN_ROOT = os.path.join(_PACKAGE_ROOT, "houseplan")
|
||||
|
||||
if "custom_components" not in sys.modules:
|
||||
package = types.ModuleType("custom_components")
|
||||
package.__path__ = [_PACKAGE_ROOT]
|
||||
sys.modules["custom_components"] = package
|
||||
if "custom_components.houseplan" not in sys.modules:
|
||||
package = types.ModuleType("custom_components.houseplan")
|
||||
package.__path__ = [_HOUSEPLAN_ROOT]
|
||||
sys.modules["custom_components.houseplan"] = package
|
||||
|
||||
# Loaded under its canonical package name: the module imports the migration
|
||||
# mirror relatively (`from .wall_segment_model import ...`), which only resolves
|
||||
# when the module knows the package it belongs to.
|
||||
_PATH = os.path.join(_HOUSEPLAN_ROOT, "junction_limits.py")
|
||||
_spec = importlib.util.spec_from_file_location(
|
||||
"custom_components.houseplan.junction_limits", _PATH,
|
||||
# Каноническое имя обязательно: модуль импортирует зеркало миграции
|
||||
# относительным путём (`from .wall_segment_model import ...`), а это резолвится
|
||||
# только когда модуль знает свой пакет. Подмена родительских пакетов живёт
|
||||
# ровно на время загрузки — почему именно так, см. tests_backend/pure_imports.py
|
||||
# и #394.
|
||||
jl = load_pure(
|
||||
"custom_components.houseplan.junction_limits",
|
||||
Path(_HOUSEPLAN_ROOT) / "junction_limits.py",
|
||||
)
|
||||
jl = importlib.util.module_from_spec(_spec)
|
||||
sys.modules[_spec.name] = jl
|
||||
_spec.loader.exec_module(jl)
|
||||
|
||||
CELL = 5.0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user