Add test suite (63 tests) and CI workflow, fix Settings API bugs
Some checks failed
Release / Bump version and tag (push) Successful in 4s
Sidecar Release / Bump sidecar version and tag (push) Failing after 3s
Tests / Python Backend Tests (push) Failing after 3s
Tests / Frontend Tests (push) Successful in 8s
Tests / Rust Sidecar Tests (push) Successful in 3m10s
Some checks failed
Release / Bump version and tag (push) Successful in 4s
Sidecar Release / Bump sidecar version and tag (push) Failing after 3s
Tests / Python Backend Tests (push) Failing after 3s
Tests / Frontend Tests (push) Successful in 8s
Tests / Rust Sidecar Tests (push) Successful in 3m10s
Test suite covering all three layers: Python backend (25 tests): - AppController: state machine, start/stop, callbacks, settings reload - API server: REST endpoints, config CRUD, status, devices - Config: dot-notation get/set, persistence, nested paths - Main headless: ready event port format validation Svelte frontend (14 tests via Vitest): - Backend store: exported properties/methods, port derivation, URLs - Config store: method names (fetchConfig not loadConfig), defaults - Transcriptions store: add/clear/plaintext - File extension regression: ensures $state runes only in .svelte.ts Rust sidecar (24 tests via cargo test): - Platform/arch detection, asset name construction - Ready event deserialization (with extra fields tolerance) - Path construction, version read/write, old version cleanup - Zip extraction, SidecarManager lifecycle CI workflow (.gitea/workflows/test.yml): - Runs on push to main and PRs - Three parallel jobs: Python, Frontend, Rust Also fixes three bugs found during test planning: - Settings: /api/check-updates -> GET /api/check-update - Settings: /api/remote/login -> /api/login - Settings: /api/remote/register -> /api/register Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
56
backend/tests/test_main_headless.py
Normal file
56
backend/tests/test_main_headless.py
Normal file
@@ -0,0 +1,56 @@
|
||||
"""Tests for backend.main_headless ready-event JSON format."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
# Ensure project root is on path
|
||||
project_root = Path(__file__).resolve().parent.parent.parent
|
||||
sys.path.insert(0, str(project_root))
|
||||
|
||||
|
||||
def test_ready_event_reports_api_port_not_obs_port():
|
||||
"""The ready JSON printed by main_headless must set ``port`` to
|
||||
``obs_port + 1`` (the API port), not the OBS display port.
|
||||
|
||||
From main_headless.py::
|
||||
|
||||
obs_port = controller.actual_web_port or args.port
|
||||
api_port = obs_port + 1
|
||||
|
||||
print(json.dumps({
|
||||
"event": "ready",
|
||||
"port": api_port,
|
||||
"obs_port": obs_port,
|
||||
}), flush=True)
|
||||
|
||||
We verify this contract by reading the source and checking the
|
||||
structure directly (running main() would start a real server).
|
||||
"""
|
||||
import ast
|
||||
import textwrap
|
||||
|
||||
source_path = project_root / "backend" / "main_headless.py"
|
||||
source = source_path.read_text()
|
||||
|
||||
# Verify the key relationships exist in the source:
|
||||
# 1. api_port = obs_port + 1
|
||||
assert "api_port = obs_port + 1" in source, (
|
||||
"Expected `api_port = obs_port + 1` in main_headless.py"
|
||||
)
|
||||
|
||||
# 2. The ready event JSON uses api_port for "port", not obs_port
|
||||
assert '"port": api_port' in source or "'port': api_port" in source, (
|
||||
"The ready event should report api_port as 'port'"
|
||||
)
|
||||
|
||||
# 3. obs_port is also included separately
|
||||
assert '"obs_port": obs_port' in source or "'obs_port': obs_port" in source, (
|
||||
"The ready event should also include 'obs_port'"
|
||||
)
|
||||
|
||||
# 4. Verify the event name
|
||||
assert '"event": "ready"' in source or "'event': 'ready'" in source, (
|
||||
"The ready event should have event='ready'"
|
||||
)
|
||||
Reference in New Issue
Block a user