from unittest.mock import patch, MagicMock from ingestion.transcript import fetch_transcript, _parse_transcript def _mock_response(data: dict) -> MagicMock: m = MagicMock() m.json.return_value = data m.raise_for_status = MagicMock() return m @patch("ingestion.transcript._next_key", return_value="test-key") @patch("ingestion.transcript.httpx.get") def test_fetch_transcript_list_format(mock_get, mock_key): mock_get.return_value = _mock_response({ "symbol": "AAPL", "quarter": "2024Q4", "transcript": [ {"speaker": "Tim Cook", "title": "CEO", "content": "We had a record quarter."}, {"speaker": "Luca Maestri", "title": "CFO", "content": "Gross margin was 46.2%."}, ] }) text = fetch_transcript("AAPL", "2024Q4") assert "Tim Cook" in text assert "record quarter" in text assert "Gross margin" in text @patch("ingestion.transcript._next_key", return_value="test-key") @patch("ingestion.transcript.httpx.get") def test_fetch_transcript_string_format(mock_get, mock_key): mock_get.return_value = _mock_response({ "symbol": "IBM", "quarter": "2024Q1", "transcript": "Operator: Good afternoon. CEO: Revenue grew 5%." }) text = fetch_transcript("IBM", "2024Q1") assert "Revenue grew 5%" in text @patch("ingestion.transcript._next_key", return_value="test-key") @patch("ingestion.transcript.httpx.get") def test_fetch_transcript_rate_limited_returns_empty(mock_get, mock_key): mock_get.return_value = _mock_response({ "Information": "Thank you for using Alpha Vantage! Our standard API rate limit is 25 requests per day." }) assert fetch_transcript("AAPL", "2024Q4") == "" @patch("ingestion.transcript._next_key", return_value="test-key") @patch("ingestion.transcript.httpx.get") def test_fetch_transcript_http_error_returns_empty(mock_get, mock_key): mock_get.side_effect = Exception("connection error") assert fetch_transcript("AAPL", "2024Q4") == "" def test_parse_transcript_list(): data = { "transcript": [ {"speaker": "CEO", "content": "Hello world"}, {"speaker": "CFO", "content": "Numbers here"}, ] } result = _parse_transcript(data) assert "CEO: Hello world" in result assert "CFO: Numbers here" in result def test_parse_transcript_string(): data = {"transcript": "Plain text transcript"} assert _parse_transcript(data) == "Plain text transcript" def test_parse_transcript_missing_key(): assert _parse_transcript({}) == "" def test_parse_transcript_null_value(): assert _parse_transcript({"transcript": None}) == "" @patch("ingestion.transcript._next_key", return_value="test-key") @patch("ingestion.transcript.httpx.get") def test_fetch_transcript_note_key_returns_empty(mock_get, mock_key): mock_get.return_value = _mock_response({ "Note": "Thank you for using Alpha Vantage! This is the standard API note." }) assert fetch_transcript("AAPL", "2024Q4") == ""