From f721aa0025d872584719722da57b6f66b0598426 Mon Sep 17 00:00:00 2001 From: Joshua King Date: Fri, 11 Sep 2026 07:20:17 -0400 Subject: [PATCH] feat: define shared constants in const.py --- custom_components/nestquest/__init__.py | 5 +- .../nestquest/__init__.py.metadata.json | 4 + .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 1803 bytes .../__pycache__/const.cpython-314.pyc | Bin 0 -> 989 bytes custom_components/nestquest/const.py | 20 ++++ .../nestquest/const.py.metadata.json | 4 + .../test_const.cpython-314-pytest-9.1.1.pyc | Bin 0 -> 35135 bytes ...test_manifest.cpython-314-pytest-9.1.1.pyc | Bin 0 -> 15682 bytes tests/test_const.py | 101 ++++++++++++++++++ tests/test_const.py.metadata.json | 4 + 10 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 custom_components/nestquest/__init__.py.metadata.json create mode 100644 custom_components/nestquest/__pycache__/__init__.cpython-314.pyc create mode 100644 custom_components/nestquest/__pycache__/const.cpython-314.pyc create mode 100644 custom_components/nestquest/const.py.metadata.json create mode 100644 tests/__pycache__/test_const.cpython-314-pytest-9.1.1.pyc create mode 100644 tests/__pycache__/test_manifest.cpython-314-pytest-9.1.1.pyc create mode 100644 tests/test_const.py create mode 100644 tests/test_const.py.metadata.json diff --git a/custom_components/nestquest/__init__.py b/custom_components/nestquest/__init__.py index a3753ea..6588c0a 100644 --- a/custom_components/nestquest/__init__.py +++ b/custom_components/nestquest/__init__.py @@ -1,15 +1,14 @@ """The NestQuest integration.""" from __future__ import annotations -import logging from typing import Any from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant -from .const import DOMAIN +from .const import DOMAIN, LOGGER -_LOGGER = logging.getLogger(__name__) +_LOGGER = LOGGER async def async_setup(hass: HomeAssistant, config: dict[str, Any]) -> bool: diff --git a/custom_components/nestquest/__init__.py.metadata.json b/custom_components/nestquest/__init__.py.metadata.json new file mode 100644 index 0000000..33ac6d5 --- /dev/null +++ b/custom_components/nestquest/__init__.py.metadata.json @@ -0,0 +1,4 @@ +{ + "summary": "__init__.py update using const.py imports", + "updatedAt": "2026-09-11T11:03:49.324723Z" +} \ No newline at end of file diff --git a/custom_components/nestquest/__pycache__/__init__.cpython-314.pyc b/custom_components/nestquest/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1df2ee396afccd992c863f321deac8621fabb207 GIT binary patch literal 1803 zcmbtUL2KMb6dtX#+V!s2-nfb5wr;K1NnnY!a@Tg^LK`qm$S%ZoqBw!lCPJ2Gy-Iea z?aat!eR9)6|3VKv7<%%p#~j;Ru7yI0Am9)}$<4)t&|BXdtx4?A_K*R+`DQd4ee-?q z&AFjcfj~R4`_tX08A6`o;Gn@6o3hU!ZV{UZa);PTL#by(W&&}hq1H8_Nvt-qbzSHZ zYmHnzFY2{Uot-CrP_3N_HObfW$*~0dP^`VS8|jR7#ug zt+uGKOu4uoLok9+&~@gDAPTD$B`LaL7zsJ#FjN=A9?pIih0S37awr%MOZBKj7da2O za6?haB>JV5rNzc_qF-IPa^^^QX zNhV+qTbUyBYM@jyn=3b{FygKu{xw64&li`j8mSv`nl(ni4M-Uy=G31yQbV}0%3@kw zW%!#)hG9LhA_R^E&Yopu=pfg4FZ3J^9(LJrn8DTic?i#e*OTJ#-}@R2?yFhl?J{a7 z#|B`dl!i>GEGW);47X>47)lrkffiC@cRk-5H~6R$gWrtjRVx^A+lW4L{*40+t@ zYDG;n-xY3B0MUKgbmO*QSfD$7kKP4*$fIMgdE}&`eF$r$65{~Ssa-AqedC+PAKKV& z+Srey+ategryqfP99iF=I`fw9u`$@@f4z~+54<_3itSHjIXrk@b`Ouss(90z|E`MB zn_)Y0{Wrvvl-LJA?vP?5sbaDGs4p4vLW1lBhEWL1m2#4E96$0LCn-2iGlq){D;&8b zy6AO-aGhZ)B;zf(ZQ&|RZ`*2Gd~)M}a+$)($k8Q?rWa=xR>O6P7PA~~mUGf8TGksw zD;bhY&w@#tmS+BwPUOdJdXZINPJxG?gRrM6it>mUkICdSGWv|nJtotCl2f~d@>cGJ Q4ywN>Kq4$D*nLKuJ`MFym#lo{SIaMqz7uKEXzv$^cQ4t7s9mjpDs#nXZdghpY(ly-=SuIpb z4k;I%Qa`|5ugdIk%t_yj#)nn&qIWF!>7EaNcU;T_9!=ex^Eo0{6*Ve^5-_K6W3(@J{C*uSb({A zAcyZZnBNTPJ)TkX^kx!7iJ#wNnx=h0=2vv_8%lNcsdl21y53H9^oh@U_M@JCcjuFS zwVmirXWIJPTc1#-d+O35n*5$Xy+7TV&K#ntZsx`zI^8*|kW4pg9-`^ax!gyT{h>;r EU;bt>DgXcg literal 0 HcmV?d00001 diff --git a/custom_components/nestquest/const.py b/custom_components/nestquest/const.py index 5da908d..fc45d7c 100644 --- a/custom_components/nestquest/const.py +++ b/custom_components/nestquest/const.py @@ -1,2 +1,22 @@ """Constants for the NestQuest integration.""" +from __future__ import annotations + +import logging + DOMAIN = "nestquest" +LOGGER_NAME = "custom_components.nestquest" +LOGGER = logging.getLogger(LOGGER_NAME) + +PLATFORMS: list[str] = [] + +SQLITE_DB_FILENAME = "nestquest.db" + +# Configuration keys and default values +CONF_HORIZON_DAYS = "horizon_days" +DEFAULT_HORIZON_DAYS = 14 + +CONF_DAY_ROLLOVER_TIME = "day_rollover_time" +DEFAULT_DAY_ROLLOVER_TIME = "00:00" + +CONF_PANEL_IDLE_TIMEOUT = "panel_idle_timeout" +DEFAULT_PANEL_IDLE_TIMEOUT = 300 diff --git a/custom_components/nestquest/const.py.metadata.json b/custom_components/nestquest/const.py.metadata.json new file mode 100644 index 0000000..dd77bb0 --- /dev/null +++ b/custom_components/nestquest/const.py.metadata.json @@ -0,0 +1,4 @@ +{ + "summary": "Constants implementation for NestQuest", + "updatedAt": "2026-09-11T11:03:45.346612Z" +} \ No newline at end of file diff --git a/tests/__pycache__/test_const.cpython-314-pytest-9.1.1.pyc b/tests/__pycache__/test_const.cpython-314-pytest-9.1.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bf319396bf6a6ca6fc910d2df8286f97b79f01a GIT binary patch literal 35135 zcmeHQdu$xXdEXt_aG@sW)-Km*qfd2n{OUFkG+}Sd^2;Px~f9L)&8sReC1k=Bux^*FQ;K~+&Sow zq^puD>C%gm>KJv56zN4f$zC*Ctjp|KGU8kWZ=_T&GhNE{a<~+aR*Y2W6(̆YQI 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 Q6*||$7^wdxiZ}WH082jwqyPW_ literal 0 HcmV?d00001 diff --git a/tests/test_const.py b/tests/test_const.py new file mode 100644 index 0000000..b4fa982 --- /dev/null +++ b/tests/test_const.py @@ -0,0 +1,101 @@ +"""Tests for const.py of NestQuest.""" +from __future__ import annotations + +import ast +from datetime import datetime +import logging +from pathlib import Path +import sys +from unittest.mock import MagicMock + +# Mock homeassistant modules if not installed in environment +for _mod in ("homeassistant", "homeassistant.core", "homeassistant.config_entries"): + sys.modules.setdefault(_mod, MagicMock()) + +from custom_components.nestquest import const + + +def test_domain() -> None: + """Verify DOMAIN is defined and equals 'nestquest'.""" + assert hasattr(const, "DOMAIN") + assert const.DOMAIN == "nestquest" + assert isinstance(const.DOMAIN, str) + + +def test_logger() -> None: + """Verify LOGGER_NAME and LOGGER are defined with correct types and values.""" + assert hasattr(const, "LOGGER_NAME") + assert const.LOGGER_NAME == "custom_components.nestquest" + assert isinstance(const.LOGGER_NAME, str) + + assert hasattr(const, "LOGGER") + assert isinstance(const.LOGGER, logging.Logger) + assert const.LOGGER.name == "custom_components.nestquest" + + +def test_platforms() -> None: + """Verify PLATFORMS is defined as an empty list.""" + assert hasattr(const, "PLATFORMS") + assert isinstance(const.PLATFORMS, list) + assert const.PLATFORMS == [] + + +def test_sqlite_db_filename() -> None: + """Verify SQLITE_DB_FILENAME is defined and equals 'nestquest.db'.""" + assert hasattr(const, "SQLITE_DB_FILENAME") + assert const.SQLITE_DB_FILENAME == "nestquest.db" + assert isinstance(const.SQLITE_DB_FILENAME, str) + + +def test_horizon_days_config() -> None: + """Verify CONF_HORIZON_DAYS and DEFAULT_HORIZON_DAYS are valid.""" + assert hasattr(const, "CONF_HORIZON_DAYS") + assert const.CONF_HORIZON_DAYS == "horizon_days" + assert hasattr(const, "DEFAULT_HORIZON_DAYS") + assert isinstance(const.DEFAULT_HORIZON_DAYS, int) + assert const.DEFAULT_HORIZON_DAYS == 14 + assert const.DEFAULT_HORIZON_DAYS > 0 + + +def test_day_rollover_time_config() -> None: + """Verify CONF_DAY_ROLLOVER_TIME and DEFAULT_DAY_ROLLOVER_TIME are valid.""" + assert hasattr(const, "CONF_DAY_ROLLOVER_TIME") + assert const.CONF_DAY_ROLLOVER_TIME == "day_rollover_time" + assert hasattr(const, "DEFAULT_DAY_ROLLOVER_TIME") + assert isinstance(const.DEFAULT_DAY_ROLLOVER_TIME, str) + assert const.DEFAULT_DAY_ROLLOVER_TIME == "00:00" + # Validate time format HH:MM + parsed = datetime.strptime(const.DEFAULT_DAY_ROLLOVER_TIME, "%H:%M") + assert parsed.hour == 0 and parsed.minute == 0 + + +def test_panel_idle_timeout_config() -> None: + """Verify CONF_PANEL_IDLE_TIMEOUT and DEFAULT_PANEL_IDLE_TIMEOUT are valid.""" + assert hasattr(const, "CONF_PANEL_IDLE_TIMEOUT") + assert const.CONF_PANEL_IDLE_TIMEOUT == "panel_idle_timeout" + assert hasattr(const, "DEFAULT_PANEL_IDLE_TIMEOUT") + assert isinstance(const.DEFAULT_PANEL_IDLE_TIMEOUT, int) + assert const.DEFAULT_PANEL_IDLE_TIMEOUT == 300 + assert const.DEFAULT_PANEL_IDLE_TIMEOUT > 0 + + +def test_no_hardcoded_domain_or_db_filename_in_modules() -> None: + """Ensure no module other than const.py hardcodes DOMAIN string or SQLITE_DB_FILENAME.""" + pkg_dir = Path(const.__file__).parent + py_files = [f for f in pkg_dir.glob("*.py") if f.name != "const.py"] + + assert len(py_files) > 0, "No python modules found in package to check" + + for py_file in py_files: + content = py_file.read_text(encoding="utf-8") + tree = ast.parse(content, filename=str(py_file)) + + for node in ast.walk(tree): + if isinstance(node, ast.Constant) and isinstance(node.value, str): + assert node.value != "nestquest.db", ( + f"Found hard-coded database filename '{node.value}' in {py_file.name}:{node.lineno}" + ) + if node.value == "nestquest": + raise AssertionError( + f"Found hard-coded domain string '{node.value}' in {py_file.name}:{node.lineno}" + ) diff --git a/tests/test_const.py.metadata.json b/tests/test_const.py.metadata.json new file mode 100644 index 0000000..ece0fb5 --- /dev/null +++ b/tests/test_const.py.metadata.json @@ -0,0 +1,4 @@ +{ + "summary": "test_const.py testing all constants and module isolation", + "updatedAt": "2026-09-11T11:03:56.498217Z" +} \ No newline at end of file