From 30ab46e21fddc50cc683e550f8c191312fb4ef1f Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Thu, 17 Apr 2025 20:05:04 +0300 Subject: [PATCH] Refactor tests --- tests/test_postparser_gen_title.py | 301 ++++++++++++++--------------- 1 file changed, 141 insertions(+), 160 deletions(-) diff --git a/tests/test_postparser_gen_title.py b/tests/test_postparser_gen_title.py index 762d43e..d440cb7 100644 --- a/tests/test_postparser_gen_title.py +++ b/tests/test_postparser_gen_title.py @@ -43,33 +43,28 @@ class TestPostParserGenerateTitle(unittest.TestCase): return message + def gen_title(self, text): + message = self._create_mock_message(text=text) + return self.parser._generate_title(message) + + def gen_media_title(self, media): + message = self._create_mock_message(media=media) + return self.parser._generate_title(message) + def test_generate_title_media_photo(self): - message = self._create_mock_message(media=MessageMediaType.PHOTO) - self.assertEqual(self.parser._generate_title(message), "πŸ“· Photo") - + self.assertEqual(self.gen_media_title(MessageMediaType.PHOTO), "πŸ“· Photo") def test_generate_title_media_video(self): - message = self._create_mock_message(media=MessageMediaType.VIDEO) - self.assertEqual(self.parser._generate_title(message), "πŸŽ₯ Video") - + self.assertEqual(self.gen_media_title(MessageMediaType.VIDEO), "πŸŽ₯ Video") def test_generate_title_media_animation(self): - message = self._create_mock_message(media=MessageMediaType.ANIMATION) - self.assertEqual(self.parser._generate_title(message), "🎞 GIF") - + self.assertEqual(self.gen_media_title(MessageMediaType.ANIMATION), "🎞 GIF") def test_generate_title_media_audio(self): - message = self._create_mock_message(media=MessageMediaType.AUDIO) - self.assertEqual(self.parser._generate_title(message), "🎡 Audio") - + self.assertEqual(self.gen_media_title(MessageMediaType.AUDIO), "🎡 Audio") def test_generate_title_media_voice(self): - message = self._create_mock_message(media=MessageMediaType.VOICE) - self.assertEqual(self.parser._generate_title(message), "🎀 Voice") - + self.assertEqual(self.gen_media_title(MessageMediaType.VOICE), "🎀 Voice") def test_generate_title_media_video_note(self): - message = self._create_mock_message(media=MessageMediaType.VIDEO_NOTE) - self.assertEqual(self.parser._generate_title(message), "πŸ“± Video circle") - + self.assertEqual(self.gen_media_title(MessageMediaType.VIDEO_NOTE), "πŸ“± Video circle") def test_generate_title_media_sticker(self): - message = self._create_mock_message(media=MessageMediaType.STICKER) - self.assertEqual(self.parser._generate_title(message), "🎯 Sticker") + self.assertEqual(self.gen_media_title(MessageMediaType.STICKER), "🎯 Sticker") def test_generate_title_media_pdf_document(self): message = self._create_mock_message(media=MessageMediaType.DOCUMENT, document_mime_type='application/pdf') @@ -166,86 +161,54 @@ class TestPostParserGenerateTitle(unittest.TestCase): self.assertEqual(self.parser._generate_title(message), "Π–ΠΈΠ·Π½ΡŒ Π½Π° обоях") #downcase - def test_generate_title_long_text_trimming_with_spaces(self): - #cut_at = 37 - #max_extra = 15 - #limit = cut_at + max_extra # 52 + def test_generate_title_long_text_trimming_exact_37(self): + text = "This text is exactly thirty-seven chars" + self.assertEqual(self.gen_title(text), text) - # --- Test Cases Based on Correct Logic --- + def test_generate_title_long_text_trimming_38_no_space(self): + text = "This text is exactly thirty-seven charsX" + self.assertEqual(self.gen_title(text), text) - # 1. Length <= cut_at (37) -> No trim - text = "This text is exactly thirty-seven chars" # len 37 - message = self._create_mock_message(text=text) - self.assertEqual(self.parser._generate_title(message), text) + def test_generate_title_long_text_trimming_space_at_37(self): + text = "This text is exactly thirty-seven chars next" + self.assertEqual(self.gen_title(text), "This text is exactly thirty-seven chars...") - # 2. Length = 38, no space in check range -> NO Trim (cut index == len) - text = "This text is exactly thirty-seven charsX" # len 38 - message = self._create_mock_message(text=text) - self.assertEqual(self.parser._generate_title(message), text) + def test_generate_title_long_text_trimming_space_at_43(self): + text = "This text is quite a bit longer now space_here_herehere" + self.assertEqual(self.gen_title(text), "This text is quite a bit longer now space_here_hereh...") - # 3. Space found within range [cut_at, limit) - # 3a. Space exactly at cut_at (index 37) - text = "This text is exactly thirty-seven chars next" # len 42. Space at 37. - message = self._create_mock_message(text=text) - # Loop range(37, 42) -> i=37. first_line[37]==' '. Break. ext_cut=37. Slice [:37]. - self.assertEqual(self.parser._generate_title(message), "This text is exactly thirty-seven chars...") + def test_generate_title_long_text_trimming_space_at_51(self): + text = "This is fifty-one characters long with the space1 here X" + self.assertEqual(self.gen_title(text), "This is fifty-one characters long with the space1...") - # 3b. - text = "This text is quite a bit longer now space_here_herehere" - message = self._create_mock_message(text=text) - # Loop range(37, 49). Finds space at i=43. Breaks. ext_cut=43. Slice [:43]. - self.assertEqual(self.parser._generate_title(message), "This text is quite a bit longer now space_here_hereh...") + def test_generate_title_long_text_trimming_space_at_51_alt(self): + text = "This is fifty-one chara the space1 here1 X" + self.assertEqual(self.gen_title(text), "This is fifty-one chara the space1 here1...") - # 3c. Space exactly at limit - 1 (index 51) - text = "This is fifty-one characters long with the space1 here X" # len 54. Space at 51. - message = self._create_mock_message(text=text) - # Loop range(37, 52). Finds space at i=51. Breaks. ext_cut=51. Slice [:51]. - self.assertEqual(self.parser._generate_title(message), "This is fifty-one characters long with the space1...") + def test_generate_title_long_text_trimming_no_space_cut_at_48(self): + text = "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfsdlfijoirukjvnsdkjvskufh" + self.assertEqual(self.gen_title(text), "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfsdl...") - # 3c. Space exactly at limit - 1 (index 51) - text = "This is fifty-one chara the space1 here1 X" # len 54. Space at 51. - message = self._create_mock_message(text=text) - # Loop range(37, 52). Finds space at i=51. Breaks. ext_cut=51. Slice [:51]. - self.assertEqual(self.parser._generate_title(message), "This is fifty-one chara the space1 here1...") + def test_generate_title_long_text_trimming_no_space_cut_at_49(self): + text = "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfs" + self.assertEqual(self.gen_title(text), "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfs") - # 4. No space found within range [cut_at, limit) - # 4a. Length > cut_at, Length < limit. No space in [cut_at, len). -> Cut at len-1 - text = "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfsdlfijoirukjvnsdkjvskufh" # len 49. cut_at=37. limit=52. - message = self._create_mock_message(text=text) - # Loop range(37, 49). No space. Finishes. ext_cut=48. Slice [:48]. - self.assertEqual(self.parser._generate_title(message), "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfsdl...") + def test_generate_title_long_text_trimming_no_space_cut_at_51(self): + text = "ThisIsAnEvenLongerWordWithoutAnySpacesAndDefinitelyMoreThan52Chars" + self.assertEqual(self.gen_title(text), "ThisIsAnEvenLongerWordWithoutAnySpacesAndDefinitelyM...") - text = "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfs" # len 49. cut_at=37. limit=52. - message = self._create_mock_message(text=text) - self.assertEqual(self.parser._generate_title(message), "JGHJHKJHKJDHfushdkjfskjdfhnksjdvnskjdnkjsdfjksdhfs") - - # 4b. Length >= limit. No space in [cut_at, limit). -> Cut at limit-1 = 51 - text = "ThisIsAnEvenLongerWordWithoutAnySpacesAndDefinitelyMoreThan52Chars" # len 66. cut_at=37. limit=52. - message = self._create_mock_message(text=text) - # Loop range(37, 52). No space. Finishes. ext_cut=51. Slice [:51]. - self.assertEqual(self.parser._generate_title(message), "ThisIsAnEvenLongerWordWithoutAnySpacesAndDefinitelyM...") - - # 5. Trailing space/punctuation removal check - # 5a. Space found, cut segment ends with space/punct - text = "This text is quite a bit longer now, space .,;: here" # len 54. Space at 43. - message = self._create_mock_message(text=text) - # Loop range(37, 54). Finds space at i=43. Breaks. ext_cut=43. Slice [:43] is "This text is quite a bit longer now, space ". - # re.sub removes trailing " .,;: ". Result "This text is quite a bit longer now, space". - self.assertEqual(self.parser._generate_title(message), "This text is quite a bit longer now, space...") + def test_generate_title_long_text_trimming_trailing_punct(self): + text = "This text is quite a bit longer now, space .,;: here" + self.assertEqual(self.gen_title(text), "This text is quite a bit longer now, space...") def test_generate_title_break_word_after_limit(self): - # Test with a specific text example from the user's query - text = "На ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ Π½Π΅Π΄Π΅Π»Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» своим подписчикам Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π±Ρ‹ ΠΎΠ½ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ государствСнного сСрвиса" - message = self._create_mock_message(text=text) - expected_title = "На ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ Π½Π΅Π΄Π΅Π»Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» своим подписчикам..." - self.assertEqual(self.parser._generate_title(message), expected_title) + message = self._create_mock_message(text="На ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ Π½Π΅Π΄Π΅Π»Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» своим подписчикам Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π±Ρ‹ ΠΎΠ½ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡƒΠ»") + self.assertEqual(self.parser._generate_title(message), "На ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ Π½Π΅Π΄Π΅Π»Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» своим подписчикам...") def test_generate_title_long_text_no_space_trimming(self): long_text = "Thisisaverylonglineoftextthatdefinitelyexceedsthemaximumlengthallowedforatitlesoitshouldbetrimmedatthelimitbecausehasnospaces." message = self._create_mock_message(text=long_text) - # Corrected expected title based on new logic: cut at index 52 (min(52, len)) -> slice[:52] - expected_title = "Thisisaverylonglineoftextthatdefinitelyexceedsthemax..." - self.assertEqual(self.parser._generate_title(message), expected_title) + self.assertEqual(self.parser._generate_title(message), "Thisisaverylonglineoftextthatdefinitelyexceedsthemax...") def test_generate_title_text_with_only_html_and_urls(self): message = self._create_mock_message(text="Link name https://another.link") @@ -301,82 +264,100 @@ class TestPostParserGenerateTitle(unittest.TestCase): message = self._create_mock_message(web_page=web_page_mock) # Text is whitespace only self.assertEqual(self.parser._generate_title(message), "πŸ”— Web page title") - def test_generate_title_punctuation_removal(self): - """Test removing punctuation marks from the end of titles.""" - test_cases = { - # ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ символы - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚,": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚;": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚:": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚!": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚!", - - # ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ символов - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚...": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.,;:": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.!": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.!", - "Π‘Ρ‚Ρ€ΠΎΠΊΠ°.....": "Π‘Ρ‚Ρ€ΠΎΠΊΠ°", - - # Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π½Π΅ Π² ΠΊΠΎΠ½Ρ†Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ - "ΠŸΡ€ΠΈ.Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ.Π²Π΅Ρ‚", - "ΠŸΡ€ΠΈ,Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ,Π²Π΅Ρ‚", - "ΠŸΡ€ΠΈ;Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ;Π²Π΅Ρ‚", - "ΠŸΡ€ΠΈ:Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ:Π²Π΅Ρ‚", - "ΠŸΡ€ΠΈ!Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ!Π²Π΅Ρ‚", - "ΠŸΡ€ΠΈ\"Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ\"Π²Π΅Ρ‚", - "ΠŸΡ€ΠΈ'Π²Π΅Ρ‚": "ΠŸΡ€ΠΈ'Π²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - - # Π‘Ρ‚Ρ€ΠΎΠΊΠΈ с ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ послС ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ†ΠΈΠΈ - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚. ": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - - # Π―Π·Ρ‹ΠΊΠΈ - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π½Π° русском.": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π½Π° русском", - "Hello.": "Hello", - "Hello,": "Hello", - "ΠŸΡ€ΠΈΠ²Ρ–Ρ‚ ΡƒΠΊΡ€Π°Ρ—Π½ΡΡŒΠΊΠΎΡŽ.": "ΠŸΡ€ΠΈΠ²Ρ–Ρ‚ ΡƒΠΊΡ€Π°Ρ—Π½ΡΡŒΠΊΠΎΡŽ", - "Hola en espaΓ±ol.": "Hola en espaΓ±ol", - - # Π¦ΠΈΡ„Ρ€Ρ‹ - "Число 123.": "Число 123", - - # ΠœΠ½ΠΎΠ³ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ тСкст - "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.\nКак Π΄Π΅Π»Π°?": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚", - - # Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ случаи с ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ - "ВСкст с \"ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ\".": "ВСкст с \"ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ\"", - "ВСкст с 'ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ' ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ.": "ВСкст с 'ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ' ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ", - "ВСкст с \"Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ 'ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ'\".": "ВСкст с \"Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ 'ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ'\"", - "Π¦ΠΈΡ‚Π°Ρ‚Π°: \"Π­Ρ‚ΠΎ Ρ†ΠΈΡ‚Π°Ρ‚Π°.\".": "Π¦ΠΈΡ‚Π°Ρ‚Π°: \"Π­Ρ‚ΠΎ Ρ†ΠΈΡ‚Π°Ρ‚Π°.\"", - - # Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ случаи - "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с восклицаниСм!": "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с восклицаниСм!", - "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с вопросом?": "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с вопросом?", - "Эллипсис...": "Эллипсис", - - "ΠšΠΎΠ½Π΅Ρ† тСкста.,;:": "ΠšΠΎΠ½Π΅Ρ† тСкста", - "Много Ρ‚ΠΎΡ‡Π΅ΠΊ....": "Много Ρ‚ΠΎΡ‡Π΅ΠΊ", - "Π Π°Π·Π½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ.,;": "Π Π°Π·Π½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ", - - # Π Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ - "Анонс ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ:": "Анонс ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ", - "Новый Ρ€Π΅Π»ΠΈΠ· v1.0!": "Новый Ρ€Π΅Π»ΠΈΠ· v1.0!", - "ВаТная информация!!!": "ВаТная информация!!!", - "Автор сказал: \"Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ\".": "Автор сказал: \"Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ\"", - "Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: function() { return true; }": "Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: function() { return true...", - - # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΊΡ€Π°Π΅Π²Ρ‹Π΅ случаи - "Π‘Ρ‚Π°Ρ‚ΡŒΡ...": "Π‘Ρ‚Π°Ρ‚ΡŒΡ", - "Вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹.": "Вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹", - "ΠšΠΎΠ½Π΅Ρ†,": "ΠšΠΎΠ½Π΅Ρ†", - } - - for input_text, expected_output in test_cases.items(): - message = self._create_mock_message(text=input_text) - title = self.parser._generate_title(message) - self.assertEqual(title, expected_output, f"Ошибка ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ '{input_text}': ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ '{title}', оТидалось '{expected_output}'") + def test_generate_title_punctuation_removal_dot(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚."), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚") + def test_generate_title_punctuation_removal_comma(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚,"), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚") + + def test_generate_title_punctuation_removal_semicolon(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚;"), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚") + + def test_generate_title_punctuation_removal_colon(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚:"), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚") + + def test_generate_title_punctuation_removal_exclamation(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚!"), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚!") + + def test_generate_title_punctuation_removal_ellipsis(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚..."), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚") + + def test_generate_title_punctuation_removal_combo(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚.,;:"), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚") + + def test_generate_title_punctuation_removal_dot_exclamation(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚.!"), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚.!") + + def test_generate_title_punctuation_removal_many_dots(self): + self.assertEqual(self.gen_title("Π‘Ρ‚Ρ€ΠΎΠΊΠ°....."), "Π‘Ρ‚Ρ€ΠΎΠΊΠ°") + + def test_generate_title_punctuation_removal_inner_punctuation_dot(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈ.Π²Π΅Ρ‚"), "ΠŸΡ€ΠΈ.Π²Π΅Ρ‚") + def test_generate_title_punctuation_removal_inner_punctuation_comma(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈ,Π²Π΅Ρ‚"), "ΠŸΡ€ΠΈ,Π²Π΅Ρ‚") + def test_generate_title_punctuation_removal_inner_punctuation_semicolon(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈ;Π²Π΅Ρ‚"), "ΠŸΡ€ΠΈ;Π²Π΅Ρ‚") + def test_generate_title_punctuation_removal_inner_punctuation_colon(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈ:Π²Π΅Ρ‚"), "ΠŸΡ€ΠΈ:Π²Π΅Ρ‚") + def test_generate_title_punctuation_removal_inner_punctuation_exclamation(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈ!Π²Π΅Ρ‚"), "ΠŸΡ€ΠΈ!Π²Π΅Ρ‚") + def test_generate_title_punctuation_removal_inner_punctuation_doublequote(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈ\"Π²Π΅Ρ‚"), "ΠŸΡ€ΠΈ\"Π²Π΅Ρ‚") + def test_generate_title_punctuation_removal_inner_punctuation_singlequote(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈ'Π²Π΅Ρ‚"), "ΠŸΡ€ΠΈ'Π²Π΅Ρ‚") + def test_generate_title_punctuation_removal_inner_punctuation_plain(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚"), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚") + + def test_generate_title_punctuation_removal_languages_ru(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π½Π° русском."), "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ Π½Π° русском") + def test_generate_title_punctuation_removal_languages_en(self): + self.assertEqual(self.gen_title("Hello."), "Hello") + def test_generate_title_punctuation_removal_languages_en_comma(self): + self.assertEqual(self.gen_title("Hello,"), "Hello") + def test_generate_title_punctuation_removal_languages_ua(self): + self.assertEqual(self.gen_title("ΠŸΡ€ΠΈΠ²Ρ–Ρ‚ ΡƒΠΊΡ€Π°Ρ—Π½ΡΡŒΠΊΠΎΡŽ."), "ΠŸΡ€ΠΈΠ²Ρ–Ρ‚ ΡƒΠΊΡ€Π°Ρ—Π½ΡΡŒΠΊΠΎΡŽ") + def test_generate_title_punctuation_removal_languages_es(self): + self.assertEqual(self.gen_title("Hola en espaΓ±ol."), "Hola en espaΓ±ol") + + def test_generate_title_punctuation_removal_quotes_double(self): + self.assertEqual(self.gen_title('ВСкст с "ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ".'), 'ВСкст с "ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ"') + def test_generate_title_punctuation_removal_quotes_single(self): + self.assertEqual(self.gen_title("ВСкст с 'ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ' ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ."), "ВСкст с 'ΠΎΠ΄ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ' ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ") + def test_generate_title_punctuation_removal_quotes_nested(self): + self.assertEqual(self.gen_title('ВСкст с "Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ \'ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ\'".'), 'ВСкст с "Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ \'ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ\'"') + def test_generate_title_punctuation_removal_quotes_citation(self): + self.assertEqual(self.gen_title('Π¦ΠΈΡ‚Π°Ρ‚Π°: "Π­Ρ‚ΠΎ Ρ†ΠΈΡ‚Π°Ρ‚Π°.".'), 'Π¦ΠΈΡ‚Π°Ρ‚Π°: "Π­Ρ‚ΠΎ Ρ†ΠΈΡ‚Π°Ρ‚Π°."') + + def test_generate_title_punctuation_removal_special_exclamation(self): + self.assertEqual(self.gen_title("ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с восклицаниСм!"), "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с восклицаниСм!") + def test_generate_title_punctuation_removal_special_question(self): + self.assertEqual(self.gen_title("ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с вопросом?"), "ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с вопросом?") + def test_generate_title_punctuation_removal_special_ellipsis(self): + self.assertEqual(self.gen_title("Эллипсис..."), "Эллипсис") + def test_generate_title_punctuation_removal_special_combo(self): + self.assertEqual(self.gen_title("ΠšΠΎΠ½Π΅Ρ† тСкста.,;:"), "ΠšΠΎΠ½Π΅Ρ† тСкста") + def test_generate_title_punctuation_removal_special_manydots(self): + self.assertEqual(self.gen_title("Много Ρ‚ΠΎΡ‡Π΅ΠΊ...."), "Много Ρ‚ΠΎΡ‡Π΅ΠΊ") + def test_generate_title_punctuation_removal_special_mix(self): + self.assertEqual(self.gen_title("Π Π°Π·Π½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ.,;"), "Π Π°Π·Π½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ") + + def test_generate_title_punctuation_removal_real_examples_announce(self): + self.assertEqual(self.gen_title("Анонс ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ:"), "Анонс ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ") + def test_generate_title_punctuation_removal_real_examples_release(self): + self.assertEqual(self.gen_title("Новый Ρ€Π΅Π»ΠΈΠ· v1.0!"), "Новый Ρ€Π΅Π»ΠΈΠ· v1.0!") + def test_generate_title_punctuation_removal_real_examples_info(self): + self.assertEqual(self.gen_title("ВаТная информация!!!"), "ВаТная информация!!!") + def test_generate_title_punctuation_removal_real_examples_author(self): + self.assertEqual(self.gen_title('Автор сказал: "Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ".'), 'Автор сказал: "Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ"') + def test_generate_title_punctuation_removal_real_examples_code(self): + self.assertEqual(self.gen_title("Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: function() { return true; }"), "Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: function() { return true...") + + def test_generate_title_punctuation_removal_edge_cases_article(self): + self.assertEqual(self.gen_title("Π‘Ρ‚Π°Ρ‚ΡŒΡ..."), "Π‘Ρ‚Π°Ρ‚ΡŒΡ") + def test_generate_title_punctuation_removal_edge_cases_qa(self): + self.assertEqual(self.gen_title("Вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹."), "Вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹") + def test_generate_title_punctuation_removal_edge_cases_end(self): + self.assertEqual(self.gen_title("ΠšΠΎΠ½Π΅Ρ†,"), "ΠšΠΎΠ½Π΅Ρ†") def test_generate_title_media_with_short_caption(self): """Media title should be used if caption is short (< 10 chars)."""