"""Full integration test — all tools + architecture + pipeline.""" import sys, os, asyncio _root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, _root) OUT = os.path.join(_root, "tests", "cli_test_output.txt") lines = [] # ===== 1. Architecture: imports ===== lines.append("=== Architecture Imports ===") tests = [ ("core.gemini_caller", "GeminiCaller, GeminiCallError"), ("core.orchestrator", "Orchestrator"), ("core.task_pipeline", "TaskPipeline"), ("tools.anime_pipeline", "AnimePipeline"), ("tools.anissia_client", "AnissiaClient"), ("tools.nyaa_client", "NyaaClient"), ("tools.qbit_client", "QBitClient"), ("tools.nas_scanner", "NasScanner"), ("tools.title_matcher", "match_titles, japanese_to_romaji"), ("tools.subtitle_downloader", "SubtitleDownloader"), ("handlers.renderer", "safe_send_embed"), ] for mod, names in tests: try: exec(f"from {mod} import {names}") lines.append(f" OK {mod}") except Exception as e: lines.append(f" FAIL {mod}: {e}") # ===== 2. Deleted files ===== lines.append("\n=== Deleted Files ===") for f in ["tools/base.py", "tools/registry.py", "tools/anime_tool.py", "prompts/planner.md", "prompts/coder.md", "prompts/summarizer.md"]: exists = os.path.exists(os.path.join(_root, f)) lines.append(f" {'FAIL exists' if exists else 'OK deleted'} {f}") # ===== 3. Required files ===== lines.append("\n=== Required Files ===") for f in ["prompts/agent.md", "prompts/unified.md", "prompts/reviewer.md", ".gemini/skills/anime/SKILL.md"]: exists = os.path.exists(os.path.join(_root, f)) lines.append(f" {'OK' if exists else 'FAIL missing'} {f}") # ===== 4. Title Matcher (pykakasi) ===== lines.append("\n=== Title Matcher ===") from tools.title_matcher import japanese_to_romaji, title_similarity cases = [ ("sousouno furiiren", "sousou no furiiren"), ("Sousou no Frieren", "sousou no furiiren"), ] romaji = japanese_to_romaji("sousouno furiiren") lines.append(f" pykakasi('sousouno furiiren'): {romaji}") for a, b in cases: sim = title_similarity(a, b) lines.append(f" sim('{a[:30]}', '{b[:30]}'): {sim:.3f}") # ===== 5. NAS Scanner ===== lines.append("\n=== NAS Scanner ===") from tools.nas_scanner import NasScanner scanner = NasScanner() lines.append(f" accessible: {scanner.is_accessible()}") if scanner.is_accessible(): folders = scanner.list_anime_folders() lines.append(f" total folders: {len(folders)}") current = scanner.get_current_quarter_anime() lines.append(f" current quarter: {len(current)} anime") for f in current[:5]: lines.append(f" {f.folder_name} vid:{f.video_count} sub:{f.subtitle_count}") # ===== 6. Async tests ===== async def async_tests(): # 6a. Anissia search lines.append("\n=== Anissia Search ===") from tools.anissia_client import AnissiaClient ac = AnissiaClient() for kw in ["frieren", "sousou"]: r = await ac.search_anime(kw) lines.append(f" '{kw}': {len(r)} results") # 6b. Nyaa search lines.append("\n=== Nyaa Search ===") from tools.nyaa_client import NyaaClient nc = NyaaClient() r = await nc.search("Sousou no Frieren", use_default_suffix=True) lines.append(f" 'Sousou no Frieren ASW HEVC': {len(r)} results") if r: lines.append(f" top: [{r[0].group}] {r[0].title[:50]} S:{r[0].seeders}") # 6c. Pipeline search lines.append("\n=== Pipeline Search ===") from tools.anime_pipeline import AnimePipeline pipe = AnimePipeline() try: result = await pipe.search("sousou") lines.append(f" success: {result.success}") lines.append(f" anime: {result.anime.subject if result.anime else 'None'}") lines.append(f" captions: {len(result.captions)}") lines.append(f" torrents: {len(result.torrents)}") lines.append(f" nas_folder: {result.nas_folder}") if result.errors: lines.append(f" errors: {'; '.join(result.errors[:3])}") except Exception as e: lines.append(f" ERROR: {e}") # 6d. qBittorrent lines.append("\n=== qBittorrent ===") from tools.qbit_client import QBitClient qb = QBitClient() info = await qb.test_connection() lines.append(f" connected: {info.get('connected')}") if info.get('connected'): lines.append(f" version: {info.get('version')}") asyncio.run(async_tests()) lines.append("\n=== ALL TESTS DONE ===") with open(OUT, "w", encoding="utf-8-sig") as f: f.write("\n".join(lines))