mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-08-07 11:48:06 +00:00
test: address review feedback — fixture lifecycle, test names, ClassVar
- ci-fixture-plugin: call display_manager.clear() before rendering (per plugin guidelines — the fixture should model a well-behaved plugin), add a class docstring, and document why Pillow is deliberately not pinned in its requirements.txt (core dependency; harness installs nothing). - Rename two tests whose names contradicted their assertions: test_unparseable_core_version_is_compatible -> test_unparseable_core_with_high_floor_is_blocked, and test_unreadable_secrets_file... -> test_corrupt_secrets_file... - Annotate TestGetSchemaProperty.SCHEMA as ClassVar (RUF012). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NohXi78cwsAKtN1sCfxjUh
This commit is contained in:
@@ -16,10 +16,16 @@ from src.plugin_system.base_plugin import BasePlugin
|
|||||||
|
|
||||||
|
|
||||||
class CIFixturePlugin(BasePlugin):
|
class CIFixturePlugin(BasePlugin):
|
||||||
|
"""Deterministic CI-only fixture plugin: renders a border + diagonals
|
||||||
|
pattern sized from the display's declared dimensions. Never shipped to
|
||||||
|
devices; exists solely so the plugin safety harness has a real plugin
|
||||||
|
to exercise in CI."""
|
||||||
|
|
||||||
def update(self) -> None:
|
def update(self) -> None:
|
||||||
"""Nothing to fetch — the render is self-contained."""
|
"""Nothing to fetch — the render is self-contained."""
|
||||||
|
|
||||||
def display(self, force_clear: bool = False) -> None:
|
def display(self, force_clear: bool = False) -> None:
|
||||||
|
self.display_manager.clear()
|
||||||
width = self.display_manager.matrix.width
|
width = self.display_manager.matrix.width
|
||||||
height = self.display_manager.matrix.height
|
height = self.display_manager.matrix.height
|
||||||
border = tuple(self.config.get("border_color", [0, 255, 0]))
|
border = tuple(self.config.get("border_color", [0, 255, 0]))
|
||||||
|
|||||||
@@ -1 +1,7 @@
|
|||||||
# No dependencies — the fixture must load in any environment.
|
# No dependencies — the fixture must load in any environment.
|
||||||
|
#
|
||||||
|
# Pillow is deliberately NOT pinned here even though manager.py imports
|
||||||
|
# PIL: it is a core LEDMatrix dependency (see the repo-root
|
||||||
|
# requirements.txt), so it is always present wherever the harness runs,
|
||||||
|
# and the harness loads plugins with install_deps=False anyway. Pinning
|
||||||
|
# it here would only invite a needless pip install during test runs.
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ class TestCheck:
|
|||||||
assert ok is False
|
assert ok is False
|
||||||
assert "2.0.0 - 2.9.9" in reason
|
assert "2.0.0 - 2.9.9" in reason
|
||||||
|
|
||||||
def test_unparseable_core_version_is_compatible(self):
|
def test_unparseable_core_with_high_floor_is_blocked(self):
|
||||||
manifest = {"min_ledmatrix_version": "3.2.0",
|
manifest = {"min_ledmatrix_version": "3.2.0",
|
||||||
"compatible_versions": [">=3.2.0"]}
|
"compatible_versions": [">=3.2.0"]}
|
||||||
# An unparseable core version is "unknown", not "old"... but note
|
# An unparseable core version is "unknown", not "old"... but note
|
||||||
|
|||||||
@@ -99,9 +99,9 @@ class TestSaveStripsSecrets:
|
|||||||
on_disk = json.loads((tmp_path / "config.json").read_text())
|
on_disk = json.loads((tmp_path / "config.json").read_text())
|
||||||
assert on_disk == {"timezone": "UTC"}
|
assert on_disk == {"timezone": "UTC"}
|
||||||
|
|
||||||
def test_unreadable_secrets_file_writes_secrets_to_config_json(self, tmp_path):
|
def test_corrupt_secrets_file_writes_secrets_to_config_json(self, tmp_path):
|
||||||
# SUSPECTED BUG (characterized, not fixed): when the secrets file is
|
# SUSPECTED BUG (characterized, not fixed): when the secrets file is
|
||||||
# unreadable/corrupt at save time, save_config proceeds without
|
# corrupt (or otherwise unloadable) at save time, save_config proceeds without
|
||||||
# stripping — writing the merged secrets into config.json in
|
# stripping — writing the merged secrets into config.json in
|
||||||
# plaintext. The code comments acknowledge the tradeoff (it prevents
|
# plaintext. The code comments acknowledge the tradeoff (it prevents
|
||||||
# data loss); this test pins the behavior so any future change to it
|
# data loss); this test pins the behavior so any future change to it
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ characterized quirks marked below.
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import Any, ClassVar, Dict
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@@ -153,7 +154,7 @@ class TestParseFormValue:
|
|||||||
|
|
||||||
|
|
||||||
class TestGetSchemaProperty:
|
class TestGetSchemaProperty:
|
||||||
SCHEMA = {
|
SCHEMA: ClassVar[Dict[str, Any]] = {
|
||||||
"properties": {
|
"properties": {
|
||||||
"brightness": {"type": "integer"},
|
"brightness": {"type": "integer"},
|
||||||
"customization": {
|
"customization": {
|
||||||
|
|||||||
Reference in New Issue
Block a user