import importlib.util import json from pathlib import Path import subprocess import sys from importlib.resources import files from starlette.testclient import TestClient from viano_bug_analysis.api import APIConfig,Project from viano_bug_analysis.api.app import create_app ROOT=Path(__file__).resolve().parents[1] def test_bundle_matches_authoritative_sources_and_is_packaged(): spec=importlib.util.spec_from_file_location('manual_builder',ROOT/'scripts/build_user_manual.py') builder=importlib.util.module_from_spec(spec);spec.loader.exec_module(builder) packaged=json.loads(files('viano_bug_analysis.web').joinpath('user-manual.json').read_text(encoding='utf-8')) assert packaged==builder.bundle() assert len(packaged['documents'])==9 assert len({d['id'] for d in packaged['documents']})==9 assert 'user-manual.json' in (ROOT/'pyproject.toml').read_text() subprocess.run([sys.executable,str(ROOT/'scripts/build_user_manual.py'),'--check'],check=True) def test_manual_requires_login_and_does_not_run_worker(tmp_path): config=APIConfig(tmp_path,(Project('p','wow','vcore'),),()) app=create_app(config);app.state.sessions.users.manage('create_user','reader','password') client=TestClient(app) assert client.get('/v1/manual').status_code==401 client.post('/v1/auth/login',json={'username':'reader','password':'password'}) response=client.get('/v1/manual') assert response.status_code==200 and response.headers['cache-control']=='no-store' docs={d['id']:d for d in response.json()['documents']} assert 'So arbeitet BugAnalysis' in docs['user-guide']['markdown'] assert 'password_env' in docs['project-configuration']['markdown'] assert 'retry-handoffs' in docs['capture-worker']['markdown'] assert str(tmp_path) not in response.text assert not (tmp_path/'runtime/worker/status.json').exists() assert client.get('/assets/user-manual.js').status_code==200 assert client.get('/assets/user-manual.json').status_code==404