"""Policy transcript cache layout and API bundle fields."""
from __future__ import annotations
import json
from pathlib import Path
from unittest.mock import MagicMock, patch
from scrapers.youtube.policy_transcript_cache import (
policy_transcript_sidecar_path,
policy_transcript_sidecar_paths,
resolve_policy_transcripts_dir,
write_policy_transcript_cache,
)
from scrapers.youtube.transcript_api_client import fetch_transcript_bundle
def test_policy_transcript_sidecar_path():
main = Path("/tmp/AL/county/foo_01001/ch/01_transcripts/2026-01-01_meeting.json")
raw_p = policy_transcript_sidecar_path(main)
assert raw_p.name.endswith(".caption_raw_data.json")
raw_p2, _ = policy_transcript_sidecar_paths(main)
assert raw_p2 == raw_p
def test_resolve_policy_transcripts_dir(tmp_path: Path):
folder = resolve_policy_transcripts_dir(
tmp_path,
"county_01001",
state_code="AL",
jurisdiction_type="county",
channel_id="UCxxxxxxxxxxx",
create=True,
)
assert folder.is_dir()
assert folder.name == "01_transcripts"
assert "UCxxxxxxxxxxx" in str(folder)
def test_write_policy_transcript_cache(tmp_path: Path):
out = write_policy_transcript_cache(
tmp_path,
jurisdiction_id="county_01001",
state_code="AL",
row={
"video_id": "abc123",
"title": "Board Meeting",
"event_date": "2026-01-15",
"channel_id": "UCxxxxxxxxxxx",
"video_url": "https://www.youtube.com/watch?v=abc123",
"jurisdiction_id": "county_01001",
},
yt={"raw_text": "hello", "segments": [], "transcript_source": "youtube_transcript_api"},
caption_raw_data=[{"text": "hello", "start": 0.0, "duration": 1.0}],
jurisdiction_type="county",
)
assert "01_transcripts" in str(out)
payload = json.loads(out.read_text(encoding="utf-8"))
assert payload["caption_raw_data"][0]["text"] == "hello"
assert payload["caption_preserve_formatting"] is True
assert not policy_transcript_sidecar_path(out).is_file()
assert not (out.parent / f"{out.stem}.caption_formatted.json").exists()
@patch("scrapers.youtube.transcript_api_client.build_youtube_transcript_api")
def test_fetch_transcript_bundle_single_preserve_formatting_call(mock_build: MagicMock):
snippet = MagicMock(text="hi", start=0.0, duration=1.0)
fetched = MagicMock(
snippets=[snippet],
language_code="en",
is_generated=False,
)
fetched.to_raw_data.return_value = [
{"text": "hi", "start": 0.0, "duration": 1.0}
]
api = MagicMock()
api.fetch.return_value = fetched
mock_build.return_value = api
result = fetch_transcript_bundle(
"vid1",
cookies_file="/nonexistent/cookies.txt",
retry_on_block=False,
)
api.fetch.assert_called_once()
assert api.fetch.call_args.kwargs.get("preserve_formatting") is True
assert result["caption_raw_data"] == fetched.to_raw_data.return_value
assert result["caption_preserve_formatting"] is True
assert "caption_formatted" not in result