SilverElixir commited on
Commit
de2ce9c
·
1 Parent(s): 4ec5697

TikTok music: retry send_audio without thumbnail on failure

Browse files
Files changed (1) hide show
  1. tests/test_bot_tiktok.py +45 -0
tests/test_bot_tiktok.py CHANGED
@@ -1202,6 +1202,51 @@ def test_send_tiktok_music_keeps_one_word_track_title():
1202
  assert sent.get("performer") == "Imagine Dragons"
1203
 
1204
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1205
  def test_single_video_status_deleted_after_music():
1206
  # Статус живёт и во время скачивания музыки тоже — сносится только после неё, а не до.
1207
  import lumen_tiktok_flow
 
1202
  assert sent.get("performer") == "Imagine Dragons"
1203
 
1204
 
1205
+ def test_send_tiktok_music_retries_without_thumbnail_on_failure():
1206
+ # Жирная обложка роняет send_audio целиком — повторяем без неё, трек важнее картинки.
1207
+ import lumen_tiktok_flow
1208
+ incoming = _FakeIncomingMessage(999455)
1209
+ incoming.message_id = 1
1210
+ incoming.from_user = SimpleNamespace(language_code="ru")
1211
+ attempts = []
1212
+
1213
+ class _FlakyAudioBot:
1214
+ async def send_audio(self, **kwargs):
1215
+ attempts.append(kwargs)
1216
+ if kwargs.get("thumbnail") is not None:
1217
+ raise RuntimeError("thumbnail too big")
1218
+ return SimpleNamespace()
1219
+
1220
+ async def fake_download(session, url, headers=None):
1221
+ return b"fake-bytes"
1222
+
1223
+ def fake_write_tags(path, title, artist, cover):
1224
+ pass
1225
+
1226
+ media_data = {
1227
+ "music": "https://tikwm.com/song.mp3",
1228
+ "music_info": {"title": "Song", "author": "Auth", "cover": "https://tikwm.com/cover.jpg"},
1229
+ "author": {"nickname": "Nick", "unique_id": "@nick"},
1230
+ }
1231
+ original_download = bot._download_url_bin
1232
+ original_write_tags = bot._write_mp3_tags
1233
+ original_bot = bot.bot
1234
+ bot._download_url_bin = fake_download
1235
+ bot._write_mp3_tags = fake_write_tags
1236
+ bot.bot = _FlakyAudioBot()
1237
+ try:
1238
+ asyncio.run(lumen_tiktok_flow._send_tiktok_music(None, media_data, incoming, "Nick", {}))
1239
+ assert len(attempts) == 2
1240
+ assert attempts[0].get("thumbnail") is not None
1241
+ assert attempts[1].get("thumbnail") is None
1242
+ assert attempts[1].get("title") == "Song"
1243
+ finally:
1244
+ bot._download_url_bin = original_download
1245
+ bot._write_mp3_tags = original_write_tags
1246
+ bot.bot = original_bot
1247
+ bot.chat_state.pop(999455, None)
1248
+
1249
+
1250
  def test_single_video_status_deleted_after_music():
1251
  # Статус живёт и во время скачивания музыки тоже — сносится только после неё, а не до.
1252
  import lumen_tiktok_flow