f13d1507ad
Docker Image CI / build (pull_request) Has been cancelled
Issue #13: data["html"]["title"] was embedded into the debug HTML of /post/html without escaping; title never passes through bleach, so a post whose generated title carries markup (e.g. a poll question) was a reflected XSS under ?debug=true. Escape it with html.escape, same as raw_message. Add a regression test with a <script> payload in a poll question. Issue #17: a bare 'pytest' from the repo root failed 22 tests because the config in tests/pytest.ini was not picked up (asyncio_mode lost, .venv collected) and every test module polluted sys.modules['config'] at import time. Move the config to a root pytest.ini with testpaths=tests, and centralize the sys.path bootstrap + config mock in tests/conftest.py, which pytest imports before any test module. Drop the per-module preambles. Closes #13, closes #17 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
92 lines
3.7 KiB
Python
92 lines
3.7 KiB
Python
# flake8: noqa
|
|
# pylint: disable=broad-exception-raised, raise-missing-from, too-many-arguments, redefined-outer-name
|
|
# pylint: disable=multiple-statements, logging-fstring-interpolation, trailing-whitespace, line-too-long
|
|
# pylint: disable=broad-exception-caught, missing-function-docstring, missing-class-docstring
|
|
# pylint: disable=f-string-without-interpolation, protected-access, wrong-import-position
|
|
# pylance: disable=reportMissingImports, reportMissingModuleSource
|
|
|
|
import unittest
|
|
from unittest.mock import MagicMock
|
|
|
|
from pyrogram.types import Message
|
|
from post_parser import PostParser
|
|
|
|
class TestPostParserGetAuthorInfo(unittest.TestCase):
|
|
def setUp(self):
|
|
self.client_mock = MagicMock()
|
|
self.parser = PostParser(self.client_mock)
|
|
|
|
def _mock_message(self, sender_chat=None, from_user=None):
|
|
message = MagicMock(spec=Message)
|
|
message.sender_chat = sender_chat
|
|
message.from_user = from_user
|
|
return message
|
|
|
|
def test_sender_chat_with_username(self):
|
|
sender_chat = MagicMock()
|
|
sender_chat.title = 'Test Channel'
|
|
sender_chat.username = 'testchannel'
|
|
message = self._mock_message(sender_chat=sender_chat)
|
|
self.assertEqual(self.parser._get_author_info(message), 'Test Channel (@testchannel)')
|
|
|
|
def test_sender_chat_without_username(self):
|
|
sender_chat = MagicMock()
|
|
sender_chat.title = 'No Username Channel'
|
|
sender_chat.username = None
|
|
message = self._mock_message(sender_chat=sender_chat)
|
|
self.assertEqual(self.parser._get_author_info(message), 'No Username Channel')
|
|
|
|
def test_sender_chat_empty_title(self):
|
|
sender_chat = MagicMock()
|
|
sender_chat.title = None
|
|
sender_chat.username = 'testchannel'
|
|
message = self._mock_message(sender_chat=sender_chat)
|
|
self.assertEqual(self.parser._get_author_info(message), '@testchannel')
|
|
|
|
def test_from_user_with_username(self):
|
|
from_user = MagicMock()
|
|
from_user.first_name = 'John'
|
|
from_user.last_name = 'Doe'
|
|
from_user.username = 'johndoe'
|
|
message = self._mock_message(from_user=from_user)
|
|
self.assertEqual(self.parser._get_author_info(message), 'John Doe (@johndoe)')
|
|
|
|
def test_from_user_without_username(self):
|
|
from_user = MagicMock()
|
|
from_user.first_name = 'Jane'
|
|
from_user.last_name = 'Smith'
|
|
from_user.username = None
|
|
message = self._mock_message(from_user=from_user)
|
|
self.assertEqual(self.parser._get_author_info(message), 'Jane Smith')
|
|
|
|
def test_from_user_only_first_name(self):
|
|
from_user = MagicMock()
|
|
from_user.first_name = 'Alice'
|
|
from_user.last_name = None
|
|
from_user.username = None
|
|
message = self._mock_message(from_user=from_user)
|
|
self.assertEqual(self.parser._get_author_info(message), 'Alice')
|
|
|
|
def test_from_user_only_last_name(self):
|
|
from_user = MagicMock()
|
|
from_user.first_name = None
|
|
from_user.last_name = 'Brown'
|
|
from_user.username = None
|
|
message = self._mock_message(from_user=from_user)
|
|
self.assertEqual(self.parser._get_author_info(message), 'Brown')
|
|
|
|
def test_from_user_empty_names(self):
|
|
from_user = MagicMock()
|
|
from_user.first_name = None
|
|
from_user.last_name = None
|
|
from_user.username = None
|
|
message = self._mock_message(from_user=from_user)
|
|
self.assertEqual(self.parser._get_author_info(message), 'Unknown author')
|
|
|
|
def test_no_sender_chat_no_from_user(self):
|
|
message = self._mock_message(sender_chat=None, from_user=None)
|
|
self.assertEqual(self.parser._get_author_info(message), 'Unknown author')
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|