from __future__ import annotations from pathlib import Path import pytest from yt_shorts_downloader import api from yt_shorts_downloader.exceptions import InvalidSessionError, InvalidUrlError from yt_shorts_downloader.models import DownloadedVideo, SessionValidation def _build_valid_session_validation(path: Path) -> SessionValidation: return SessionValidation(True, True, True, True, str(path)) def test_download_returns_binary_mp4(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: expected_content = b'mp4-binary-content' def fake_validate_session_file(path: Path) -> SessionValidation: return _build_valid_session_validation(path) def fake_download_video(*, url: str, output_dir: Path, session_path: Path) -> Path: del url, session_path downloaded_file = output_dir / 'video.mp4' downloaded_file.write_bytes(expected_content) return downloaded_file monkeypatch.setattr(api, 'validate_session_file', fake_validate_session_file) monkeypatch.setattr(api, 'download_video', fake_download_video) downloaded_video = api.download( 'https://youtube.com/shorts/example', session_path='cookies.txt', ) assert downloaded_video == DownloadedVideo( filename='video.mp4', content=expected_content, ) def test_download_to_path_returns_path_from_downloader(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: expected_path = tmp_path / 'video.mp4' def fake_validate_session_file(path: Path) -> SessionValidation: return _build_valid_session_validation(path) def fake_download_video(*, url: str, output_dir: Path, session_path: Path) -> Path: del url, session_path expected_path.write_bytes(b'mp4') return output_dir / expected_path.name monkeypatch.setattr(api, 'validate_session_file', fake_validate_session_file) monkeypatch.setattr(api, 'download_video', fake_download_video) downloaded_path = api.download_to_path( 'https://youtube.com/shorts/example', session_path='cookies.txt', output_dir=tmp_path, ) assert downloaded_path == expected_path def test_download_rejects_invalid_url() -> None: with pytest.raises(InvalidUrlError): api.download('https://example.com/watch?v=1', session_path='cookies.txt') def test_download_rejects_invalid_session(monkeypatch: pytest.MonkeyPatch) -> None: def fake_validate_session_file(path: Path) -> SessionValidation: del path return SessionValidation(False, False, False, False, 'bad session') monkeypatch.setattr(api, 'validate_session_file', fake_validate_session_file) with pytest.raises(InvalidSessionError, match='bad session'): api.download('https://youtube.com/shorts/example', session_path='cookies.txt')