import json from pathlib import Path import subprocess import sys import tempfile import unittest from paper_atlas.cli import COMMANDS class CliTests(unittest.TestCase): def test_every_registered_command_has_help_without_starting_work(self): for route in COMMANDS: with self.subTest(route=route): result=subprocess.run([sys.executable,'-B','-m','paper_atlas',*route,'--help'],capture_output=True,text=True) self.assertEqual(result.returncode,0,result.stderr) self.assertIn('paper-atlas '+' '.join(route),result.stdout) def test_unified_import_and_query_use_shipped_schema_and_registry(self): from paper_atlas.config import DEFAULT_REGISTRY self.assertEqual(len(json.loads(DEFAULT_REGISTRY.read_text())['venues']),41) with tempfile.TemporaryDirectory() as tmp: root=Path(tmp);db=root/'db.sqlite';source=root/'records.jsonl' source.write_text(json.dumps({'source':'example','external_id':'one','url':'https://example.org','title':'CLI paper','abstract':'Abstract','authors':['Jane Doe'],'venue':'Example','year':2026,'track':'main','status':'accepted'})+'\n') source.with_suffix('.manifest.json').write_text(json.dumps({'source':'example','list_url':'https://example.org','count':1})) for args in [('import','records','--db',str(db),str(source)),('query','--db',str(db),'--stats')]: result=subprocess.run([sys.executable,'-B','-m','paper_atlas',*args],capture_output=True,text=True) self.assertEqual(result.returncode,0,result.stderr) self.assertEqual(json.loads(result.stdout)['papers'],1) if __name__=='__main__':unittest.main()