"""drive_uploader 모듈 테스트"""

from unittest.mock import MagicMock, patch

import pytest

from youtube_pipeline.drive_uploader import (
    _safe_filename,
    build_summary_markdown,
    build_transcript_markdown,
    upload_markdown,
)


class TestSafeFilename:
    def test_removes_special_chars(self):
        assert "/" not in _safe_filename("a/b\\c:d*e?f")
        assert "\\" not in _safe_filename("a/b\\c:d*e?f")

    def test_truncates_to_50(self):
        long_title = "x" * 100
        assert len(_safe_filename(long_title)) == 50


class TestBuildSummaryMarkdown:
    def test_contains_metadata(self):
        md = build_summary_markdown(
            summary="요약 내용",
            title="테스트 영상",
            channel_name="보험채널",
            video_id="vid123",
            published_at="2026-03-27T00:00:00Z",
            duration="PT10M",
            transcription_source="youtube_caption",
            transcript_length=5000,
        )
        assert "테스트 영상" in md
        assert "보험채널" in md
        assert "vid123" in md
        assert "5,000" in md
        assert "요약 내용" in md


class TestBuildTranscriptMarkdown:
    def test_contains_transcript(self):
        md = build_transcript_markdown(
            transcript="전사 원문 내용",
            title="테스트",
            channel_name="채널",
            video_id="vid1",
            published_at="2026-03-27",
            duration="PT5M",
            transcription_source="whisper_stt",
        )
        assert "전사 원문 내용" in md
        assert "전사 원문" in md


class TestUploadMarkdown:
    @patch("youtube_pipeline.drive_uploader._get_drive_service")
    def test_skips_duplicate(self, mock_service_fn):
        mock_service = MagicMock()
        mock_service_fn.return_value = mock_service

        # _find_or_create_folder가 호출되면 폴더 ID 반환
        # 중복 파일 존재 시뮬레이션
        mock_files = MagicMock()
        mock_list = MagicMock()
        mock_list.execute.side_effect = [
            {"files": [{"id": "folder1"}]},  # 04_유튜브요약
            {"files": [{"id": "folder2"}]},  # 채널 폴더
            {
                "files": [
                    {
                        "id": "existing",
                        "webViewLink": "https://drive.google.com/existing",
                    }
                ]
            },  # 중복 파일
        ]
        mock_files.list.return_value = mock_list
        mock_service.files.return_value = mock_files

        result = upload_markdown("내용", "채널", "제목", "2026-03-27", "_요약")
        assert "existing" in result
