import sys import unittest from pathlib import Path from unittest.mock import MagicMock, mock_open, patch sys.path.insert(0, str(Path(__file__).parent.parent.parent)) from app.services.upload_post import UploadPostService _CONFIG_BASE = { "upload_post_enabled": True, "upload_post_api_key": "test-key", "upload_post_username": "testuser", "upload_post_platforms": ["tiktok", "instagram", "youtube"], "upload_post_auto_upload": True, "upload_post_youtube_privacy_status": "unlisted", } def _mock_response(success=True): r = MagicMock() r.json.return_value = {"success": success, "request_id": "abc123"} r.raise_for_status = MagicMock() return r def _get(data, key): for k, v in data: if k == key: return v return None def _get_all(data, key): return [v for k, v in data if k == key] def _has_key(data, key): return any(k == key for k, v in data) class TestUploadPostYouTube(unittest.TestCase): @patch("app.services.upload_post.config.app", _CONFIG_BASE) @patch("app.services.upload_post.os.path.exists", return_value=True) @patch("builtins.open", mock_open(read_data=b"fake")) @patch("app.services.upload_post.requests.post") def test_youtube_fields_en_payload(self, mock_post, _exists): mock_post.return_value = _mock_response() svc = UploadPostService() svc.upload_video("/fake/v.mp4", "Título", youtube_extra={ "youtube_title": "Mi Short", "youtube_description": "Descripción", "tags": ["ia", "shorts"], "privacyStatus": "unlisted", }) data = mock_post.call_args[1]["data"] self.assertEqual(_get(data, "youtube_title"), "Mi Short") self.assertEqual(_get(data, "youtube_description"), "Descripción") self.assertEqual(_get_all(data, "tags[]"), ["ia", "shorts"]) self.assertEqual(_get(data, "privacyStatus"), "unlisted") self.assertEqual(_get(data, "containsSyntheticMedia"), "true") @patch("app.services.upload_post.config.app", _CONFIG_BASE) @patch("app.services.upload_post.os.path.exists", return_value=True) @patch("builtins.open", mock_open(read_data=b"fake")) @patch("app.services.upload_post.requests.post") def test_contains_synthetic_media_siempre_true(self, mock_post, _exists): mock_post.return_value = _mock_response() svc = UploadPostService() svc.upload_video("/fake/v.mp4", "T", youtube_extra={"containsSyntheticMedia": False}) data = mock_post.call_args[1]["data"] self.assertEqual(_get(data, "containsSyntheticMedia"), "true") @patch("app.services.upload_post.config.app", { **_CONFIG_BASE, "upload_post_platforms": ["tiktok", "instagram"], }) @patch("app.services.upload_post.os.path.exists", return_value=True) @patch("builtins.open", mock_open(read_data=b"fake")) @patch("app.services.upload_post.requests.post") def test_tiktok_instagram_sin_youtube_fields(self, mock_post, _exists): mock_post.return_value = _mock_response() svc = UploadPostService() svc.upload_video("/fake/v.mp4", "T") data = mock_post.call_args[1]["data"] self.assertFalse(_has_key(data, "youtube_title")) self.assertFalse(_has_key(data, "containsSyntheticMedia")) self.assertFalse(_has_key(data, "privacyStatus")) @patch("app.services.upload_post.config.app", { **_CONFIG_BASE, "upload_post_platforms": ["tiktok"], }) @patch("app.services.upload_post.os.path.exists", return_value=True) @patch("builtins.open", mock_open(read_data=b"fake")) @patch("app.services.upload_post.requests.post") def test_youtube_extra_ignorado_si_youtube_no_en_platforms(self, mock_post, _exists): mock_post.return_value = _mock_response() svc = UploadPostService() svc.upload_video("/fake/v.mp4", "T", youtube_extra={"youtube_title": "irrelevante"}) data = mock_post.call_args[1]["data"] self.assertFalse(_has_key(data, "youtube_title")) @patch("app.services.upload_post.config.app", _CONFIG_BASE) @patch("app.services.upload_post.os.path.exists", return_value=True) @patch("builtins.open", mock_open(read_data=b"fake")) @patch("app.services.upload_post.requests.post") def test_endpoint_y_platform_format_correcto(self, mock_post, _exists): mock_post.return_value = _mock_response() svc = UploadPostService() svc.upload_video("/fake/v.mp4", "T") call_url = mock_post.call_args[0][0] self.assertTrue(call_url.endswith("/api/upload"), f"Endpoint incorrecto: {call_url}") data = mock_post.call_args[1]["data"] platforms = _get_all(data, "platform[]") self.assertIn("tiktok", platforms) self.assertIn("instagram", platforms) self.assertIn("youtube", platforms) if __name__ == "__main__": unittest.main()