import pytest from pathlib import Path from src import aggregate def test_view_mode_summary(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" test_file.write_text("def hello():\n print('world')\n", encoding="utf-8") files = [{"path": "test.py", "view_mode": "summary"}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "summary" # Content should be a summary, which typically starts with **Python** or similar assert "**Python**" in items[0]["content"] assert "functions: hello" in items[0]["content"] def test_view_mode_full(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" content = "def hello():\n print('world')\n" test_file.write_text(content, encoding="utf-8") files = [{"path": "test.py", "view_mode": "full"}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "full" assert items[0]["content"] == content def test_view_mode_skeleton(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" content = "def hello():\n \"\"\"Docstring.\"\"\"\n print('world')\n" test_file.write_text(content, encoding="utf-8") files = [{"path": "test.py", "view_mode": "skeleton"}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "skeleton" # Skeleton should have '...' instead of 'print' assert "def hello():" in items[0]["content"] assert "Docstring" in items[0]["content"] assert "..." in items[0]["content"] assert "print('world')" not in items[0]["content"] def test_view_mode_outline(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" content = "def hello():\n \"\"\"Docstring.\"\"\"\n print('world')\n" test_file.write_text(content, encoding="utf-8") files = [{"path": "test.py", "view_mode": "outline"}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "outline" # Outline should have [Func] hello (Lines 1-3) assert "[Func] hello (Lines 1-3)" in items[0]["content"] def test_view_mode_none(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" test_file.write_text("def hello():\n print('world')\n", encoding="utf-8") files = [{"path": "test.py", "view_mode": "none"}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "none" assert items[0]["content"] == "(context excluded)" def test_view_mode_default_summary(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" test_file.write_text("def hello():\n print('world')\n", encoding="utf-8") # Test with explicit summary mode files = [{"path": "test.py", "view_mode": "summary"}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "summary" assert "**Python**" in items[0]["content"] def test_files_section_rendering(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() # Full item full_item = { "path": base_dir / "full.txt", "entry": "full.txt", "content": "Full content", "view_mode": "full", "auto_aggregate": True } # Summary item summary_item = { "path": base_dir / "summary.txt", "entry": "summary.txt", "content": "**Summary** content", "view_mode": "summary", "auto_aggregate": True } sections = aggregate._build_files_section_from_items([full_item, summary_item]) # Full should be in backticks assert "### `full.txt`" in sections assert "```txt\nFull content\n```" in sections # Summary should NOT be in backticks assert "### `summary.txt`" in sections assert "```txt\n**Summary** content\n```" not in sections assert "**Summary** content" in sections def test_view_mode_custom(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" content = "line1\nline2\nline3\nline4\nline5\n" test_file.write_text(content, encoding="utf-8") slices = [ {"start_line": 1, "end_line": 2, "tag": "top", "comment": "header"}, {"start_line": 4, "end_line": 5, "tag": "bottom", "comment": "footer"} ] files = [{"path": "test.py", "view_mode": "custom", "custom_slices": slices}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "custom" # Check formatting expected_1 = "---\n[Slice: top] (header)\nLines 1-2:\nline1\nline2" expected_2 = "---\n[Slice: bottom] (footer)\nLines 4-5:\nline4\nline5" assert expected_1 in items[0]["content"] assert expected_2 in items[0]["content"] assert "line3" not in items[0]["content"] def test_view_mode_custom_empty_default_to_summary(tmp_path): base_dir = tmp_path / "project" base_dir.mkdir() test_file = base_dir / "test.py" test_file.write_text("def hello():\n print('world')\n", encoding="utf-8") files = [{"path": "test.py", "view_mode": "custom", "custom_slices": []}] items = aggregate.build_file_items(base_dir, files) assert len(items) == 1 assert items[0]["view_mode"] == "custom" # Should default to summary assert "**Python**" in items[0]["content"]