"""Shared fixtures for ingestion tests.""" from __future__ import annotations import json import sys from pathlib import Path from typing import Any, Dict, List from unittest.mock import MagicMock import pytest # Ensure the ingestion package is importable sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) # --------------------------------------------------------------------------- # Temporary directory fixtures # --------------------------------------------------------------------------- @pytest.fixture def tmp_input_dir(tmp_path: Path) -> Path: """Create a temp directory with a mix of supported and unsupported files.""" d = tmp_path / "input" d.mkdir() return d @pytest.fixture def tmp_output_dir(tmp_path: Path) -> Path: d = tmp_path / "output" d.mkdir() return d @pytest.fixture def populated_input_dir(tmp_input_dir: Path) -> Path: """Input dir with sample files of various types.""" # Text files (tmp_input_dir / "readme.txt").write_text("Hello, this is a test document.") (tmp_input_dir / "notes.md").write_text("# Notes\n\nSome markdown content.") # CSV file (tmp_input_dir / "data.csv").write_text("name,value\nAlice,42\nBob,99\n") # Nested subdirectory sub = tmp_input_dir / "subdir" sub.mkdir() (sub / "nested.txt").write_text("Nested content in a subdirectory.") # Unsupported files (tmp_input_dir / "binary.exe").write_bytes(b"\x00\x01\x02\x03") (tmp_input_dir / "archive.tar.gz").write_bytes(b"\x1f\x8b\x08") return tmp_input_dir # --------------------------------------------------------------------------- # Mock fixtures # --------------------------------------------------------------------------- @pytest.fixture def mock_whisper_transcriber(): """Mock WhisperTranscriber that returns fixed segments.""" mock = MagicMock() # Simulate a segment object segment = MagicMock() segment.text = "This is a test transcription." segment.start = 0.0 segment.end = 5.0 info = MagicMock() info.language = "en" info.language_probability = 0.98 mock.transcribe.return_value = ([segment], info) return mock @pytest.fixture def mock_ocr_runner(): """Mock OcrRunner that returns fixed text.""" mock = MagicMock() mock.engine = "tesseract" mock.language = "eng" mock.extract_text.return_value = "Sample OCR text from image." return mock # --------------------------------------------------------------------------- # Helpers # --------------------------------------------------------------------------- def read_jsonl(path: Path) -> List[Dict[str, Any]]: """Read a JSONL file and return list of dicts.""" records = [] with open(path, "r", encoding="utf-8") as f: for line in f: line = line.strip() if line: records.append(json.loads(line)) return records