import logging import unittest from unittest.mock import AsyncMock from app.netease_resolver import NeteaseResolver class NeteaseResolverTests(unittest.IsolatedAsyncioTestCase): def setUp(self): self.resolver = NeteaseResolver(logging.getLogger("test-netease")) async def test_rejects_trial_audio_instead_of_playing_preview(self): self.resolver._fetch_player_entry = AsyncMock(return_value={ "url": "https://example.test/trial.mp3", "freeTrialInfo": {"start": 0, "end": 15000}, }) self.resolver._probe_url = AsyncMock(return_value="https://example.test/trial.mp3") result = await self.resolver.resolve({"id": "123456", "name": "VIP歌曲"}) self.assertIsNone(result) self.assertEqual(self.resolver.last_error_code, "preview_only") self.resolver._probe_url.assert_not_awaited() async def test_uses_authenticated_full_player_url(self): self.resolver.update_auth("valid-cookie") self.resolver._fetch_player_entry = AsyncMock(return_value={ "url": "https://example.test/full.mp3", "freeTrialInfo": None, "freeTrialPrivilege": {"resConsumable": False, "userConsumable": False}, }) self.resolver._probe_url = AsyncMock(return_value="https://cdn.test/full.mp3") result = await self.resolver.resolve({"id": "123456", "name": "VIP歌曲"}) self.assertEqual(result["url"], "https://cdn.test/full.mp3") self.assertEqual(result["source"], "netease.player.auth") if __name__ == "__main__": unittest.main()