mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 13:34:40 +00:00
a6c20a0054
The two scaffold workflows (Python application / Python package) failed on
every PR: they installed deps from a non-existent requirements.txt, ran
flake8/pytest over the vendored yt_dlp fork (new syntax under the 3.8/3.9
matrix), and collected ad-hoc root scripts — notably test_ai.py, which is
an invalid pasted object dump (not Python).
- Remove python-app.yml / python-package.yml and the junk root scripts
(test.py, test_ai.py, test_time.py)
- Add .github/workflows/ci.yml with three PR-check jobs:
* compile — py_compile every first-party .py (no deps)
* unit — pytest on pure logic (conanjurer_functions, constants)
* integration — boot the Flask services and assert the X-Conjurer-Api-Key
auth contract (communication_subroutine + conjurer_musician)
- Add tests/ suite, pytest.ini (testpaths=tests) and conftest.py (sys.path)
Fixes surfaced by the compile gate / needed for the integration job:
- conjurer_librarian/search_bot.py + search_bot2.py: f-string reused the
same quote ({item["exists"]}) -> SyntaxError on Python < 3.12
- conjurer_musician/media_search_functions.py: made import-safe
(env-overridable paths, lazy DB load / mkdir) so the service can be
imported and tested off the Pi
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""Unit tests for constants helpers (defensive config / auth headers)."""
|
|
import constants
|
|
|
|
|
|
def test_service_headers_empty_when_no_key(monkeypatch):
|
|
monkeypatch.setattr(constants, "API_SHARED_KEY", "")
|
|
assert constants.service_headers() == {}
|
|
|
|
|
|
def test_service_headers_with_key(monkeypatch):
|
|
monkeypatch.setattr(constants, "API_SHARED_KEY", "s3cr3t")
|
|
assert constants.service_headers() == {"X-Conjurer-Api-Key": "s3cr3t"}
|
|
|
|
|
|
def test_load_json_missing_returns_fallback(tmp_path):
|
|
missing = tmp_path / "nope.json"
|
|
assert constants._load_json(str(missing), {"fallback": 1}) == {"fallback": 1}
|
|
|
|
|
|
def test_load_json_valid(tmp_path):
|
|
good = tmp_path / "ok.json"
|
|
good.write_text('{"a": 2}', encoding="utf-8")
|
|
assert constants._load_json(str(good), {}) == {"a": 2}
|
|
|
|
|
|
def test_load_json_corrupt_returns_fallback(tmp_path):
|
|
bad = tmp_path / "bad.json"
|
|
bad.write_text("{ not valid json", encoding="utf-8")
|
|
assert constants._load_json(str(bad), []) == []
|
|
|
|
|
|
def test_conan_defaults_present():
|
|
# Feature toggles default to "off" so the bridge stays dormant.
|
|
assert constants.CONAN_JOIN_CHANNEL_ID == 0
|
|
assert constants.CONAN_RCON_HOST == ""
|